# webpack - 分离第三方库

因为每次都是复制了 webpack 配置改改,而没有仔细了解过 splitChunks 的运行规则。基于 webpack4 的 spiltChunks 记录一下。

# module、chunk、bundle

这三个词是 splitChunks 运行的基础。《what are module,chunk and bundle in webpack》 (opens new window)

  • module:就是js的模块,webpack 支持commonJS、ES6等模块化规范,简单来说就是通过 import,require 语句引入的代码,独立的代码块。

  • chunk: 是 webpack 根据功能拆分出来的一组模块,包含三种情况:

    1、项目入口 entry (entry chunk)

    2、通过 import() 动态引入的代码 (children chunk)

    3、通过 splitChunks 拆分出来的代码 (common chunk)

    chunk包含着module,一般会有多个 module 也可能是一对一。

  • bundle:bundle 是 webpack打包之后的各个文件,一般和chunk是一对一的关系,就是对 chunk 进行编译压缩打包等处理之后的文件。

# 配置

文档说 webpack4 的默认配置如下:(然鹅,写了个 demo,发现,好像不手动配置不会生效 webpack@4.44.2, webpack-cli@4.2.0

module.exports = {
  //...
  optimization: {
    splitChunks: {
      chunks: 'async', // "initial"(入口) | "all"(推荐) | "async"(默认异步)
      minSize: 30000, // 最小 30 kb,拆分出来的 bundle 大于 30 kb
      maxSize: 0, // 最大
      minChunks: 1, // 最小 chunk ,默认1,引用1次就拆分,针对 cacheGroups 里面的配置,解决代码重复引用
      maxAsyncRequests: 5, // 最大异步请求数
      maxInitialRequests: 3, // 最大初始化请求数
      automaticNameDelimiter: '~', // chunk 名字分割符
      cacheGroups: {
        vendors: {
          name:'vendors', // chunk 名字,字符串或者函数,不设置会按照共享的 chunks 命名 
          test: /[\\/]node_modules[\\/]/, // 正则:哪些模块需要拆分
          priority: -10 // 缓存组优先级
        },
        vue: { // 手动增加的配置
          name: 'vue',
          chunks: 'all', // 所有
          test: /[\\/]node_modules[\\/]vue/,
          enforce: true // 忽略文件大小,最小 chunk 数,最大请求数,始终创建缓存组
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true // 是否使用已有的 chunk,如果当前的模块已经包含在其它的 chunk 里面了就不重复生成新的。
        }
      }
    }
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 注意

  • cacheGroups 会继承和覆盖 splitChunks 的配置项,但是 test、priority 和 reuseExistingChunk 只能用于配置缓存组;
  • 配置 cacheGroups 不生效(不拆分 chunk),可能是 maxInitialRequests 到上限了;
  • webpack@4 默认cacheGroups 是 vendorsdefault。5 是 defaultVendorsdefault;

# 参考

上次更新: 12/3/2020, 3:11:09 PM