一、基本配置
1. 配置css
2. 配置图片
2.1 使用file-loader
2.2 使用url-loader(通常上线使用url-loader)
3. devServer配置代理
4. 使用webpack-merge合并公共配置,dev配置,production配置
二、webpack配置多入口
1. entry配置多个入口文件
2. 配置output
3. 配置对应的html插件
三、处理CSS抽离和压缩
1. loader中配置抽离CSS
2. plugins中配置输出CSS文件
3. 压缩CSS
3.1 prod
3.2 dev
四、抽离公共代码和第三方代码
optimization: {
// 压缩 css
minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
// 分割代码块
splitChunks: {
chunks: 'all',
/**
* initial 入口 chunk,对于异步导入的文件不处理
async 异步 chunk,只对异步导入的文件处理
all 全部 chunk
*/
// 缓存分组
cacheGroups: {
// 第三方模块
vendor: {
name: 'vendor', // chunk 名称
priority: 1, // 权限更高,优先抽离,重要!!!
test: /node_modules/,
minSize: 0, // 大小限制
minChunks: 1 // 最少复用过几次
},
// 公共的模块
common: {
name: 'common', // chunk 名称
priority: 0, // 优先级
minSize: 0, // 公共模块的大小限制
minChunks: 2 // 公共模块最少复用过几次
}
}
}
}
五、异步加载js
六、Module chunk bundle的区别
1、Module - 各个源码文件,webpack中一切皆模块
2、chunk - 多模块合并成的,如entry,import(),spliteChunk
3、bundle - 最终的输出文件
七、webpack性能优化
1. 优化babel-loader
2. 开启多进程
关于开启多进程
- 项目较大,打包较慢,开启多进程能提高打包效率
- 项目较小,打包很快,开启多进程会降低速度(进程开销)
- 按需使用
2.1 happypack开启多进程打包
2.2 parallelUglifyPlugin压缩输出JS代码
3. 热更新
3.1 对比自动刷新:
自动刷新:整个网页都会刷新,速度较慢,状态会丢失。
热更新:新代码生效,网页不刷新,状态不丢失。
3.2 配置
4. IgnorePlugin
newwebpack.IgnorePlugin(/.\/locale/,/moment/),
5. 产出代码
5.1 原则
- 体积小
- 合理分包,不重复加载
- 速度更快,内存使用更少
5.2 实践
- 小图片base64编码
- bundle加hash
- 懒加载
- 提取公共代码
- IgnorePlugin
- 使用CDN加速
- 使用production
- 使用Scope-Hosting
6. 使用production
- 自动开启代码压缩
- Vue React等会自动删掉调试代码
八、Tree-Shaking
tree shaking 就是只把⽤到的方法打入 bundle ,没⽤到的方法会在uglify阶段被擦除掉。
注意:ES6 Module才能让tree-shaking生效,commonjs就不行。
九、ES6-Module和CommonJS的区别
- ES6-Module是静态引用,编译时引入(不能在条件引用,不能通过代码判断是否引用)
- Commonjs动态引用,执行时引用
- 只用ES6-Module才能静态分析,实现tree-shaking
十、Scope-Hosting
多个函数和成一个函数
- 代码体积更小
- 创建函数作用域更少
- 代码可读性更好