博客
关于我
Webpack 之 basic chunk graph
阅读量:794 次
发布时间:2023-02-11

本文共 1944 字,大约阅读时间需要 6 分钟。

Webpack 源文件及依赖关系分析

1. 项目结构

我们有以下文件:

  • a.js
  • b.js
  • c.js
  • d.js
  • webpack.config.js

其中 a.js 是入口文件,它依赖 b.js 和 c.js,并且 c.js 是异步加载的。b.js 又依赖 d.js,而 d.js 是一个简单的模块函数。

2. 模块依赖关系

  • a.js 导入 b.js,并使用它。
  • a.js 异步加载 c.js,并在加载完成后调用 del 函数。
  • b.js 导入 d.js,并将其作为模块使用。
  • c.js 同样导入 d.js,并在加载完成后调用 del 函数。
  • d.js 提供一个模块函数 mod(n1, n2)。

3. Webpack 配置

在 webpack.config.js 中,Webpack 的入口设置为 a.js,并使用以下输出选项:

module.exports = {
entry: {
app: './src/a.js'
},
output: {
filename: '[name].[chunkhash].js',
chunkFilename: '[name].bundle.[chunkhash:8].js',
publicPath: '/'
},
optimization: {
runtimeChunk: {
name: 'bundle'
}
}
}

4. 模块图与 Chunk 图

4.1 模块图

Webpack 将每个文件(如 a.js、b.js、c.js、d.js)视为一个模块。每个模块可以是普通模块(NormalModule)或依赖模块(ImportDependenciesBlock)。

4.2 Chunk 图

Chunk 表示 Webpack 打包后的文件组。每个 Chunk 对应一个文件组,可能包含多个模块。Chunk 还可以是 runtime chunk(用于 Webpack runtime 的代码)。

4.3 ChunkGroup

ChunkGroup 是 Chunk 的容器,一个 ChunkGroup 可能包含多个 Chunk。每个 ChunkGroup 对应一个入口文件。

5. 依赖关系处理

5.1 同步依赖

  • a.js 同步加载 b.js。
  • b.js 同步加载 d.js。

5.2 异步依赖

  • a.js 异步加载 c.js。
  • c.js 同样异步加载 b.js。

6. Webpack 的内部逻辑

6.1 创建 ChunkGroup 和 Chunk

  • Webpack 首先遍历配置文件中的入口,创建 ChunkGroup 和 Chunk。
  • 对于每个入口文件,创建一个 ChunkGroup,并在 ChunkGroup 中创建一个 Chunk。
  • Chunk 会记录其所属的模块和依赖关系。

6.2 处理模块依赖

  • Webpack 会递归加载所有依赖的模块,并建立模块之间的依赖关系。
  • 对于同步依赖,直接将模块添加到 Chunk 中。
  • 对于异步依赖,创建新的 Chunk,并将其加入 ChunkGroup。

6.3 优化 ChunkGraph

  • Webpack 会根据模块依赖关系,优化 ChunkGraph,合并重复的 Chunk。
  • 确保每个模块只出现在一个 Chunk 中。

7. 最终结构

  • ChunkGroup (app) 包含以下 Chunk:

    • Chunk (app): 包含 a.js 和 b.js。
    • Chunk (c.js): 包含 c.js 和 d.js。
    • Chunk (b.js): 包含 b.js 和 d.js。
  • Chunk (app) 包含 a.js 和 b.js。

  • Chunk (c.js) 包含 c.js 和 d.js。

  • Chunk (b.js) 包含 b.js 和 d.js。

8. 调试 Webpack 源码

要调试 Webpack 源码,可以在 package.json 中添加 debug 脚本:

"debug": "node --inspect-brk ./node_modules/webpack/bin/webpack.js"

运行 npm run debug,然后在浏览器中访问 chrome://inspect/#devices,选择 Node 运行环境,开始调试。

9. 总结

通过上述分析,可以看出 Webpack 是如何根据模块依赖关系,构建 Chunk 和 ChunkGroup 的。每个 Chunk 对应一个文件组,而每个 ChunkGroup 又对应一个入口文件。这种结构使得 Webpack 能够高效地打包和优化应用程序。

转载地址:http://unbfk.baihongyu.com/

你可能感兴趣的文章
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>
MySQL 处理插入重主键唯一键重复值办法
查看>>
Mysql 备份
查看>>
MySQL 备份 Xtrabackup
查看>>
mysql 复杂查询_mysql中复杂查询
查看>>
mYSQL 外键约束
查看>>
mysql 多个表关联查询查询时间长的问题
查看>>
mySQL 多个表求多个count
查看>>
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>