1 . Plugin 的作用:
通过插件我们可以
扩展webpack ,加入自定义的构建行为,使 webpack 可以执行更广泛的任务 ,拥有更强的构建能力。
2 . Plugin 工作原理
Webpack 在编译代码的过程中,会触发一系列 Tapable 钩子事件,插件所做的,就是找到相应的钩子,往上面挂上自己的任务,也就是注册事件,这样,当 webpack 构建的时候,插件注册的事件就会随着钩子的触发而执行了。
3 . Webpack 内部的钩子
3 . 1 什么是钩子?
钩子的本质就是:
事件。为了方便我们直接介入和控制编译过程,webpack 把编译过程中触发的各类关键事件封装成事件接口暴露了出来。这些接口被很形象地称作:hooks(钩子),开发插件,离不开这些钩子。
4 . Tapable
Tapable为 webpack 提供了统一的插件接口(钩子) 的类型定义,是 webpack 的核心功能库,webpack 中目前有十种 hooks ,在 tapable 源码中可以看到。
-
tapable还统一暴露了三个方法给插件,用于注入不同类型的自定义构建行为。- `tap :` 可以注册同步钩子和异步钩子(但里面不能执行异步操作) - `tapAsync : ` 回调方式注册异步钩子 - `tapPromise : ` Promise 方式注册异步钩子
5 . Plugin 构建对象
5 . 1 Compiler :
- 只创建一次!!!!
5 . 2 Compilation :
- 会创建多次,处理不同类型的资源时都会重新创造!!!
6 . 生命周期简图:
7 . Plugin 的基本写法和webpack执行过程
8 . 注册hooks
8 . 1 同步 hooks :
- 写在 apply 方法中
compiler.hooks.environment.tap('要调用该hooks的插件名',
()=>{}`要执行的回调函数`) ;
8 . 2 异步串行 hooks :
- AsyncSeriesHook
- 可以注册多分事件!!!执行顺序为
串行执行!!!
有三种方法注册:
8 . 3 异步并行 hooks :
- AsyncParallelHook
- 可以注册多分事件!!!执行顺序为
同时执行!!!