webpack系列教程之Plugins篇

182 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

前面我们说到了一些loader以及入口等,这一章我们将一起来看下plugins

简介

前面loader我们已经说到了在某种程度上plugins是一种更强大的loader。我们都知道loader是用来转换文件格式的。转换成webpack能识别的文件。但是plugins在转换的基础上会有一些更加强大的功能。例如:

  1. 生成文件的时候需要生成额外的描述文件。
  2. webpack编译过程动态输出所需要的信息 因此我们可以看出,其实plugins是一个自定义webpack构建过程的配置。这这个配置中,我们可以借助webpack提供的各种钩子,来在构建过程中处理我们想要处理的东西。这一点是loader所不具备的。

本质

plugins本质是一个具有apply属性的js对象。其被webpack的compiler调用。我们可以在整个编译过程中获取compiler对象。其本质为:

const myPlugin = {
    apply:function(compiler) {

    }
}

或者

class MyPlugin {
    apply(compiler){
    }
}
let myPlugin = new MyPlugin();

webpack构建开始的时候,会先创建compiler对象。此对象是在初始化的时候创建的。整个webpack的构建生命周期只有一个compiler对象。然后通过apply函数调用此对象

compiler

在初始化的时候创建,会创建一个compilation实例。其作用是以便注册和调用插件。其本质是监听文件系统。在文件修改,或者编译的时候。会自动触发其内部封装的监听方法。然后我们可以通过其提供的钩子来获取编译过程。外部需要获取钩子的时候可以通过以下方式来获取:

compiler.hooks.事件名称.事件类型(plugin名称,compilation=>{
})

其中事件类型有3种,分别是:

  1. tap: 注册一个同步的钩子函数,函数运行完毕则表示事件处理结束
  2. tapAsync: 注册一个基于回调的异步钩子函数。当调用回调的时候则表示事件处理结束
  3. tapPromise: 注册一个基于Promise的异步钩子,当进入Promise则表示事件处理结束 例如
class MyPlugin {
    construct(name){
        this.name = name;
    }
    apply(compiler) {
        compiler.hooks.run.tap(this.name,compilation =>{
            console.log('构建开始')
        })
    }
}

compiler具有哪些事件,详见compiler 钩子.这里就不一一列举了。后期会有一篇自定义plugins,在里面会一一举例。

用法

通过上面我们可以看出,其实插件就是一个实例,一个对象的实例,同时此实例支持传入一些参数,因此我们需要通过new来实例化一个实例。因此常用方法为:

module.exports = {
    plugins:[
        new MyPlugin(参数)
    ]
}

至此我们关于plugins介绍结束,后面我们将看看如何自定义一个plugins,敬请期待。