webpack原理篇(六十四):更复杂的插件开发场景

Posted 凯小默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了webpack原理篇(六十四):更复杂的插件开发场景相关的知识,希望对你有一定的参考价值。

说明

玩转 webpack 学习笔记

插件中如何获取传递的参数?

通过插件的构造函数进行获取

module.exports = class MyPlugin 
    constructor(options) 
        this.options = options;
    
    apply() 
        console.log("apply", this.options);
    
;

插件的错误处理

参数校验阶段可以直接 throw 的方式抛出

throw new Error("Error Message")

通过 compilation 对象的 warnings 和 errors 接收

compilation.warnings.push("warning");
compilation.errors.push("error");

通过 Compilation 进行文件写入

Compilation 上的 assets 可以用于文件写入

  • 可以将 zip 资源包设置到 compilation.assets 对象上

文件写入需要使用 webpack-sources:https://github.com/webpack/webpack-sources

const  RawSource  = require("webpack-sources");
module.exports = class DemoPlugin 
    constructor(options) 
        this.options = options;
    
    apply(compiler) 
        const  name  = this.options;
        compiler.plugin("emit", (compilation, cb) => 
            compilation.assets[name] = new RawSource("demo");
            cb();
        );
    
;

插件扩展:编写插件的插件

插件自身也可以通过暴露 hooks 的方式进行自身扩展,以 html- webpack-plugin 为例:

  • html-webpack-plugin-alter-chunks (Sync)
  • html-webpack-plugin-before-html-generation (Async)
  • html-webpack-plugin-alter-asset-tags (Async)
  • html-webpack-plugin-after-html-processing (Async)
  • html-webpack-plugin-after-emit (Async)

在插件的事件节点进行监听,一旦执行到就可以根据获取到的资源进行处理。

以上是关于webpack原理篇(六十四):更复杂的插件开发场景的主要内容,如果未能解决你的问题,请参考以下文章

webpack原理篇(六十五):实战开发一个压缩构建资源为zip包的插件

webpack原理篇(六十三):插件基本结构介绍

webpack原理篇(六十二):实战开发一个自动合成雪碧图的loader

webpack原理篇(六十):使用 loader-runner 高效进行 loader 的调试

深度学习核心技术精讲100篇(六十四)-特征选择原理及应用实战案例

webpack拓展篇(六十九):vite 的构建原理(完结)