博客
关于我
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 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
Mysql 会导致锁表的语法
查看>>
mysql 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>