一、基本配置

1. 配置css

image.png

2. 配置图片

2.1 使用file-loader

image.png

2.2 使用url-loader(通常上线使用url-loader)

image.png

3. devServer配置代理

image.png

4. 使用webpack-merge合并公共配置,dev配置,production配置

image.png

二、webpack配置多入口

1. entry配置多个入口文件

image.png

2. 配置output

image.png

3. 配置对应的html插件

image.png

三、处理CSS抽离和压缩

1. loader中配置抽离CSS

image.png

2. plugins中配置输出CSS文件

image.png

3. 压缩CSS

3.1 prod

image.png

3.2 dev

image.png

四、抽离公共代码和第三方代码

  1. optimization: {
  2. // 压缩 css
  3. minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
  4. // 分割代码块
  5. splitChunks: {
  6. chunks: 'all',
  7. /**
  8. * initial 入口 chunk,对于异步导入的文件不处理
  9. async 异步 chunk,只对异步导入的文件处理
  10. all 全部 chunk
  11. */
  12. // 缓存分组
  13. cacheGroups: {
  14. // 第三方模块
  15. vendor: {
  16. name: 'vendor', // chunk 名称
  17. priority: 1, // 权限更高,优先抽离,重要!!!
  18. test: /node_modules/,
  19. minSize: 0, // 大小限制
  20. minChunks: 1 // 最少复用过几次
  21. },
  22. // 公共的模块
  23. common: {
  24. name: 'common', // chunk 名称
  25. priority: 0, // 优先级
  26. minSize: 0, // 公共模块的大小限制
  27. minChunks: 2 // 公共模块最少复用过几次
  28. }
  29. }
  30. }
  31. }

image.png

五、异步加载js

image.png

六、Module chunk bundle的区别

1、Module - 各个源码文件,webpack中一切皆模块
2、chunk - 多模块合并成的,如entry,import(),spliteChunk
3、bundle - 最终的输出文件

七、webpack性能优化

1. 优化babel-loader

image.png

2. 开启多进程

关于开启多进程

  • 项目较大,打包较慢,开启多进程能提高打包效率
  • 项目较小,打包很快,开启多进程会降低速度(进程开销)
  • 按需使用

2.1 happypack开启多进程打包

image.png
image.png
image.png

2.2 parallelUglifyPlugin压缩输出JS代码

image.png
image.png

3. 热更新

3.1 对比自动刷新:

自动刷新:整个网页都会刷新,速度较慢,状态会丢失。
热更新:新代码生效,网页不刷新,状态不丢失。

3.2 配置

image.png

image.png

image.png

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

image.png

十、Scope-Hosting

多个函数和成一个函数

  • 代码体积更小
  • 创建函数作用域更少
  • 代码可读性更好