webpack中的optimization配置

272 阅读2分钟

webpack中的optimization主要用来自定义一些优化打包策略,根据不同的策略来分割打包出来的bundle,主要配置以下四个属性:

  • minimizer
  • runtimeChunk
  • noEmitOnErrors
  • splitChunks

在分包之前可按照打包分析工具:webpack-bundle-analyzer

npm i  webpack-bundle-analyzer --save-dev

yarn add  webpack-bundle-analyzer --dev

没有添加之前:

module.exports = {
 chainWebpack(config) {
  config.when(process.env.NODE_ENV != 'development',
   config => {
    config.optimization.splitChunks({ 
    chunks: 'all',
     cacheGroups: {
      // 第三方组件
      libs: { 
      //指定chunks名称
       name: 'chunk-libs',       //符合组的要求就给构建venders
       test: /[\\/]node_modules[\\/]/,
       //priority:优先级:数字越大优先级越高,因为默认值为0,
//所以自定义的一般是负数形式,决定cacheGroups中相同条件下每个组执行的优先顺序。
       priority: 10,       // 仅限于最初依赖的第三方
       chunks: 'initial'
      },
      elementUI: { 
      // 将elementUI拆分为单个包
       name: 'chunk-elementUI',
       // 重量需要大于libs和app,否则将打包到libs或app中
       priority: 20,
       // 为了适应cnpm 
      test: /[\\/]node_modules[\\/]_?element-ui(.*)/
      },
      //公共组件 
     commons: { 
      name: 'chunk-commons',
       // can customize your rules
       test: resolve('src/components'),
       minChunks: 3,
       priority: 30, 
      //这个的作用是当前的chunk如果包含了从main里面分离出来的模块,则重用这个模块,
//这样的问题是会影响chunk的名称。
       reuseExistingChunk: true,
       //最大初始化加载次数,一个入口文件可以并行加载的最大文件数量,默认3
       maxInitialRequests: 3,
       //表示在分离前的最小模块大小,默认为0,最小为30000
       minSize: 0 
     },
      echarts: { // split echarts libs
       name: 'chunk-echarts',
       test: /[\\/]node_modules[\\/]_?echarts(.*)/,
       priority: 40,
       chunks: 'async',
       reuseExistingChunk: true
      },
      monaco: { // split monaco libs
       name: 'chunk-monaco',
       test: /[\\/]node_modules[\\/]_?monaco(.*)/,
       priority: 40, 
      chunks: 'async',
       reuseExistingChunk: true 
     },
      'project-components': { // split project libs
       name: 'chunk-project-components',
       test: resolve('src/views/project'),
       priority: 50,
       chunks: 'async',
       reuseExistingChunk: true
      },
      'teachers-components': { // split teacher libs
       name: 'chunk-teachers-components',
       test: resolve('src/views/teachers'),
       priority: 60,
       chunks: 'async',
       reuseExistingChunk: true
      },
    worldjson: { 
   chunks: 'all',
    name: `worldjson`,
    test: /[\\/]world.json/,
    priority: -3,
},    default: {
        name: 'common',
        minSize: 30000,
        maxAsyncRequests: 6,
        maxInitialRequests: 5,
        minChunks: 2,
        priority: -20,
        reuseExistingChunk: true
        }
     } 
   })
   })
 }}

添加之后