Webpack 源码分析

50 阅读1分钟

Webpack 源码分析

经过长时间分析webpack源码发现,webpack有如下特点

webpack使用Tapable作为事件中心,将打包分为env环境准备阶段,compile编译阶段,makesealemit等几个阶段

make阶段借助了acorn第三方库对源代码进行了parse

webpack 如何知道 index.js 依赖了哪些文件的

阅读源码后发现

其中 blockPreWalkStatement()ImportDeclaration 进行了检查 一旦发现 import 'xxx',就会触发 import 钩子,对应的监听函数会处理依赖 其中 walkStatements()ImportExpression 进行了检查 一旦发现 import('xxx'),就会触发 importCall 钩子,对应的监听函数也会触发

怎么把 modules 合并成一个文件的

compilation.seal(),该函数会创建 chunks、 为每个 chunk 进行 codeGeneration,然后为每个 chunk 创建 asset seal() 之后,emitAssets()emitFiles() 会创建文件(emit 就是写) 最终得到 dist/main.js 和其他 chunk 文件

总结 webpack 怎么分析依赖和打包的

  • 使用 JavascriptParser 对 index.js 进行 parse 得到 ast,然后遍历 ast
  • 发现依赖声明就将其添加到 module 的 dependencies 或 blocks 中
  • seal 阶段,webpack 将 module 转为 chunk,可能会把多个 module 通过 codeGeneration 合并为一个 chunk
  • seal 之后,为每个 chunk 创建文件,并写到硬盘上

画图防止内容忘记

图片1.png