09-自定义plugin

nobility 发布于 2022-01-14 1042 次阅读


自定义plugin

webpack的插件是基于事件驱动进行编写的,更多的事件可从webpack官网获得,一个webpack插件包括以下几步:

  • 暴露一个JavaScript函数或JavaScript类
  • 在其原型中定义apply方法
  • 指定要接入的事件钩子(apply方法参数compiler中的hooks属性)
  • 操作webpack内部实例的特定数据
  • 在功能完成后调用webpack提供的回调(异步事件需要调用提供回调)

同步时刻

class MyPlugin {
	constructor(options) { //接收插件参数
		this.value = options.value;
	}
	apply(compiler) { //在webpack打包时会自动执行该方法
		const value = this.value //暂存value的值
		compiler.hooks //compiler是一个webpack实例,其中有一个钩子,在某时刻自动执行
			.entryOption //在webpack选项中的entry被处理过之后执行
			.tap("MyPlugin", (context, entry) => { //同步钩子使用tap执行
				//第一个参数是当前插件名字,第二个参数是钩子函数
				//context存放了webpack执行的跟路径,entry存放了webpack中的entry选项对象
				console.log(value);
				console.log(context, entry);
			})
	}
}
module.exports = MyPlugin;

异步时刻

class MyPlugin {
	constructor(options) { //接收插件参数
		this.value = options.value;
	}
	apply(compiler) { //在webpack打包时会自动执行该方法
		const value = this.value //暂存value的值
		compiler.hooks //compiler是一个webpack实例,其中有一个钩子,在某时刻自动执行
			.emit //当打包后的代码都放入文件夹之后的时刻,该时刻是异步的
			.tapAsync("MyPlugin", (compilation, callback) => { //异步钩子使用tapAsync执行
				//第一个参数是当前插件名字,第二个参数是钩子函数
				//compilation中存放了这次webpack打包时的所有信息,其中assets属性中存放了打包后的所有文件
				compilation.assets["test.txt"] = { //为该对象添加一个测试文件
					source() { //返回测试文件中的内容函数
						return value; //返回options中的内容
					}
				}
				callback(); //异步钩子函数需要在最后执行callbacks
			})
	}
}
module.exports = MyPlugin;

使用自定义插件

const MyPlugin = require('./plugins/my-plugin.js');
require("clean-webpack-plugin")
module.exports = {
  entry: {
    main: "./index.js"
  },
  plugins: [
    new MyPlugin({
      value:"hello world"
    })
  ]
}
此作者没有提供个人介绍
最后更新于 2022-01-14