webpack流程可参考:http://taobaofed.org/blog/2016/09/09/webpack-flow/ https://zoumiaojiang.com/article/what-is-real-webpack-plugin/
Tapable:
Tapable事实上就是一个事件管理器,类似于 NodeJS 的 EventEmitter
类,专注于自定义事件的触发和处理。
Tapable
有四组成员函数:
plugin(name:string, handler:function)
:允许将一个自定义插件注册到 Tapable 实例 的事件中。它的行为和 EventEmitter
的 on()
方法相似,用来注册一个处理函数/监听器,来在信号/事件发生时做一些事情。apply(…pluginInstances: (AnyPlugin|function)[])
:AnyPlugin
应该是一个拥有 apply
方法的类(也可以是一个对象,但是不常见),或者只是一个包含注册代码的函数。这个方法只调用插件的定义,从而将真正的事件监听器可以注册到 Tapable 实例的注册列表中。applyPlugins*(name:string, …)
:Tapable 实例可以通过使用这些函数,在指定的 hash 下应用所有的插件。这一组方法的行为和 EventEmitter
的 emit()
方法相似,使用多种策略细致地控制事件的触发。mixin(pt: Object)
:一个简单地方法,使用混入而不是继承的方式扩展 Tapable
的原型Compier:
Compiler
也是我们所说的 Tapable
实例,他就是webpack的整体环境。通过这种实现机制,我们可以理解为,它混合(mix)了 Tapable
类,来使实例也具备注册和调用插件功能。
插件机制事实上就是通过注册在Complier上,在运行时Compier会根据各种事件钩子,从而触发插件的注册函数。
Compilation:
Compilation 实例继承于 compiler。例如,compiler.compilation 是对所有 require 图(graph)中对象的字面上的编译。这个对象可以访问所有的模块和它们的依赖(大部分是循环依赖)。在编译阶段,模块被加载,封闭,优化,分块,哈希和重建等等。这将是任何编译操作中,重要的生命周期。
官方文档看起来比较难理解,compilation 对象代表了一次单一的版本构建和生成资源。当运行 webpack 开发环境中间件时,每当检测到一个文件变化,一次新的编译将被创建,从而生成一组新的编译资源。一个编译对象表现了当前的模块资源、编译生成资源、变化的文件、以及被跟踪依赖的状态信息。编译对象也提供了很多关键点回调供插件做自定义处理时选择使用。
两者之间的区别: