前言
webpack
通过Plugin
机制让其更灵活,以适应各种应用场景。在webpack
行的生命周期中会广播许多事件,Plugin
可以监昕这些事件,在合适的时机通过webpack
提供的API改变输出结果。
一个最基础的Plugin
一个最基础的Plugin
代码是这样的
class MyPlugin { constructor(options) { } apply(complier) { complier.plugin('compilation', function (compilation) { }) } }
webpack.config.js
中
const MyPlugin = require('./plugins/test') module.exports = { plugins:[ new MyPlugin(options) ] }
Complier和Compliation
在开发Plugin时最常用的两个对象就是Compiler和Compilation ,它们是Plugin
和webpack
之间的桥梁。 Compiler和Compilation的含义如下。
- Compiler对象包含了
webpack
环境的所有配置信息,包含options、loaders、plugins等信息。 - Compilation 对象包含了当前的模块资源、编译生成资源、变化的文件等。
Compiler和Compilation 的区别在于:Compiler代表了整个webpack
从启动到关闭的生命周期,而Compilation只代表一次新的编译。
开始编写
该插件可以在webpack
名称是EndWebpackPlugin
,作用是在webpack
即将退出时再附加一些额外的操作,例如webpack
成功构建后把生成的文件发布到服务器中。实现该插件,需要借助以下两个事件
- done:在成功构建并且输出文件后,
webpack
即将退出时发生 - failed:在构建出现异常时导致构建失败,
webpack
即将退出时发生
插件代码如下// ./plugins/test.js class EndWebpackPlugin { constructor(doneCallback, failedCallback) { this.doneCallback = doneCallback this.failedCallback = failedCallback } apply(complier) { complier.plugin('done', data => { this.doneCallback(data) }) complier.plugin('failed', err => { this.failedCallback(err) }) } } module.exports = EndWebpackPlugin
webpack.config.js
代码如下const path = require('path') const EndWebpackPlugin = require('./plugins/test') module.exports = { entry: './index.js', module: { rules: [{ test: /\.js$/, use: [{ loader: path.resolve('loaders/test.js') }], }] }, output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, plugins: [ new EndWebpackPlugin(() => { console.log('构建成功') }, err => { console.log(err) }) ] }