webpack就是将源代码进行编译(打包,整合)成为最终代码
- 可以将这个整个过程大致分为三个步骤
1.初始化阶段
- 初始化阶段就是在webpack命令运行之后,
- 也是npx webpack之后,对配置进行处理,
- 基于第三方库yargs完成,
- 进行融合各种参数,如cli参数,默认配置文件(入口 出口),配置文件 webpack.config.js进行融合,
- 主要为了接下来进行编译做准备。
2. 编译阶段
1. 第一步: 根据入口文件进行生成一个chunk
- chunk实在webpack内部构建(打包创建的一个chunk,意思就是块,表示通过某个入口文件找到所有依赖的统称
根据入口模块(默认为./src/index.js)创建一个chunk,默认只有一个chunk
每个chunk都有两个属性
- name:默认为main
- id:唯一编号,开发环境和name相同,生成环境是一个数字,从0开始。
2.所有的依赖模块
根据main chunk构建所有依赖的模块
1.根据入口的模块文件进行记录检查
记录检查:编译阶段一开始会有个表格,最开始这个表格是空的,表格用来存储记录的模块。 如果记录过,那么结束 不在读取文件内容,如果没有记录,读取文件内容
注:模块的id就是模块的路径
2. 读取文件内容
如果模块文件记录检查没有记录,那么就会读取文件的内容,查看文件是否有其他依赖
3. 根据语法分析生成AST抽象语法树
4.记录依赖
- 根据抽象语法树分析后,记录依赖,把依赖的文件保存到dependences中,以数组的形式存放。
5.替换依赖函数
根据依赖的文件,进行替换,形成新的依赖函数
6.保存替换后的模块代码
- 记录替换后的代码,存放在一个表格中
7. 根据dependencies的内容进行递归加载模块
- 继续分析依赖中的文件,进行循环解析
3.产生chunk assets
- 第二步完成后,chunk中会产生一个模块列表,列表中包含了木块id和转化后的代码。接下来webpack会根据配置的chunk生成一个chunk assets,也就是资源列表,即最终形成的文件,包含文件名和文件内容。
chunk hash是根据所有chunk assets的内容生成的一个hash字符串(验证文件是否变化,如果变化 hash变化)
hash:一种算法,具体有很多分类,特点是将一个任意长度的字符串转换为一个固定长度的字符串,而且可以保证原始内容不变,产生的hash字符串就不变
4. 合并chunk assets
将多个chunk的assets合并到一起,并产生一个总的资源列表和hash
输出阶段
- 此步骤非常简单,webpack利用node中的(文件处理模块),根据编译产生的总的assets,生成相应的文件
总的过程
- 如果开启了watch,就会从编译阶段开始 不会从初始化阶段开始。
涉及术语
- module:模块,分割的代码单元,webpack中的模块可以是任何内容的文件,不仅限于JS
- chunk:webpack内部构建模块的块,一个chunk中包含多个模块,这些模块是从入口模块通过依赖分析得来的
- bundle:chunk构建好模块后会生成chunk的资源清单,清单中的每一项就是一个bundle,可以认为bundle就是最终生成的文件
- hash:最终的资源清单所有内容联合生成的hash值
- chunkhash:chunk生成的资源清单内容联合生成的hash值
- chunkname:chunk的名称,如果没有配置则使用main
- id:通常指chunk的唯一编号,如果在开发环境下构建,和chunkname相同;如果是生产环境下构建,则使用一个从0开始的数字进行编号