Webpack是现在主流的功能强大的模块化打包工具,在使用Webpack时,如果不注意性能优化,有非常大的可能会产生性能问题,比如开发时打包构建速度慢、开发调试时的重复性工作等。本文将会讲解一些基本的Webpack性能优化问题。
一、优化构建速度
设置
resolve.modules:[path.resolve(__dirname, 'node_modules')]
避免层层查找。resolve.modules
告诉webpack
去哪些目录下寻找第三方模块,默认值为['node_modules']
,会依次查找./node_modules
、../node_modules
、../../node_modules
。合理配置
resolve.extensions
,减少文件查找。默认值:
extensions:['.js', '.json']
, 当导入语句没带文件后缀时,Webpack会根据extensions定义的后缀列表进行文件查找,所以:- 列表值尽量少
- 频率高的文件类型的后缀写在前面
- 源码中的导入语句尽可能的写上文件后缀,如
import store from './index'
要写成import store from './index.js'
二、压缩文件体积
区分环境–减小生产环境代码体积
在webpack4 增加了mode模式配置 在浏览器环境下指定了 process.env.NODE_ENV 的值,默认是development,但node环境中还是需要cross-env来设置。
mode 是 webpack 4 中新增加的参数选项,其有两个可选值:production 和 development。mode 不可缺省,需要二选一。在项目目录中添加
webpack
配置文件- webpack.base.config.js 保存webpack基础通用的配置的文件
- webpack.dev.config.js 保存webpack开发环境配置的文件
- webpack.prod.config.js 保存webpack生成环境配置的文件
- webpack.config.js webpack执行配置文件, 保存相应环境的配置和webpack基础配置文件合并后的配置
压缩JS
Webpack内置UglifyJS插件、ParallelUglifyPlugin
会分析JS代码语法树,理解代码的含义,从而做到去掉无效代码、去掉日志输入代码、缩短变量名等优化。常用配置参数如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16const UglifyJSPlugin = require('webpack/lib/optimize/UglifyJsPlugin');
//...
plugins: [
new UglifyJSPlugin({
compress: {
warnings: false, //删除无用代码时不输出警告
drop_console: true, //删除所有console语句,可以兼容IE
collapse_vars: true, //内嵌已定义但只使用一次的变量
reduce_vars: true, //提取使用多次但没定义的静态值到变量
},
output: {
beautify: false, //最紧凑的输出,不保留空格和制表符
comments: false, //删除所有注释
}
})
]使用Tree Shaking剔除 JS 中的
dead-code
tree shaking 是一个术语,通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。
它正常工作的前提是代码必须采用ES6的模块化语法,因为ES6模块化语法是静态的(在导入、导出语句中的路径必须是静态字符串,且不能放入其他代码块中)。
使用webpack-bundle-analyzer
可以使用
webpack-bundle-analyzer
来分析 Webpack 生成的包体组成并且以 可视化 的方式反馈给开发者。使用npm安装该插件:
npm install --save-dev webpack-bundle-analyzer
然后我们需要修改webpack.config.js来引入该插件:
1
2
3
4const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// ...
plugins: [new BundleAnalyzerPlugin()]
// ...执行
webpack-dev-server
,浏览器将会自动在localhost:8888
打开分析页面。