上一篇博客:插件机制横向扩展webpack的构建能力 三个插件的使用实例已经学习了三个常见的插件的使用实例,现在我们尝试着开发一个插件来理解实现插件的基本原理。
1. 插件机制基本原理
Webpack 的插件机制就是我们在软件开发中最常见的钩子机制。
钩子机制也特别容易理解,它有点类似于 Web 中的事件。在 Webpack 整个工作过程会有很多环节,为了便于插件的扩展,Webpack 几乎在每一个环节都埋下了一个钩子。这样我们在开发插件的时候,通过往这些不同节点上挂载不同的任务,就可以轻松扩展 Webpack 的能力。
具体有哪些预先定义好的钩子,我们可以参考官方文档的 API:
接下来,我们来开发一个自己的插件,看看具体如何往这些钩子上挂载任务。
2. 开发一个插件
这里我的需求是,希望我们开发的这个插件能够自动清除 Webpack 打包结果中的注释,这样一来,我们的 bundle.js 将更容易阅读,如下图所示:
那这里我们同样在项目根目录下添加一个单独的 JS 文件。
└─ 开发一个插件 ······················· sample root dir
├── public ······························· static dir
│ └── favicon.ico ······················ static file
├── src ·································· source dir
│ └── main.js ·························· entry module
├── package.json ························· package file
+ ├── remove-comments-plugin.js ············ my plugin
└── webpack.config.js ···················· webpack config file
Webpack 要求我们的插件必须是一个函数或者是一个包含 apply 方法的对象,一般我们都会定义一个类型,在这个类型中定义 apply 方法。然后在使用时,再通过这个类型来创建一个实例对象去使用这个插件。
所以我们这里定义一个 RemoveCommentsPlugin 类型,然后在这个类型中定义一个 apply 方法,这个方法会在 Webpack 启动时被调用,它接收一个 compiler 对象参数,这个对象是 Webpack 工作过程中最核心的对象,里面包含了我们此次构建的所有配置信息,我们就是通过这个对象去注册钩子函数,具体代码如下:
// ./remove-comments-plugin.js
class RemoveCommentsPlugin {
apply (compiler) {
console.log(