扩展webpack, 加入自定义的构建行为
webpack内部的钩子 hooks
Compiler构建对象, 保存着完整的webpack环境配置
Compilation对象代表一次资源的构建, 可以访问所有模块和它们的依赖
创建一个plugin
/** * 1. webpack加载webpack.config.js的所有配置, 此时会new 插件, 执行插件的constructor方法 * 2. webpack创建compiler对象 * 3. 遍历所有plugins里面的插件, 调用插件的apply方法 * 4. 执行剩下的编译流程, 触发各个hook事件 */ class BannerWebpackPlugin { constructor() { } apply(compiler) { // emit 文件输出前, tapAsync 异步 compiler.hooks.emit.tapAsync("BannerWebpackPlugin", compilation => { // 获取输出资源: compilation.assets // 只处理 js , css, 图片不能处理 const extensions = ['css', 'js'] // 获取需要处理的文件类型 const assets = Object.keys(compilation.assets).filter(asset => { const arr = asset.split('.') const fileExt = arr[arr.length - 1] return extensions.includes(fileExt) }) const prefix = `/* * Author: 法外狂徒 */ ` assets.forEach(asset => { // 获取原来的内容 source() const source = compilation.assets[asset].source() const content = prefix + source compilation.assets[asset] = { // 最终输出资源时,调用source方法, source方法的返回值是资源的具体内容 source() { return content }, // 资源大小 size() { return content.length } } }) }) } } module.exports = BannerWebpackPlugin
使用
const BannerWebpackPlugin = require('../plugins/banner-webpack-plugin') new BannerWebpackPlugin()