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

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

理解 minChunks


minChunks 表示一个模块至少应被指定个数的 chunk 所共享才能分割。默认为1。

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


chunks: 'all',
minChunks: 2


index.js 稍作修改:


// index.js
import 'vue'


构建结果如下:



原因分析:


因为 minChunks 为 2,所以只有当 vue 至少被2个 chunk 所共享时,才会被拆分出来。


思考题


请问如下代码,构建结果是什么?


chunks: 'all',
minChunks: 2


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


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


理解 cache groups


cacheGroups 继承 splitChunks 里的所有属性的值,如 chunksminSizeminChunksmaxAsyncRequestsmaxInitialRequestsautomaticNameDelimitername ,我们还可以在 cacheGroups 中重新赋值,覆盖 splitChunks 的值。另外,还有一些属性只能在 cacheGroups 中使用:testpriorityreuseExistingChunk


通过 cacheGroups,我们可以定义自定义 chunk 组,通过 test 条件对模块进行过滤,符合条件的模块分配到相同的组。


cacheGroups 有两个默认的组,一个是 vendors,将所有来自 node_modules 目录的模块;一个 default,包含了由两个以上的 chunk 所共享的模块。


前面的例子中,你可能注意到了怎么有的拆分出的chunk名字这么奇怪,例如 vendors~app(默认由 cacheGroups 中组的 key + 源chunk名组成)。我们看一下如何自定义拆分出的chunk名。


首先找到该chunk所属的分组,该例为 vendors 分组,作如下修改,其他使用默认配置:


chunks:'all',
cacheGroups: {
    vendors: {
      test: /[\\/]node_modules[\\/]/,
      name: "customName",
      priority: -10
    }
}


对 index.js 稍作修改:


// index.js
import 'vue'


构建结果如下:



原因分析:


vue 来自 node_modules 目录,被分配到了默认的 vendors 组中,如果不指定 name 的话,会使用默认的chunk名,这里我们指定了 name,因此最终的chunk名为customName


模块还可以分配到多个不同的组,但最终会根据 priority 优先级决定打包到哪个 chunk。


新增一个分组:


chunks:'all',
cacheGroups: {
    vendors: {
      test: /[\\/]node_modules[\\/]/,
      name: "customName",
      priority: -10
    },
    customGroup: {
      test: /[\\/]node_modules[\\/]/,
      name: "customName1",
      priority: 0
    }
}


构建结果:



原因分析:


虽然 vendorscustomGroup 这个两个组的条件都符合,但由于后者的优先级更高,所以最终将 vue 打包到了 customName1.js 中。


总结


讲解到这里,想必你对 webpack 如何进行代码分割有了深刻地理解了。对于文章开头的问题,可以给出你的答案了吧?


相关文章
|
2月前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
3月前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
138 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
3月前
|
前端开发 JavaScript 开发者
利用代码分割优化前端性能:高级技巧与实践
【10月更文挑战第2天】在现代Web开发中,代码分割是优化前端性能的关键技术,可显著减少页面加载时间。本文详细探讨了代码分割的基本原理及其实现方法,包括自动与手动分割、预加载与预取、动态导入及按需加载CSS等高级技巧,旨在帮助开发者提升Web应用性能,改善用户体验。
|
4月前
|
自然语言处理 测试技术
明确了:文本数据中加点代码,训练出的大模型更强、更通用
【9月更文挑战第18天】《To Code, or Not To Code? Exploring Impact of Code in Pre-training》一文探讨了在大型语言模型(LLMs)预训练中引入代码数据的影响。研究显示,包含代码数据能显著提升模型的总体性能,尤其在自然语言推理和代码任务上表现突出。作者通过广泛的消融实验验证了这一结论,但同时也指出需关注潜在的负面效应及模型架构等因素的影响。更多详细信息,请参阅论文原文:[链接](https://arxiv.org/abs/2408.10914)。
62 10
|
8月前
|
算法
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
|
机器学习/深度学习 自然语言处理 算法
文本数据处理:基本技巧与实例分析
文本数据处理:基本技巧与实例分析
462 0
|
人工智能 编解码 移动开发
当「分割一切」遇上图像修补:无需精细标记,单击物体实现物体移除、内容填补、场景替换(2)
当「分割一切」遇上图像修补:无需精细标记,单击物体实现物体移除、内容填补、场景替换
131 0
|
计算机视觉
当「分割一切」遇上图像修补:无需精细标记,单击物体实现物体移除、内容填补、场景替换(1)
当「分割一切」遇上图像修补:无需精细标记,单击物体实现物体移除、内容填补、场景替换
155 0