如何使用 splitChunks 精细控制代码分割(中)

简介: 前端小伙伴都知道,为了降低包大小,经常会把依赖的前端模块独立打包,比如把 vue、vue-router 打到一个单独的包 vendor 中。另外,常会将存在多个路由的复杂页面的每个页面都单独打一个包,只有访问某个页面的时候,再去下载该页面的js包,以此来加快首页的渲染。 无论是 react 还是 vue 都提供了完善的工具,帮我们屏蔽了繁琐的配置工作。当我们对代码进行构建时,已经自动帮我们完成了代码的拆分工作。 所以,很多小伙伴并不知道背后到底发生了什么事。至于为什么这么拆分,到底如何控制代码的拆分,更是一头雾水了。

原因分析:


  • index.js 作为入口文件,属于入口起点手动配置分割代码的情况,因此会独立打包。(app.js)


  • a.js 通过 import() 进行加载,属于动态导入的情况,因此会独立打出一个包。(1.js)


  • vue 来自 node_modules 目录,并且大于30kb;将其从 a.js 拆出后,与 a.js 并行加载,并行加载的请求数为2,未超过默认的5;vue 拆分后,并行加载的入口文件并无增加,未超过默认的3。vue 也符合 splitChunks 的拆分条件,单独打了一个包(2.js)


理解 chunks


chunks 用以告诉 splitChunks 的作用对象,其可选值有 asyncinitialall。默认值是 async,也就是默认只选取异步加载的chunk进行代码拆分。这个我们在开头的例子里已经验证。这里我们通过两个例子来看一下当chunks的值为 initialall 时,打包结果如何。 首先将chunks值改为 initial


chunks: "initial"


构建结果如下:



原因分析:


chunks 值为 initial 时,splitChunks 的作用范围变成了非异步加载的初始 chunk,例如我们的 index.js 就是初始化的时候就存在的chunk。而 vue 模块是在异步加载的chunk a.js 中引入的,所以并不会被分离出来。


chunks 仍使用 initial, 我们对 index.jsa.js 稍作修改:


// index.js
import 'vue'
import('./a')


// a.js
console.log('a')


构建结果如下:



原因分析:


vueindex.js 直接被引入,而 index.js 是初始chunk,所以分离出来打到了 vendors~app.js 中。


能不能让 splitChunks 既处理初始chunk也处理异步chunk呢?答案是可以,只需要将 chunks 改为 all


chunks: "all"


index.jsa.js 稍作修改:


// index.js
import 'vue-router'
import('./a')


// a.js
import 'vue'
console.log('a')


构建结果如下:



原因分析:


chunks 值为 all 时,splitChunks 的处理范围包括了初始chunk和异步chunk两种场景,因此 index.js 中的 vue-router 被分拆到了 vendors~app.js 中,而异步加载的chunk a.js 中的 vue 被分拆到了 3.js 中。推荐在开发中将 chunks 设置为 all


理解 maxInitialRequests


maxIntialRequests 表示 splitChunks 在拆分chunk后,页面中需要请求的初始chunk数量不超过指定的值。所谓初始chunk,指的是页面渲染时,一开始就需要下载的js,区别于在页面加载完成后,通过异步加载的js。


splitChunks 做以下修改,其他使用默认配置:


chunks: 'initial',
maxInitialRequests: 1


对 index.js 稍作修改:


// index.js
import 'vue'


构建结果如下:



原因分析:


因为 maxInitialRequests 为1,如果 vueindex.js 中拆出的话,新创建的chunk作为初始chunk  index.js 的前置依赖,是需要在页面初始化的时候就先请求的。那么初始化时的请求数变成了2,因此不满足拆分条件,所以 splitChunks 没有对 index.js 进行拆分。


理解 maxAsyncRequests


maxInitialRequests 相对,maxAsyncRequests 表示 splitChunks 在拆分chunk后,并行加载的异步 chunk 数不超过指定的值。


splitChunks 做以下修改,其他使用默认配置:


maxAsyncRequests: 1


index.js 稍作修改:


// index.js
import('./a')


// a.js
import 'vue'
console.log('a')


构建结果如下:



原因分析:因为 maxAsyncRequests 为1,由于 a.js 是通过 import() 异步加载的,此时并行的异步请求数是1。如果将 vuea.js 中拆出的话,拆出的包也将成为一个异步请求chunk。这样的话,当异步请求 a.js 的时候,并行请求数有2个。因此,不满足拆分条件,所以 splitChunks 没有对 a.js 进行拆分。


相关文章
|
18天前
|
自然语言处理 测试技术
明确了:文本数据中加点代码,训练出的大模型更强、更通用
【9月更文挑战第18天】《To Code, or Not To Code? Exploring Impact of Code in Pre-training》一文探讨了在大型语言模型(LLMs)预训练中引入代码数据的影响。研究显示,包含代码数据能显著提升模型的总体性能,尤其在自然语言推理和代码任务上表现突出。作者通过广泛的消融实验验证了这一结论,但同时也指出需关注潜在的负面效应及模型架构等因素的影响。更多详细信息,请参阅论文原文:[链接](https://arxiv.org/abs/2408.10914)。
47 10
|
4月前
经验大分享:QML动态标注线
经验大分享:QML动态标注线
19 0
|
5月前
|
机器学习/深度学习 计算机视觉 网络架构
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
390 0
【FCN】端到端式语义分割的开篇之作! 从中窥探后续语义分割网络的核心模块(一)
|
5月前
|
算法
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
|
12月前
|
机器学习/深度学习 数据采集 PyTorch
图片风格自动分析模型
图片风格自动分析模型
187 0
|
12月前
|
机器学习/深度学习 自然语言处理 算法
文本数据处理:基本技巧与实例分析
文本数据处理:基本技巧与实例分析
344 0
|
12月前
|
数据处理 计算机视觉 Python
图像数据处理:基本技巧与实例分析
图像数据处理:基本技巧与实例分析
146 0
|
人工智能 编解码 移动开发
当「分割一切」遇上图像修补:无需精细标记,单击物体实现物体移除、内容填补、场景替换(2)
当「分割一切」遇上图像修补:无需精细标记,单击物体实现物体移除、内容填补、场景替换
117 0