编译过程

# 编译过程

将源代码打包的过程。

大致分为三个过程

  • 初始化
  • 编译
  • 输出

# 初始化

初始化阶段,由于我们使用的是 webpack-cli,当运行命令时,webpack 会将 webpack.config.js 中的配置,命令行配置,以及package.json 里面的配置合并成一个最终配置。

# 生成 chunk(块)

然后进入分析阶段

根据入口文件递归遍历文件

拿到模块文件 会先检查一下 chunk 中的模块记录,看是否存在于表中。

如果存在,则遍历下一个,如果不存在,则会读取文件中的内容,然后通过语法分析,将内容转换为 AST 抽象语法树。通过分析 AST 抽象语法树记录依赖。

然后将依赖保存到 dependencies 中,(dependencies中保存的是模块ID ‘./src/xxx.js’, 模块ID 的路径是从 src下开始的。类似于 denpendencies['./src/a.js','./src/b.js'] )

接着会替换内容的 require 改为自定义名称 _webpack_require 。

保存转换后的模块代码,到chunk 的模块记录中

  • 模块ID :./src/index.js
  • 转换后的代码:xxxxxx

然后根据 denpendencies 中的内容 递归加载模块。

# 生成 chunk assets

就是将我们生成的 chunk 列表,转换成编译后的资源:

  • 文件名:./dist/main.js(一般与chunk 的 name 相同(默认是main 生产环境则是一串数字))
  • 文件内容

同时会生成一个 chunk hash。

将文件内容联合起来,生成一个固定长度的 hash ,来识别内容是否改变。

这就是一个 bundle。

然后将所有的 chunk assets 融合起来,生成一个总的 chunk hash

# 输出

由于 webpack 运行在 node 环境,所以 可以通过 fs 模块,将生成的内容写入文件中;