Webpack编写自己的Plugin
编写自己的Plugin
与loader
一样,我们在使用 Webpack 的过程中,也经常使用plugin
,那么我们学习如何编写自己的plugin
是十分有必要的。
::: tip 场景
编写我们自己的plugin
的场景是在打包后的dist
目录下生成一个copyright.txt
文件
:::
plugin基础
plugin
基础讲述了怎么编写自己的plugin
以及如何使用,与创建自己的loader
相似,我们需要创建如下的项目目录结构:
1 | |-- plugins |
copyWebpackPlugins.js
中的代码:使用npm run build
进行打包时,我们会看到控制台会输出hello, my plugin
这段话。
::: tip 说明plugin
与loader
不同,plugin
需要我们提供的是一个类,这也就解释了我们必须在使用插件时,为什么要进行new
操作了。
:::
1 | class copyWebpackPlugin { |
webpack.config.js
中的代码:
1 | const path = require('path'); |
如何传递参数
在使用其他plugin
插件时,我们经常需要传递一些参数进去,那么我们如何在自己的插件中传递参数呢?在哪里接受呢?
其实,插件传参跟其他插件传参是一样的,都是在构造函数中传递一个对象,插件传参如下所示:
1 | const path = require('path'); |
在plugin
的构造函数中调用:使用npm run build
进行打包,在控制台可以打印出我们传递的参数值why
1 | class copyWebpackPlugin { |
如何编写及使用自己的Plugin
::: tip 说明
apply
函数是我们插件在调用时,需要执行的函数apply
的参数,指的是 Webpack 的实例compilation.assets
打包的文件信息
:::
我们现在有这样一个需求:使用自己的插件,在打包目录下生成一个copyright.txt
版权文件,那么该如何编写这样的插件呢?
首先我们需要知道plugin
的钩子函数,符合我们规则钩子函数叫:emit
,它的用法如下:使用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class CopyWebpackPlugin {
constructor() {
}
apply(compiler) {
compiler.hooks.emit.tapAsync('CopyWebpackPlugin', (compilation, cb) => {
var copyrightText = 'copyright by why';
compilation.assets['copyright.txt'] = {
source: function() {
return copyrightText
},
size: function() {
return copyrightText.length;
}
}
cb();
})
}
}
module.exports = CopyWebpackPlugin;npm run build
命名打包后,我们可以看到dist
目录下,确实生成了我们的copyright.txt
文件。我们打开1
2
3
4
5
6
7
8
9|-- dist
| |-- copyright.txt
| |-- main.js
|-- plugins
| |-- copyWebpackPlugin.js
|-- src
| |-- index.js
|-- webpack.config.js
|-- package.jsoncopyright.txt
文件,它的内容如下:1
copyright by why