参考:
- 开发:优化打包构建速度 - 开发体验和效率
- 生产:优化产出代码 - 产品性能
提高构建速度
优化babel-loader
配置缓存,es6代码没改的话,就不会重新编译。{
test: /\.js$/,
use: ['babel-loader?cacheDirectory'], // 开启缓存
include: path.resolve(__dirname, 'src'), // 明确范围
// exclude排除范围,二选一即可;一般排除node_modules
// exclude: path.resolve(__dirname, 'node_modules')
}
IgnorePlugin
noParse
happyPack
多进程打包
- JS单线程,开启多进程打包
- 提高构建速度(特别是多核CPU)
const HappyPack = require('happypack')
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: ['happypack/loader?id=babel'],
include: srcPath
}
]
},
plugins: [
// 开启多进程打包
new HappyPack({
// 用唯一的标识符 id 来代表当前的HappyPack是用来处理一类特性的文件
id: 'babel',
// 如克处理.js,用法和 Loader 配置中一样
loaders: ['babel-loader?cacheDirectory']
})
]
}
ParallelUglifyPlugin
开启多进程压缩JS
自动刷新
热更新
自动刷新带来的一些问题:
- 整个网页全部刷新,速度较慢
- 状态会丢失
热更新解决问题:新代码生效,网页不刷新,状态不丢失;配置如下(只需在dev.config里配置):
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.HotModuleReplacementPlugin()
],
devServer: {
// 打开热更新
hot: true
}
}
需要注意的是:
只是这样配置,默认情况下只有修改css才会用到热更新,对于html和js文件是不支持的。
需要js文件支持热更新,需要在入口文件加入下面配置:
if (module.hot) {
// 允许热更新的js文件,只监听math.js文件
module.hot.accept(['./math.js'], () => {
console.log('热更新了')
})
}
DllPlugin(动态链接库插件)
- 前端框架如vue React,体积大,构建慢
- 较稳定,不常升级版本
- 同一个版本只构建一次即可,不用每次都重新构建
webpack已内置DllPlugin支持
DllPlugin - 打包出dll文件
DllReferencePlugin - 使用dll文件