如何使用 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 进行拆分。


相关文章
|
移动开发 文字识别 算法
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
本文简要介绍Pattern Recognition 2019论文“SegLink++: Detecting Dense and Arbitrary-shaped Scene Text by Instance-aware Component Grouping”的主要工作。该论文提出一种对文字实例敏感的自下而上的文字检测方法,解决了自然场景中密集文本和不规则文本的检测问题。
1969 0
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
|
3月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
156 3
|
3月前
|
缓存 前端开发 JavaScript
利用代码分割优化前端性能:策略与实践
在现代Web开发中,代码分割是提升页面加载性能的有效手段。本文介绍代码分割的概念、重要性及其实现策略,包括动态导入、路由分割等方法,并探讨在React、Vue、Angular等前端框架中的具体应用。
|
1月前
|
人工智能 数据库
Poetry2Image:专为中文古诗词设计的图像生成校正框架,增强了诗歌内容与模型生成图像之间的一致性
Poetry2Image 是一个专为中文古诗词图像生成设计的迭代校正框架,通过自动化反馈和校正循环,提升诗歌与图像之间的一致性,有效捕捉诗歌的语义和艺术精髓。
62 11
Poetry2Image:专为中文古诗词设计的图像生成校正框架,增强了诗歌内容与模型生成图像之间的一致性
|
3月前
|
机器学习/深度学习 运维 监控
基于特征子空间的高维异常检测:一种高效且可解释的方法
本文探讨了一种替代传统单一检测器的方法,通过构建多个专注于特征子集(子空间)的检测器系统,来提高异常检测的准确性和效率。文章详细介绍了子空间方法在处理高维数据时的优势,包括缓解维度灾难、提高异常检测的可解释性和计算效率。同时,文中还讨论了子空间的选择策略,如基于领域知识、相关性、随机选择等,并介绍了PyOD工具包中实现子空间异常检测的具体方法。通过这些技术,异常检测系统能够更有效地识别数据中的异常记录,尤其是在特征数量众多的情况下。
83 9
基于特征子空间的高维异常检测:一种高效且可解释的方法
|
4月前
|
数据可视化 算法 Python
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
本文介绍了如何利用Python脚本结合动态模态分解(DMD)技术,分析从OpenFOAM模拟中提取的二维切片数据,以深入理解流体动力学现象。通过PyVista库处理VTK格式的模拟数据,进行POD和DMD分析,揭示流场中的主要能量结构及动态特征。此方法为研究复杂流动系统提供了有力工具。
225 2
基于OpenFOAM和Python的流场动态模态分解:从数据提取到POD-DMD分析
|
4月前
|
前端开发 JavaScript 开发者
利用代码分割优化前端性能:高级技巧与实践
【10月更文挑战第2天】在现代Web开发中,代码分割是优化前端性能的关键技术,可显著减少页面加载时间。本文详细探讨了代码分割的基本原理及其实现方法,包括自动与手动分割、预加载与预取、动态导入及按需加载CSS等高级技巧,旨在帮助开发者提升Web应用性能,改善用户体验。
|
7月前
|
图形学 开发者
U3D开发进阶:精细调整Collider与优化碰撞检测性能
【7月更文第11天】在Unity 3D(简称U3D)开发过程中,精确控制Collider(碰撞器)的设置与合理利用Layer Collision Matrix(层级碰撞矩阵)对于提升游戏性能、优化物理模拟至关重要。本文将深入探讨这两项技术的应用,通过实际案例和代码示例,帮助开发者构建更加高效、流畅的游戏体验。
893 2
|
8月前
|
编解码 算法 计算机视觉
YOLOv8数据增强预处理方式详解:包括数据增强的作用,数据增强方式与方法
YOLOv8数据增强预处理方式详解:包括数据增强的作用,数据增强方式与方法