Create React App 中的 Webpack 优化
· 5 min read
Create React App 创建的工程,一段时间后,打包速度越来越慢。我对速度和打包体积做了初步的优化,本文记录大概过程。
优化方式
比较主流的优化方式有如下几种:
react-scripts提供了eject的方式,将其托管的webpack配置全部弹出。- 优点:完全掌控配置。
- 缺点:代码包复杂度增加,而且是与业务逻辑无关的配置。
- 自己维护一个包,替换
react-scripts- 优点:完全掌控配置,不会给业务代码包增加复杂度,且可以跨项目使用
- 缺点:维护额外的包,发布等工作量
react-app-rewired+customize-cra,项目中替换部分配置- 优点:不需要额外围护代码包,与此同时不给业务代码包带来过多的额外内容。
- 缺点:隔靴搔痒的感觉。一些深度侵入的配置改动会比较麻烦。
综上,方案 2 应该是最佳选择。考虑到优化带来的效果不明,以及 2 的前期额外投入,我们暂时先采取方案 3,待效果明显或遇到瓶颈后,切换方案 2 。
rewired
安装依赖
npm i -D react-app-rewired customize-cra
根目录创建文件 config-overrides.js
/* config-overrides.js */
module.exports = function override(config, env) {
//do stuff with the webpack config...
return config;
};
修改 package.json
/* package.json */
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
}
测量手段
打包体积
最终校验手段,可以看每次打包后的输出,也可以在 Devtool -> Networks 中看包大小。
优化过程中,我们引入 BundleAnalyzerPlugin 来查看 bundle 的组成。
npm i -D webpack-bundle-analyzer
const { override, addWebpackPlugin } = require('customize-cra');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin;
module.exports = override(addWebpackPlugin(new BundleAnalyzerPlugin()));
加入插件后,打包结束后会在 127.0.0.0:8888 通过可视化手段展示打包组成图。