其他分享
首页 > 其他分享> > plugin的原理

plugin的原理

作者:互联网

plugin插件的原理

扩展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()

标签:const,assets,plugin,compilation,source,webpack,原理,compiler
来源: https://www.cnblogs.com/littlelittleship/p/16500470.html