核心
- Webpack插件通常是一个
类,里面包含apply方法,接收compiler对象
- apply方法会在Webpack编译器
实例化时被调用,并接收编译器对象(compiler)作为参数
基本核心结构
class MyWebpackPlugin {
construtor(option) {
this.option = option
}
apply(compiler) {
}
}
apply方法解释
- compiler
- apply方法接收的参数,代表Webpack
编译器实例
- compiler.hooks
- 常用钩子类型
- tap()
- 同步钩子
- 用于注册事件监听器,第一个参数是插件名称,第二个参数是回调函数
- tapAsync()
- tapPromise()
常用钩子示例
class MyWebpackPlugin {
apply(compiler) {
compiler.hooks.done.tap('MyWebpackPlugin', (stats) => {
console.log('构建完成')
})
}
}
class MyWebpackPlugin {
apply(compiler) {
compiler.hooks.done.tapAsync('MyWebpackPlugin', (compilation, callback) => {
compilation.assets['new-file.txt'] = {
source: () => 'This is MyWebpackPlugin',
size: () => 42
}
callback()
})
}
}
class GenerateVersionPlugin {
construtor(options = {filename: 'version.js'}) {
this.options = options
}
apply(compiler) {
compiler.hooks.emit.tagAsync('GenerateVersionPlugin', (compilation, callback) => {
const version = {
timestamp: Date.now(),
hash: compilation.hash,
version: require('./package.json').version
}
const content = JSON.stringify(version, null, 2)
compilation.assets[this.options.filename] = {
source: () => content,
size: () => content.length
}
callback()
})
}
}
const GenerateVersionPlugin = require('./plugin/generate-version-plugin')
module.exports = {
plugins: [
new GenerateVersionPlugin({
filename: 'app-version.js'
})
]
}
关键概念说明
- compiler
- 代表
完整的Webpack环境,贯穿整个构建生命周期
- compilation
调试技巧
console.log(Array.from(compilation.fileDependencies))
console.log(Object.keys(compilation.assets))
ndb node_modules/webpack/bin/webpack.js
可通过webpack实现
- 打包产物二次处理
- 定义构建日志分析
- 自动生成说明文档
- 部署文件上传
- 自定义构建监控等高级功能