Web前端
从vuecli3学习webpack记录(三)基类Tapable和Hook分析
在查看webpack(及插件)源码的过程中,我们会经常看到类似这样的代码 compiler.hooks.done.tap('vue-cli-service serve',() => {}); // 或者 compilation.hooks.buildModule.tap("ProgressPlugin", moduleAdd); 或者 compiler.hooks.environment.call(); 即调用hooks.xxx.tap(还有类似的tapPromise/tapAsync)方法hooks.xxx.call(还有类似的promise/callAsync)方法。首先一般是Compiler和Compilation类的实例里面会调用上市tap和call方法。首先,它们都继承自Tapable类,并在其构造函数里面都有一个hooks的对象,该对象的value都是一个Hook的子类的实例。以Compiler类为例。 class Compiler extends Tapable { constructor(context) { super(); this.hooks = { /** @type {SyncBailHook<Compilation>} */ shouldEmit: new SyncBailHook(["compilation"]), /** @type {AsyncSeriesHook<Stats>} */ done: new AsyncSeriesHook(["stats"]), /** @type {AsyncSeriesHook<>} */ additionalPass: new AsyncSeriesHook([]), /** @type {AsyncSeriesHook<Compiler>} */ beforeRun: new Read more…