Webpack 理解 Chunk

article/2025/8/27 20:47:48

期望

希望读过本篇文章,你在看Webpack配置的时候,能在脑中形成Chunk的生成过程。

Chunk

Chunk不同于entry、 output、module这样的概念,它们对应着Webpack配置对象中的一个字段,Chunk没有单独的配置字段,但是这个词出现在CommonsChunkPlugin(Webpack3以前)、optimization.splitChunks(Webpack4以后)这样的名称之中。

Chunk是我们理解Webpack,必须理解的一个概念。

Chunk在Webpack里指一个代码块,那具体是指什么样的代码块呢?

Chunk VS Module

Module

首先来说module,Webpack可以看做是模块打包机,我们编写的任何文件,对于Webpack来说,都是一个个模块。所以Webpack的配置文件,有一个module字段,module下有一个rules字段,rules下有就是处理模块的规则,配置哪类的模块,交由哪类loader来处理。

module: {rules: [{test: /\.css$/,use: [{loader: "style-loader"}, {loader: "css-loader"}]},...]},
复制代码

Chunk

Chunk是Webpack打包过程中,一堆module的集合。我们知道Webpack的打包是从一个入口文件开始,也可以说是入口模块,入口模块引用这其他模块,模块再引用模块。Webpack通过引用关系逐个打包模块,这些module就形成了一个Chunk。

如果我们有多个入口文件,可能会产出多条打包路径,一条路径就会形成一个Chunk。出了入口entry会产生Chunk,还有两种途径,下面会有介绍。

Chunk VS Bundle

通常我们会弄混这两个概念,以为Chunk就是Bundle,Bundle就是我们最终输出的一个或多个打包文件。确实,大多数情况下,一个Chunk会生产一个Bundle。但有时候也不完全是一对一的关系,比如我们把 devtool配置成'source-map'。然后只有一个入口文件,也不配置代码分割:

 // webpack配置entry: {main: __dirname + "/app/main.js",},output: {path: __dirname + "/public",//打包后的文件存放的地方filename: "[name].js", //打包后输出文件的文件名},devtool: 'source-map',
复制代码

这样的配置,会产生一个Chunk,但是会产生两个bundle,如下图

image

注意到Chunk Names那列,只有main这么一个Chunk,再看Asset这一列,产生了两个bundle,还有一个.map文件。

这就是Chunk和Bundle的区别,Chunk是过程中的代码块,Bundle是结果的代码块。

查看Webpack源码,发现有一个Chunk.js,点进去看:

/*** A Chunk is a unit of encapsulation for Modules.* Chunks are "rendered" into bundles that get emitted when the build completes.*/
class Chunk {
}
复制代码

里面有一个Chunk类,这说明类Webpack在运行中,会生成Chunk对象,也能证明Chunk是过程中的代码块。

Chunk类上面的两句注释:一个Chunk是一些模块的封装单元。Chunk在构建完成就呈现为bundle。

产生Chunk的三种途径

  1. entry入口
  2. 异步加载模块
  3. 代码分割(code spliting)

entry产生Chunk

entry的配置有三种方式:

传递一个字符串

entry: './src/js/main.js',
复制代码

这种情况只会产生一个Chunk。(这里只说entry对Chunk的影响,不涉及代码分割)

传递数组

entry: ['./src/js/main.js','./src/js/other.js'],复制代码

这种情况也只会产生一个Chunk。Webpack会将数组里的源代码,最终都打包到一个Bundle里,原因就是只生成了一个Chunk.

传递对象

entry: {main: './src/js/main.js',other: './src/js/other.js'
},
output: {// path: __dirname + "/public",// filename:'bundle.js'// 以上2行会报错 path: __dirname + "/public",//打包后的文件存放的地方filename: "[name].js", //打包后输出文件的文件名}复制代码

对象中一个字段就会产生一个Chunk,所以在output中filename直接写死名称,会报错。因为上面的配置,产生了两个Chunk,最终会生成两个Bundle,一个名称肯定不够用了。需要用[name]变量来利用entry下的字段名称,作为生成Bundle们的名称。

这里面entry的key,也被用来当作它对应的Chunk的名称,上面传递一个字符串和传递数组两种方式,没有key,也会默认给生成的Chunk一个main的名称。

异步产生Chunk

除了入口文件会影响Chunk,异步加载的模块,也需要生成Chunk。

{entry: {"index": "pages/index.jsx"},output: {filename: "[name].min.js",chunkFilename: "[name].min.js"}
}
const myModel = r => require.ensure([], () => r(require('./myVue.vue')), 'myModel')
复制代码

这个时候chunkFilename字段就派上用场了,为异步加载的Chunk命名。

代码分割产生Chunk

我们来分析一下,下面代码会产生几个Chunk,其中main.js文件和two.js文件,都引用了同一个greeter.js文件。main.js中使用了react。

module.exports = {entry: {main: __dirname + "/app/main.js",other: __dirname + "/app/two.js",},output: {path: __dirname + "/public",//打包后的文件存放的地方filename: "[name].js", //打包后输出文件的文件名chunkFilename: '[name].js',},optimization: {runtimeChunk: "single",splitChunks: {cacheGroups: {commons: {chunks: "initial",minChunks: 2,maxInitialRequests: 5, // The default limit is too small to showcase the effectminSize: 0 // This is example is too small to create commons chunks},vendor: {test: /node_modules/,chunks: "initial",name: "vendor",priority: 10,enforce: true}},}}
}复制代码

答案是5个,两个入口分别产生一个, runtimeChunk: "single"会将Webpack在浏览器端运行时需要的代码单独抽离到一个文件,commons下的配置会产生一个Chunk,vendor下的配置会产生一个Chunk。如下图。

image

结束语

今天的研究就到这里。

能够在看Webpack的配置的时候,分辨出这样的配置能生成几个Chunk,Webpack就算是入门了,后面理解它的其他概念,会容易很多。


http://chatgpt.dhexx.cn/article/P0Xsjq07.shtml

相关文章

Http chunk介绍

总结: HTTP 1.1时,Response要嘛通过Content-Length来指定要传输的内容大小,要嘛通过Transfer-Encoding: chunked来传输动态大小的内容,此时要求Response传输的内容要符合chunk encoding的规定。 从抓包的角度来说,两个…

lua中chunk的理解

在Lua中,一个chunk是一段可执行的Lua代码。通常,一个chunk由一系列语句和表达式组成,可以是一个完整的程序文件,也可以是一个交互式控制台中输入的一行代码。 例如,下面是一个简单的Lua chunk: print(&qu…

【深度学习】Pytorch chunk函数

Pytorch chunk的方法做的是对张量进行分块,返回一个张量列表。但如果指定轴的元素个数被chunks除不尽,最后一块的元素个数会少。 torch.chunk(tensor, chunks, dim0) ->得到一个list的tensors 这个函数的作用是把一个tensor划分到特定数目的块。 chu…

不会还有人不知道module、bundle和chunk的区别吧?

module 非连续的功能块——提供了更小的表面积而不是整个程序。书写良好的modules提供了可靠的抽象及封装边界,组成了统一的设计和清晰的目的;模块解析(ModuleResolution)一个模块可以作为另一个模块的依赖模块,resolv…

torch.chunk

torch.chunk(tensor, chunk_num, dim)与torch.cat()原理相反,它是将tensor按dim(行或列)分割成chunk_num个tensor块,返回的是一个元组。 a torch.Tensor([[4,5,7], [3,9,8], [9,6,7]]) b torch.chunk(a, 3, dim 1) print(a) pri…

webpack中的chunk

Webpack 理解 Chunk - 掘金 Webpack 理解 Chunk 期望 希望读过本篇文章,你在看Webpack配置的时候,能在脑中形成Chunk的生成过程。 Chunk Chunk不同于entry、 output、module这样的概念,它们对应着Webpack配置对象中的一个字段&#xff0…

什么是chunk?

本文借鉴《自己动手实现Lua:虚拟机、编译器和标准库》,算是对自己学习的总结,也希望分享下所学知识~~ 什么叫Chunk? 一段可以被Lua解释器解释执行的代码就叫做chunk 可以很小,小到只有一两条语句;可以很大…

生日悖论matlab模拟

概率论课堂小作业 要求用matab模拟生日悖论 条件:30人||100次 本来想白嫖网上的解答 结果竟然找不到用matlab模拟仿真的 所幸不难 自己动手,也为后人铺路。 话不多说,直接上代码 clc clear m100; %仿真次数 N30;%学生人数 for j 1:mB zero…

Python关于生日悖论分析

生日悖论指如果一个房间里有23人或以上,那么至少有两个人生日相同的概率大于50%。编写程序,输出在10000例随机样本数量下,n个人中至少两个人生日相同的概率。(n从10到50,不考虑闰年) 代码: imp…

男孩女孩问题 生日悖论 三门问题

上篇文章 洗牌算法详解 讲到了验证概率算法的蒙特卡罗方法,今天聊点轻松的内容:几个和概率相关的有趣问题。 计算概率有下面两个最简单的原则: 原则一、计算概率一定要有一个参照系,称作「样本空间」,即随机事件可能…

生日悖论问题

生日悖论是指,如果一个房间裡有23个或23个以上的人,那么至少有两个人的生日相同的概率要大于50%。这就意味着在一个典型的标准小学班级(30人)中,存在两人生日相同的可能性更高。对于60或者更多的人,这种概率要大于99%。从引起逻辑…

生日悖论MATLAB仿真

生日悖论MATLAB仿真 终于熬过了这学期!不知不觉大学的3/8已经过去了。回顾以下本学期让我印象最深刻,也最有成就感的事情是写出了我人生中第一个MATLAB程序!由于先前零基础,所以从idea到code实现的整个过程是非常坎坷的QAQ那么话…

生日悖论 Birthday Paradox 至少有两人同一天生日概率

首先我们来看下生日悖论: 假设有n个人,365天的时间,假设所有人生日不相同的概率为(1-P) 第一个人可选择365 天中的任意365天,人数为1时所有人生日不相同的概率为365/365; 第二个人可选择365天…

【密码学/密码分析】生日悖论及生日攻击

生日悖论及生日攻击 鸽巢原理:给定n个鸽巢,至少存在n1只鸽子,那总是会发生碰撞。 概率环境:我们需要多少个物体(鸽子)使得发生碰撞的概率大于1/2? 答案是n1/2,而不是n/2。 举个例…

生日悖论的泛化问题的讨论

著名的生日悖论,不多言。 见维基百科: http://zh.wikipedia.org/wiki/%E7%94%9F%E6%97%A5%E6%82%96%E8%AE%BA 见百度百科: http://baike.baidu.com/view/859474.htm 摆渡、喂鸡,排名不分先后。 维基里面提到了泛化推广。生日…

关于生日悖论问题的验证

昨天在网上看到一个非常有意思的问题: 数学老师和体育老师打赌,数据老师认为在他们有50个人的班级里有两个生日是同一天的同学的概率远超没有的概率,反之是体育老师的观点。 第一次看到的时候我觉得这特数学老师才是教体育的吧, 我…

python生日悖论分析_生日悖论

python生日悖论分析 If you have a group of people in a room, how many do you need to for it to be more likely than not, that two or more will have the same birthday? 如果您在一个房间里有一群人,那么您需要多少个才能使两个或两个以上的人有相同的生日…

Birthday Paradox(生日悖论)(概率)

Birthday Paradox(生日悖论)(概率) judge:LightOJ - 1104 vjudge:vjudge Time limit:2000 ms Memory limit:32768 kB OS:Linux Source:Problem Setter: Jane…

用python整个活(3)——生日悖论:birthday paradox

🏆一、前言 别问我为啥题目是英文,因为…高大上(bushi。 刷视频的时候偶然刷到了一个关于生日悖论的,当场就觉得不可思议,直到上网查了查…… 诶,怎么是真的? 这玩意儿居然还被设置到了密码…

【算法导论】生日悖论

生日悖论问题: 不考虑出生年份,问:一个房间中至少多少人,才能使其中两个人生日相同的概率达到50%? 解: 假设一年有 n 天,屋子中有 k 人,用整数 1, 2, …, k 对这些人进行编号。假定每个人的生日…