webpack4分包方案
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里抽取代码,有三个值:
- initial:初始块,分开打包异步\非异步模块
- async:按需加载块, 类似initial,但是不会把同步引入的模块提取到vendors中
- all:全部块,无视异步\非异步,如果有异步,统一为异步,也就是提取成一个块,而不是放到入口文件打包内容中
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分包方案的更多相关文章
- Android分包方案multidex
对于功能越来越复杂的app的两大问题 问题一:当项目越来越大,方法数超过65536,编译时会出错(为什么是65536,参考下面关于dexopt对方法id检索存储介绍),这个所说的方法数包含用到的框架, ...
- [转]Android dex分包方案
转载自:https://m.oschina.net/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装 ...
- Android dex分包方案
当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...
- android分包方案
当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...
- dex分包方案
当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...
- Android dex分包方案和热补丁原理
一.分包的原因: 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方 ...
- android 基于分包方案的修复
# 本demo实现原理来自 https://github.com/dodola/HotFix https://zhuanlan.zhihu.com/p/20308548 # Anti类功能,及其原理 ...
- webpack 性能优化 dll 分包
webpack 性能优化 dll 分包 html-webpack-externals-plugin DLLPlugin https://www.webpackjs.com/configuration/ ...
- dex分包变形记
腾讯Bugly特约作者:李金涛 一.背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败.这一问题意味着项目 ...
随机推荐
- Java零基础入门之基础语法
一.Java标识符 什么是标识符? 标识符是用来标识类名.对象名.变量名.方法名.数组名.自定义数据类型的有效字符序列. 合法的标识符 ①:由字母.数字.下划线"_".美元符号&q ...
- JVM性能调优详解
前面我们学习了整个JVM系列,最终目标的不仅仅是了解JVM的基础知识,也是为了进行JVM性能调优做准备.这篇文章带领大家学习JVM性能调优的知识. 性能调优 性能调优包含多个层次,比如:架构调优.代码 ...
- 你知道MySQL中的主从延迟吗?
前言 在一个MySQL主备关系中,每个备库接受主库的binlog并执行. 正常情况下,只要主库执行更新生成所有的binlog,都可以传到备库并被正常的执行,这样备库就能够达到跟主库一样的状态,这就是最 ...
- 极光推送(JPush)开篇
Date:2019-11-11 读前思考: 极光推送是什么? 极光推送是能做什么?有什么优势? 怎么根据业务需求来实现极光推送服务呢? 简介 极光推送(JPush)是独立的第三方云推送平台,致力于为全 ...
- C++总结(1)keywords to the class
目录 Chapter 1.关于类的关键字 1. class,struct与union 2.private,public与protected 3.friend 4.virtual 5.const 6.i ...
- T-SQL Part XII: Access Remote SQL Server
要链接远程的SQL Server,需要一下几个步骤(以下的步骤都是在远程系统上进行): 确认远程SQL Server所监听的端口号 官方的文档是使用SQL Server Configuration M ...
- nyoj 12-喷水装置(二)(贪心)
12-喷水装置(二) 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:30 题目描述: 有一块草坪,横向长w,纵向长为h,在它的橫 ...
- 领扣(LeetCode)Fizz Buzz 个人题解
写一个程序,输出从 1 到 n 数字的字符串表示. 1. 如果 n 是3的倍数,输出“Fizz”: 2. 如果 n 是5的倍数,输出“Buzz”: 3.如果 n 同时是3和5的倍数,输出 “FizzB ...
- PHP面向对象中new self( )和 new static( ) 的区别
在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类. class A { public static $_a = 'Class A'; public static ...
- postgresql , etcd , patroni 做failover
os: centos 7.4etcd:3.2 主从IP信息192.168.56.101 node1 master192.168.56.102 node2 slave192.168.56.103 nod ...