在创建react项目时,我们一般用create-react-app脚手架来搭建项目。
create-react-app对webpack的配置进行了封装并默认隐藏了配置文件。
当我们需要对webpack的配置进行扩展时,需要执行npm run eject
命名将配置文件暴露出来,然后在对配置文件进行扩展。
这种方式的缺点:
npm run eject
命名不可逆,一旦配置文件暴露后就不可再隐藏react-app-rewired是对create-react-app 进行自定义配置的社区解决方案。它不会直接去修改create-react-app的默认配置,而是在create-react-app配置的基础上进行扩展。
1.安装react-app-rewired
npm install react-app-rewired@2.0.2-next.0 --save-dev
2.在项目根目录中创建config-overrides.js
文件用于修改默认配置
/* config-overrides.js */
module.exports = function override(config, env) {
//do stuff with the webpack config...
return config;
}
3.修改 package.json 里的启动配置
/* package.json */
"scripts": {
- "start": "react-scripts start",
+ "start": "react-app-rewired start",
- "build": "react-scripts build",
+ "build": "react-app-rewired build",
- "test": "react-scripts test",
+ "test": "react-app-rewired test",
}
通过上面3步已经可以扩展webpack配置了,接下来就根据需求去配置即可。下面介绍我使用过的一些常见配置
yarn add @babel/plugin-proposal-decorators //修饰器
yarn add codebandits/react-app-rewire-css-modules sass-loader node-sass //css、sass模块化
yarn add babel-plugin-import //antd按需加载
yarn add react-app-rewire-less-modules //less模块化
const { injectBabelPlugin } = require('react-app-rewired');
const rewireCssModules = require('react-app-rewire-css-modules');
const rewireLess = require('react-app-rewire-less-modules')
const path = require('path')
function resolve (dir) {
return path.join(__dirname, '.', dir)
}
module.exports = function override(config, env) {
// do stuff with the webpack config...
//启用ES7的修改器语法(babel 7)
config = injectBabelPlugin(['@babel/plugin-proposal-decorators', { "legacy": true }], config) //{ "legacy": true }一定不能掉,否则报错
//css模块化
config = rewireCssModules(config, env);
//配置别名
config.resolve.alias = {
'@': resolve('src')
}
//antd按需加载
config = injectBabelPlugin(['import', { libraryName: 'antd', libraryDirectory: 'es', style: true }], config,);
//less模块化
config = rewireLess.withLoaderOptions({
javascriptEnabled: true,
modifyVars: {'@primary-color': '#1DA57A'},
})(config, env)
return config;
};
2018.12.24更新
今天看create-react-app文档时,发现脚手架已经支持css模块化,并不需要在额外的配置了,css模块化使用方法都是一致的(此功能适用于 react-scripts@2.0.0 及更高版本,注意只支持css,类似于less、stylus的模块化还是需要配置)。
2019.1.21更新
今天再来配置时发现报错了,原因是新的react-app-rewired@2.x
版本的关系。react-app-rewired删除所有方法的injectBabelPlugin,这些方法被移动到一个名为customize-cra
的新包中。解决办法是把react-app-rewired 进行降级或者按文档重新配置,可以参考这里。
参考链接: