Webpack原理 25 -- plugin原理

65 阅读2分钟

1 . Plugin 的作用:

通过插件我们可以扩展 webpack ,加入自定义的构建行为,使 webpack 可以执行更广泛的任务 ,拥有更强的构建能力。

2 . Plugin 工作原理

1152.png

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 :

1153.png

  • 只创建一次!!!!

5 . 2 Compilation :

1154.png

  • 会创建多次,处理不同类型的资源时都会重新创造!!!

6 . 生命周期简图:

1155.png

7 . Plugin 的基本写法和webpack执行过程

1156.png

8 . 注册hooks

8 . 1 同步 hooks :

  • 写在 apply 方法中
compiler.hooks.environment.tap('要调用该hooks的插件名',
()=>{}`要执行的回调函数`) ;

8 . 2 异步串行 hooks :

  • AsyncSeriesHook
  • 可以注册多分事件!!!执行顺序为串行执行!!!

有三种方法注册: 1157.png

8 . 3 异步并行 hooks :

  • AsyncParallelHook
  • 可以注册多分事件!!!执行顺序为同时执行!!!

1158.png