webpack4放弃了 commonsChunkPlugin,使用更方便灵活智能的 splitChunks 来做分包的操作。

下面有几个例子,并且我们假设所有的chunks大小至少为30kb(采用splitChunks默认配置)

vendors

入口

chunk-a: react react-dom 其他组件

chunk-b: react react-dom 其他组件

chunk-c: angular 其他组件

chunk-d: angular 其他组件

产出

vendors-chunk-a-chunk-b: react react-dom

vendors-chunk-c-chunk-d: angular

chunk-a 至 chunk-d: 对应的其他组件

重复的vendors

入口

chunk-a: react react-dom 其他组件

chunk-b: react react-dom lodash 其他组件

chunk-c: react react-dom lodash 其他组件

产出

vendors-chunk-a-chunk-b-chunk-c: react react-dom

vendors-chunk-b-chunk-c: lodash

chunk-a 至 chunk-c: 对应的其他组件

模块

入口

chunk-a: vue 其他组件 shared组件

chunk-b: vue 其他组件 shared组件

chunk-c: vue 其他组件 shared组件

假设这里的shared体积超过30kb,这时候webpack会创建vendors和commons两个块

产出

vendors-chunk-a-chunk-b-chunk-c: vue

commons-chunk-a-chunk-b-chunk-c: shared组件

chunk-a 至 chunk-c: 对应的其他组件

如果shared提交小于30kb,webpack不会特意提出来,webpack认为如果仅仅为了减少下载体积的话,这样做是不值得的。

多个共享模块

入口

chunk-a: react react-dom 其他组件 react组件

chunk-b: react react-dom angular 其他组件

chunk-c: react react-dom angular 其他组件 react组件 angular组件

chunk-d: angular 其他组件 angular组件

产出

vendors-chunk-a-chunk-b-chunk-c: react react-dom

vendors-chunk-b-chunk-c-chunk-d: angular

commons-chunk-a-chunk-c: react组件

commons-chunk-c-chunk-d: angular组件

chunk-a 至 chunk-d: 对应的其他组件

关于webpack默认配置

splitChunks: {
chunks: "async",
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
  • chunks: 表示从哪些chunks里抽取代码,有三个值:
    1. initial:初始块,分开打包异步\非异步模块
    2. async:按需加载块, 类似initial,但是不会把同步引入的模块提取到vendors中
    3. all:全部块,无视异步\非异步,如果有异步,统一为异步,也就是提取成一个块,而不是放到入口文件打包内容中

通过import()控制模块的一些属性

initial情况下,如果两个入口一个是同步引入,一个是异步引入,那么会分开打包,同步的直接将引入包打到入口文件的打包文件里,异步的会分出单独的块,按需引入

all情况下,如果一个异步一个同步,会统一分出一个单独的块,然后引入

  • minSize代表最小块大小,如果超出那么则分包,该值为压缩前的。也就是先分包,再压缩
  • minchunks表示最小引用次数,默认为1
  • maxAsyncRequests: 按需加载时候最大的并行请求数,默认为5
  • maxInitialRequests: 一个入口最大的并行请求数,默认为3
  • automaticNameDelimiter表示打包后人口文件名之间的连接符
  • name表示拆分出来块的名字
  • cacheGroups:缓存组,除了上面所有属性外,还包括
    • test:匹配条件,只有满足才会进行相应分包,支持函数 正则 字符串
    • priority:执行优先级,默认为0
    • reuseExistingChunk:如果当前代码块包含的模块已经存在,那么不在生成重复的块

几种配置示例(依赖优先级priority)

个人感觉其实只要玩好cacheGroups,就能完成各种各样的分包
// 将所有node_modules中应用2次以上的抽成common块
optimization: {
splitChunks: {
cacheGroups: {
common: {
test: /[\\/]node_modules[\\/]/,
name: 'common',
chunks: 'initial',
priority: 2,
minChunks: 2
}
}
}
}
// 把所有超过2次的达成common,不局限于node_modules
optimization: {
cacheGroups: {
common: {
name: 'common',
chunks: 'initial',
priority: 2,
minChunks: 2,
}
}
}
// 额外提取react相关基础模块,然后抽取引入超过两次的模块到common
optiomization: {
cacheGroups: {
reactBase: {
name: 'reactBase',
test: (module) => {
return /react|redux|prop-types/.test(module.context);
},
chunks: 'initial',
priority: 10,
},
common: {
name: 'common',
chunks: 'initial',
priority: 2,
minChunks: 2,
}
}
}
// 如果提取出来的包依然很大,你又想利用好缓存,你可以这样做
// 这样你的每一个node_modules包都是一个chunks,对缓存很友好,会节约很多用户流量,虽然流量已经不之前
optimization: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name(module) {
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
// 避免服务端不支持@
return `npm.${packageName.replace('@', '')}`;
},
},
}
}

相关文章

Code Splitting, chunk graph and the splitChunks optimization

webpack4 splitchunks实践探索

chunks解释

vendors过大的解决方案

webpack4分包方案的更多相关文章

  1. Android分包方案multidex

    对于功能越来越复杂的app的两大问题 问题一:当项目越来越大,方法数超过65536,编译时会出错(为什么是65536,参考下面关于dexopt对方法id检索存储介绍),这个所说的方法数包含用到的框架, ...

  2. [转]Android dex分包方案

    转载自:https://m.oschina.net/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装 ...

  3. Android dex分包方案

    当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...

  4. android分包方案

    当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...

  5. dex分包方案

    当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...

  6. Android dex分包方案和热补丁原理

    一.分包的原因: 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方 ...

  7. android 基于分包方案的修复

    # 本demo实现原理来自 https://github.com/dodola/HotFix https://zhuanlan.zhihu.com/p/20308548 # Anti类功能,及其原理 ...

  8. webpack 性能优化 dll 分包

    webpack 性能优化 dll 分包 html-webpack-externals-plugin DLLPlugin https://www.webpackjs.com/configuration/ ...

  9. dex分包变形记

    腾讯Bugly特约作者:李金涛 一.背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败.这一问题意味着项目 ...

随机推荐

  1. StrGame

    如果先手可以控制一轮必胜或者必败,则先手必胜 如果只有必胜的方法,不能保证必败,则最后一轮的先手获得胜利,倒数第二轮的先手会被后手想办法”被胜利“从而在最后一轮成为后手,必败.倒数第三轮先手故意胜利, ...

  2. 大数据之路week01--day02我实在时被继承super这些东西搞的头疼,今天来好好整理以下。

    这一周的第一天的内容是面向对象的封装,以及对方法的调用.实在时没法单独拿出来单说,就结合这一节一起说了. 我实在是被继承中的super用法给弄的有点晕,程序总是不能按照我想的那样,不是说结果,而是实现 ...

  3. NOIP模拟26

    把题解沽了好久了,今天还是不想写,我们靠的B卷其实挺水的,但是我就是想吐槽一下!咋还带题目里面放题解的?题里一点题解的线索都没有,但是玄机竟然在题目里! 我也是醉了,T1就是一个贪心,题目说贪婪,T2 ...

  4. 通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战

    前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...

  5. 【Swift】UNNotificationServiceExtension

    一.简介 An object that modifies the content of a remote notification before it's delivered to the user. ...

  6. java多线程与线程并发二:线程互斥

    本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 当两条线程访问同一个资源时,可能会出现安全隐患.以打印字符串为例,先看下面的代码: // public class Test2 { p ...

  7. 基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm)

    基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm): PS : 有能力的建议购买正版,好吧. PS:均针对其对应的2018.3.1 ...

  8. 理解Spark SQL(二)—— SQLContext和HiveContext

    使用Spark SQL,除了使用之前介绍的方法,实际上还可以使用SQLContext或者HiveContext通过编程的方式实现.前者支持SQL语法解析器(SQL-92语法),后者支持SQL语法解析器 ...

  9. 控制层传递参数到jsp页面,jsp页面进行接收

    在java代码中,控制层方法如下(采用model,还有其他方式) public String mysave(MyTreeMould myTreeMould, Model model) {...... ...

  10. 用例图浅谈以及OOA再到情景分析的面向对象电梯的设计(慕课东北大学)面向对象设计思维模式

    上班初期还不太适应,平时学习进度也跟不上,节奏慢下来会有时间更新的了. Diagram  这边以学生课程报名系统为例    这就是一种简单的用例图 用例图可以给读者提供的信息非常丰富,但是缺点是都是概 ...