第二章的配置基本已能达到正常的开发需求了。可是还有不少地方能够进行改善。javascript
React开发中不免要用到ES最新语法。例如经常使用的Decorators还在Stage 2阶段,Dynamic import还在Stage 3阶段。这些新的语法并没被@babel/preset-env
涵盖。所以咱们须要额外配置对应的babel插件。css
安装babel插件:java
@babel/plugin-proposal-decorators
@babel/plugin-proposal-class-properties
@babel/plugin-syntax-dynamic-import
配置.babelrc
文件:node
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": [
// 注意decorators插件要写在class-properties前面
// decorators插件须要配置legacy为true来兼容之前的装饰器写法
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose": true }],
"@babel/plugin-syntax-dynamic-import"
]
}
复制代码
咱们可使用sass来加强css的编程和抽象能力,使用postcss的autoprefixer
插件给css自动添加浏览器厂商前缀。react
安装:webpack
sass-loader
postcss-loader
autoprefixer
webpack.dev.js
的配置:git
// ...
module: {
rules: [
{
test: /\.scss$/,
// loader是从后往前加载的,postcss-loader得在sass-loader前面
use: ["style-loader", "css-loader", "postcss-loader", "sass-loader"]
},
// ...
]
},
// ...
复制代码
webpack.prod.js
的配置:es6
// ...
module: {
rules: [
{
test: /\.scss$/,
use: [
MiniCssExtractPlugin.loader,
"css-loader",
"postcss-loader",
"sass-loader"
]
},
// ...
]
},
// ...
复制代码
在项目根目录下建立postcss.config.js
文件:github
module.exports = {
plugins: [require("autoprefixer")]
};
复制代码
.babelrc
内配置的@babel/preset-env
能自动为项目打包必要的polyfill,postcss.config.js
内配置的autoprefixer
插件能自动为css添加必要的浏览器厂商前缀。它们是怎么肯定哪些polyfill还有哪些浏览器厂商前缀是必要添加的呢,毕竟不一样公司甚至不一样项目所要兼容的浏览器版本不同。有的项目没有任何兼容需求,那么项目应该少依赖一些polyfill,有些项目要兼容到IE浏览器,那就要添加更多的polyfill和浏览器厂商前缀。因此咱们须要配置.browserslistrc
来告诉这些打包工具咱们要兼容的浏览器范围。web
在项目根目录下建立.browserslistrc
文件:
> 1%
last 2 versions
not ie <= 8
复制代码
这个配置的大概意思是:市场份额大于1%的浏览器,最新的两个版本,排除IE8如下的浏览器。
.editorconfig
有些人喜欢用水平制表符缩进,而有些人喜欢用2个空格。由于使用的操做系统不一样,有些人换行符是LF,有些人是CRLF。虽然这些琐碎的东西能够在项目开发初期约定好,并设置到每一个开发人员编辑器格式化配置内。可是这样很麻烦。
咱们在项目根目录下建立.editorconfig
:
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
复制代码
这个配置告诉编辑器,当前项目的缩进用的是2个空格,换行用的是LF,并在每一个文件底部插入一行空行。编辑器看到项目内有.editorconfig
文件,就会按它的要求来格式化项目文件。
使用editorconfig的好处是,他能更细粒度的控制每一个项目甚至不一样文件类型的格式化风格,这样可让不一样的项目拥有不一样的格式化风格。
配置完后,编辑器须要在插件市场下载editorconfig插件。webstorm内部默认安装了该插件,因此能够不用下载。
ESLint能够校验咱们的代码风格和一些语法错误,在团队开发时,能够保证代码风格的一致性并及早发现一些错误。
ESLint不少时候会由于缺乏空格或逗号而报错,这些琐碎的错误会很恼人,所以咱们可使用prettier来帮助咱们来格式化代码。
安装:
eslint
eslint-loader
babel-eslint
eslint-config-airbnb
eslint-config-prettier
在安装eslint-config-airbnb
时,控制台会有warning,咱们须要根据它的warning将全部的peer dependency都安装好。
webpack.common.js
配置:
// ...
module: {
rules: [
{
enforce: "pre",
test: /\.jsx?$/,
include: path.resolve(__dirname, "src"),
use: "eslint-loader"
},
// ...
]
}
// ...
复制代码
根目录下添加.eslintrc.js
:
module.exports = {
root: true,
parser: "babel-eslint",
env: {
browser: true,
es6: true,
node: true
},
parserOptions: {
ecmaVersion: 6,
sourceType: "module"
},
extends: ["airbnb", "prettier"],
rules: {
"no-console": process.env.NODE_ENV === "production" ? "error" : "off",
"no-debugger": process.env.NODE_ENV === "production" ? "error" : "off"
}
};
复制代码
在package.json
内添加lint
precommit
两条脚本
// ...
"scripts": {
"start": "cross-env NODE_ENV=development webpack-dev-server --config webpack.dev.js",
"build": "cross-env NODE_ENV=production webpack --config webpack.prod.js",
"lint": "cross-env NODE_ENV=production eslint --ext .jsx --ext .js --fix ./src",
"precommit": "npm run lint"
},
// ...
复制代码
执行npm run lint
时,ESLint会检查./src
目录下的全部.js
.jsx
结尾的文件,并尽力修复一些问题。ESLint不能修复的问题会打印到控制台上,此时就要手动去修复问题了。
每次git提交代码前会先执行precommit
脚本,该脚本就是让ESLint检查代码,若是检查不经过就没法提交代码。这样能够保证代码仓库内的代码质量。想要precommit
脚本生效,须要安装husky
(哈士奇),并且咱们在脚本内使用“cross-env”来修改环境变量,因此得安装cross-env
。
安装:
husky
cross-env
推荐在编辑器内安装ESLint 插件,这样能在书写代码实就能看的ESLint的报错信息。安装ESLint插件后,它可能会在咱们不肯意它去检查的文件内报错,因此咱们添加.eslintignore
来告诉插件要跳过的检查文件与目录。
.eslintignore配置
node_modules
/dist
webpack.common.js
webpack.prod.js
webpack.dev.js
postcss.config.js
复制代码
同时推荐安装prettier插件,并配置编辑器在保存时自动格式化。
使用webpack-dev-server
开发React时,每次文件修改便会自动刷新页面。虽然这和传统的手动刷新页面相比方便了不少,可是在某些状况下还不够方便。就好比开发一个表单模态窗口时,刷新页面会致使模态窗口被关闭,而且表单内填写的信息丢失。
webpack的热更新就能解决这个痛点,它能在界面不刷新的状态下更新界面。
webpack4默认支持热更新,咱们只须要开启这个功能就能够。
在webpack.dev.js
内开启热更新:
// ...
devServer: {
hot: true, // 开启热更新
historyApiFallback: true
},
// ...
复制代码
咱们使用react-hot-loader
来支持React的热更新。
安装:
react-hot-loader
在.babelrc
添加react-hot-loader
提供的插件:
{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }],
["@babel/plugin-proposal-class-properties", { "loose": true }],
"@babel/plugin-syntax-dynamic-import",
"react-hot-loader/babel"
]
}
复制代码
注意这个插件的写法是react-hot-loader/babel
。
最后,修改App.jsx
内的代码。使用react-hot-loader
提供的高阶组件来装饰咱们的App
组件。
import React from "react";
// 导入hot函数
import { hot } from "react-hot-loader/root";
// ...
function App() {
return (
// ...
);
}
// 使用hot函数装饰App组件
export default hot(App);
复制代码
webpack4在production
模式下会开启Tree Shaking,可是须要注意如下几点
import
和 export
),被编译成CommonJS规范的模块不能被优化。package.json
文件内添加"sideEffects"
字段。该字段的值能够是模块名称数组,用来告诉webpack哪些模块是有负做用的。该字段的值也能够是false
,表示全部模块都没有反作用。被标识有反作用的模块不会被Tree Shaking。mode
设为"production"