一、webpack做了什么

用户使用webpack打包项目,只要写好配置,然后运行webpack,就可以得到打包结果了,webpack会根据配置项自动化构建项目。

因此webpack做的工作可以简单描述为项目 + 配置 => dist

更进一步,webpack读取配置,根据入口开始遍历文件,解析依赖,使用loader处理各模块,然后将文件打包成bundle后输出到output指定的目录中。

二、webpack构建过程

  1. Webpack CLI 启动打包流程,解析配置项参数;
  2. 载入 Webpack 核心模块,创建 Compiler 对象;
  3. 注册plugins
  4. 使用 Compiler 对象开始编译整个项目;
  5. 从入口文件开始,解析模块为AST,分析模块依赖,形成依赖关系树;
  6. 递归依赖树,将每个模块交给对应的 Loader 处理;
  7. 合并 Loader 处理完的结果,将打包结果输出到 dist 目录。

三、webpack插件机制

Webpack 的插件系统是基于官方自己的 Tapable 库实现的。

Tapable 是一个类似于 Node.js 中的 EventEmitter的库,但更专注于自定义事件的触发和处理,tapable控制钩子函数的发布与订阅,控制着webpack的插件系统,webpack的本质就是一系列的插件运行。

Tapable 中主要提供了同步与异步两种钩子。

四、compiler和compilation

compiler是编译器,控制webpack整个编译流程,compilation则是处理模块,包括调用loader编译模块,模块优化,生成hash,生成chunk等。

除了模块的处理,webpack还有很多其他操作,compiler负责处理初始化,插件注册,输出文件,编译失败处理等等。

五、参考文章

https://blog.csdn.net/weixin_42614080/article/details/110507675

https://blog.csdn.net/weixin_43334673/article/details/107598708

https://developer.51cto.com/article/695893.html

https://zhuanlan.zhihu.com/p/79221553