博客
关于我
Webpack 之 basic chunk graph
阅读量:796 次
发布时间: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/

你可能感兴趣的文章
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>