线索
V8 对 ESM 模块的静态分析。
- ESM 从语言规范层面约定导入导出语句只能出现在模块顶层。
- JS 引擎负责对 ESM 模块的静态分析。
Webpack Compilation 从入口模块 Module 开始的构建流。
- 创建入口 Module 实例,
- 使用对应的 loaders 转换上述实例到 JS 文本,
- 使用 acorn 工具转换 JS 文本到 AST,
- 遍历上述 AST 找到资源依赖,并通过 module.addDependency 方法将其添加到 module 依赖列表,构建 Module Graph
- AST 遍历结束,调用 module.handleParseResult 处理上述步骤得到的模块依赖,并重复上述完整的过程,
- 完成所有 Module 及其依赖的处理,得到转换后的 Module 内容和其依赖关系图 Module Graph。
Webpack Compilation.seal 操作遍历 compilation.modules 集合将 module 按 entry/动态引入规则分配给不同的 chunk 对象,得到 chunk 集合对象。
- 在 compilation.modules 记录模块与 chunk 的关系
- 遍历 module 构建 chunk 集合
- 触发模块优化钩子 hook:optimizeModules
- 触发 hook:optimizeChunks
- 触发 hook:optimizeTree
- 触发 hook:optimizeChunkModules
推断