DIY

本篇记录一下手动搭建 React 过程中遇到的问题 项目分别借助当下热门 🔥 的 Webpack | Vite | Snowpack 来搭建

项目地址 https://github.com/LuckyChou710/ReStart-FE/tree/main/react/react-ts-diy

需要的 vscode 插件 eslint | prettier

Webpack

typescript

安装 typescriptts-loader

后者用作 webpack 的 loader 用于将 ts --> js 的转换

安装完后使用 tsc --init 生成 tsconfig.json 文件

我这里开启了部分的配置 具体的每一项配置 可参考官方文档的说明

https://aka.ms/tsconfig.json

{
  "include": ["src", "types"] /*  */,
  "exclude": ["node_modules"],
  "compilerOptions": {
    "target": "ESNEXT" /* 直接输出为最新的 ES 标准 */,
    "module": "ESNEXT" /* 面向未来的 ESM 模块化 */,
    "lib": ["DOM", "DOM.Iterable", "ESNext"],
    "allowJs": false /* 不允许导入js文件 */,
    "jsx": "react-jsx" /* react17后 选择这个就好了 */,
    "outDir": "./build" /* 打包路径 */,
    "strict": true /* 开启严格模式 */,
    "noImplicitAny": true /* 不能用any类型 */,
    "moduleResolution": "node" /* 模块解析策略 这里我们使用node */,
    "baseUrl": "./" /* 配置根路径 比如下面的typeRoots和最上面的include exclude都会加上这个路径 */,
    "typeRoots": [
      "node_modules/@types",
      "types/*.d.ts"
    ] /* 默认会引入@types下的类型类型声明文件 可以配置这项加入一些自己定义的类型 */,
    "allowSyntheticDefaultImports": true /* 即使一个模块没有默认导入 也可以使用默认导入 */,
    "esModuleInterop": true /* https://zhuanlan.zhihu.com/p/148081795 */,
    "experimentalDecorators": true /* 开启装饰器语法 */,
    "skipLibCheck": false /* 跳过所有.d.ts文件的类型检查 */,
    "forceConsistentCasingInFileNames": true
  }
}

我们新建一个 types 目录 可以定义一些我们想定义的类型 例如

webpack

首先安装 webpack webpack-cli webpack-dev-server

  • webpack webpack 核心功能

  • webpack-cli webpack 命令行

  • webpack-dev-server 开发环境使用 方便调试

然后新建一个 config 文件夹 来编写 webpack 的配置文件

我们为开发环境和生产环境创建各自的配置文件 分别为 webpack.config.dev.jswebpack.config.prod.js

因为项目中 css 我使用了 scss 所以提前安装下 sass sass-loader css-loader style-loader

还有构建需要的 html-webpack-pluginclean-webpack-plugin

webpack.config.dev.js 的配置如下

webpack.config.prod.js 配置如下

因为没有涉及到太多的场景 我们的 prod 只比 dev 的多了一个 clean-webpack-plugin 插件的配置

你也可以使用 webpack-merge 这个库去抽取一些通用的配置

https://github.com/survivejs/webpack-merge

eslint

eslint 可以校验我们的代码 生成统一的风格

首先安装 eslint 然后在使用 eslint --init 生成 eslint 的配置

下面为作者的一些选择

做完这些后 项目的根目录下就会生成一个 .eslintrc.js 文件 内容如下

同时 附上上述操作后新增的依赖

prettier

安装 prettier 新建一个 prettier.config.js 文件 下面是我的一些配置

随后 写入一个 script 命令

执行这个命令 就可以格式化所有的代码 按照上述的规则

到此 我们的基本配置结束 随后安装必须的 react react-dom

然后创建如下的项目目录

FAQ

然而 当你还没启动项目的时候 离谱的事情就发生了

Cannot find module './app.module.scss' or its corresponding type declarations.

原因很简单 ts 不能把 app.module.scss 当成一个模块

而且我们也没有为它编写一个类型声明文件

解决的方法有两种

第一种是为每一个 scss 文件编写.d.ts 声明文件

例如我们的 app.module.scss 有如下内容

我们就可以编写一个 app.module.scss.d.ts 文件 为每一个选择器声明类型

这样就消除这个报错了 而且在引入的时候 会有友善的代码提示

第二种 是为 scss 文件编写全局的声明文件 我们在上面 ts 那一部分创建了 types 文件

里面就有我们对 scss 这些类型文件的定义

我们只需要在 tsconfig.json 中配置 typeRoots 把我们的 types 加进去就好了

eslint

eslint 也会有很多不兼容的地方

例如 我们的项目是 React17 版本 不必再引入 React 但是 eslint 会报错

然后一些等等的问题 我在下面罗列了

在.eslintrc.js 的 rules 中加入如下配置

yarn start 🎉 🎉 🎉 🎉 🎉

Vite

typescript

ts 安装 typescript 就好了 不需要 loader 了 配置同上

scss

安装 sass 也不需要其他的 loader 了

eslint | prettier 同上

vite

安装 vite @vitejs/plugin-react

在根目录下新建 vite.config.ts

内容如下

package.json 中写入 script

FAQ 同上

yarn dev 🎉 🎉 🎉 🎉 🎉

Snowpack

snowpack

其他的基础配置都类似 这里不再赘述

snowpack 有自己的生态 首先安装以下的包

  • snowpack

  • @snowpack/plugin-sass

  • @snowpack/plugin-react-refresh

  • @snowpack/plugin-typescript

通过名称 大致就可以知道它们各自的功能

snowpack 有自己的配置文件 snowpack.config.mjs

详细的配置参考官方

https://www.snowpack.dev/reference/configuration

yarn start 🎉 🎉 🎉 🎉 🎉

package.json 添加 script

Git

这里再补充一下对 git 提交信息的管控

我们需要引入 husky lint-stagedcommit-lint

接下来我们要添加 .lintstagedrc.json

接下来添加 commitlint.config.js

最后执行如下命令

执行完毕后将.husky/commit-msg 内容修改如下

package.json 中添加

至此 我们可以使用 yarn commit 的方式 提交 commit

也可以使用 git commit -m xxx 的形式

一但你的 commit 不规范 就会抛出异常

🎉 🎉 🎉

Last updated

Was this helpful?