DIY
本篇记录一下手动搭建 React 过程中遇到的问题 项目分别借助当下热门 🔥 的 Webpack | Vite | Snowpack 来搭建
项目地址 https://github.com/LuckyChou710/ReStart-FE/tree/main/react/react-ts-diy
需要的 vscode 插件 eslint | prettier
Webpack
typescript
安装 typescript 和 ts-loader
后者用作 webpack 的 loader 用于将 ts --> js 的转换
安装完后使用 tsc --init 生成 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.js 和 webpack.config.prod.js
因为项目中 css 我使用了 scss 所以提前安装下 sass sass-loader css-loader style-loader
还有构建需要的 html-webpack-plugin 和 clean-webpack-plugin
webpack.config.dev.js 的配置如下
webpack.config.dev.js 的配置如下webpack.config.prod.js 配置如下
webpack.config.prod.js 配置如下因为没有涉及到太多的场景 我们的 prod 只比 dev 的多了一个 clean-webpack-plugin 插件的配置
你也可以使用 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
详细的配置参考官方
yarn start 🎉 🎉 🎉 🎉 🎉
package.json 添加 script
Git
这里再补充一下对 git 提交信息的管控
我们需要引入 husky lint-staged 和 commit-lint
接下来我们要添加 .lintstagedrc.json
接下来添加 commitlint.config.js
最后执行如下命令
执行完毕后将.husky/commit-msg 内容修改如下
package.json 中添加
至此 我们可以使用 yarn commit 的方式 提交 commit

也可以使用 git commit -m xxx 的形式
一但你的 commit 不规范 就会抛出异常

🎉 🎉 🎉
Last updated
Was this helpful?