优化单独打包 runtime

webpack.config.js

  1. ...
  2. module.exports={
  3. mode:mode
  4. ...
  5. optimization:{
  6. runtimeChunk:'single' //运行时文件 单独打包
  7. }
  8. ...
  9. }
  10. ...

为什么?

  • runtime代码是让main.js运行在IE的代码
  • 单独打包后,升级webpack或改配置每次重新打包
  • 只会把index.js 打包成main.xxx.js
  • 额外的代码 .js 打包成runtime.xxx.js
  • 这种情况下只要index内容不变,用户缓存的main.xxx.js代码就不会变
  • 无需额外下载文件

如果不单独打包,那么修改webpack配置会导致用户的缓存失效,必须重新下载main.js
单独打包,只要不改自己的代码,main.js就不需要重新下载,节省带宽

优化 用splitChunks 将 node 依赖单独打包

webpack.config.js

  1. ...
  2. module.exports={
  3. mode:mode
  4. ...
  5. optimization:{
  6. runtimeChunk:'single', //运行时文件 单独打包
  7. splitChunks: {
  8. cacheGroups: {
  9. vendor: {
  10. minSize: 0,
  11. /* 如果不写 0,由于 React 文件尺寸太小,会直接跳过 */
  12. test: /[\\/]node_modules[\\/]/,
  13. // 为了匹配 /node_modules/ 或 \node_modules\
  14. name: 'vendors', // 文件名
  15. chunks: 'all',
  16. // all 表示同步加载和异步加载,async 表示异步加载,initial 表示同步加载
  17. /* 这三行的整体意思就是把两种加载方式的来自
  18. node_modules 目录的文件打包为 vendors.xxx.js其中 vendors 是第三方的意思
  19. */
  20. }
  21. },
  22. },
  23. }
  24. ...
  25. }
  26. ...

优化 固定 moduleIds

https://webpack.js.org/configuration/optimization/#optimizationmoduleids

  1. ...
  2. module.exports={
  3. mode:mode
  4. ...
  5. optimization:{
  6. moduleIds:'deterministic',
  7. ...
  8. }
  9. ...
  10. }
  11. ...

保证某个模块代码消失,后面的文件id也是不变的

Webpack 多页面

  1. const HtmlWebpackPlugin = require('html-webpack-plugin')
  2. ...
  3. module.exports={
  4. mode:mode,
  5. ...
  6. entry:{
  7. main:'./src/index.js',
  8. admin:'./src/admin.js'
  9. },
  10. plugins:[
  11. ...
  12. new HtmlWebpackPlugin({
  13. filename:'index.html', //index.html
  14. chunks:['main']
  15. }),
  16. new HtmlWebpackPlugin({
  17. filename:'admin.html',
  18. chunks:['admin'] //引入的js
  19. })
  20. ].filter(Boolean),
  21. ...
  22. module:{
  23. ...
  24. }
  25. }
  26. ...

优化 common 插件

  • 使用多页面就要用 common chunks共有文件
  • 比如一个文件被多个js引用后,为了防止打包后被重复引用
  • 这样共有文件更改就只需要打包一次
    1. ...
    2. module.exports={
    3. mode:mode
    4. ...
    5. optimization:{
    6. runtimeChunk:'single', //运行时文件 单独打包
    7. splitChunks: {
    8. cacheGroups: {
    9. vendor: {
    10. priority:10,//优先级
    11. minSize: 0,
    12. /* 如果不写 0,由于 React 文件尺寸太小,会直接跳过 */
    13. test: /[\\/]node_modules[\\/]/,
    14. // 为了匹配 /node_modules/ 或 \node_modules\
    15. name: 'vendors', // 文件名
    16. chunks: 'all',
    17. // all 表示同步加载和异步加载,async 表示异步加载,initial 表示同步加载
    18. /* 这三行的整体意思就是把两种加载方式的来自
    19. node_modules 目录的文件打包为 vendors.xxx.js其中 vendors 是第三方的意思
    20. */
    21. },
    22. common:{
    23. priority:5,//优先级
    24. minSize:0,
    25. minChunks:2,
    26. chunks:'all',
    27. name:'common'
    28. }
    29. },
    30. },
    31. }
    32. ...
    33. }
    34. ...

    代码分隔

    runtime
    node_modules-vendor 全局
    common 模块
    self(main/admin) 自身