经过上一篇博客分析webpack从命令行到打包完成的整体流程,我们知道了webpage的plugin是基于事件机制工作的,这样最大的好处是易于扩展。社区里很多webpack的plugin,但是具体到我们的项目并不一定适用,这篇博客告诉你如何入手写一个plugin,然后分析源码相关部分告诉你你的plugin是如何工作。知其然且知其所以然。
该系列博客的所有测试代码。
从黑盒角度学习写一个plugin
所谓黑盒,就是先不管webpack的plugin如何运作,只去看官网介绍。
Compiler和Compilation两个类
官网介绍告诉我们,plugin涉及到源码中的Compiler
类和Compilation
类,并对这两个类进行了简要介绍。
Compiler
在开始打包时就进行实例化,实例对象里面装着与打包相关的环境和参数,包括options
、plugins
和loaders
等。Compilation
在每次文件变化重新打包时都进行一次实例化,它继承自Compiler
,其实例对象里装着和modules
及chunks
相关的信息。
如果黑盒角度写plugin,知道这些就行了,没必要非去看源码。这两个对象上挂载的具体内容可以自己打印看看,不赘述。
写一个简单的plugin
写plugin大致分为两个步骤:
- 定义plugin
- 在
webpack.config.js
中引用这个plugin
定义plugin
function HTMLPlugin(options){
// options是配置文件,你可以在这里进行一些与options相关的工作
}
// 每个plugin都必须定义一个apply方法,webpack会自动调用这个方法
HTMLPlugin.prototype.apply = function(compiler){
// apply方法中会传入Compiler的实例compiler
// 'emit'是该插件监听的事件,插件工作的逻辑在回调函数中
compiler.plugin('emit', function(compilation, callback){
// 回掉函数有两个参数
// compilation和下一个回调函数,callback可以不传
// 同步事件不传callback
compilation.chunks.forEach(function(chunk){
console