最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 实现一个简单的webpack的plugin插件

    正文概述 掘金(Lovely)   2021-06-24   664

    简介

    本次分享如何实现一个简单的plugin插件

    创建自定义plugin步骤

    • 声明一个js函数或class类(大驼峰命名)
    • 定义一个原型方法apply,apply方法接收一个compiler对象,我们可以在apply方法中调用compiler对象的hooks事件。使用compilation操纵修改 webpack 内部实例特定数据。
    • 在功能完成后调用 webpack 提供的回调。
    callback();
    // or
    callback(error);
    

    知识准备

    创建自定义plugin步骤我们是知道了,那compiler对象是什么?我们又如何操作 webpack 内部实例特定数据呢?

    compiler

    Compiler是 webpack 的主要引擎,它通过 CLI(通常我们在webpack.config.js配置的参数) 传递的所有选项, 或者 Node API,创建出一个 compilation 实例。它扩展自 Tapable 类,用来注册调用插件。

    compiler暴露的生命周期hooks函数

    • compiler.hooks.emit,生命周期:输出 asset 到 output 目录之前执行。
     compiler.hooks.emit.tap('clean-webpack-plugin', compilation => {
       // 执行操作
     });
    
    • compiler.hooks.done,生命周期:在 compilation 完成时执行
     hooks.done.tap('clean-webpack-plugin', stats => {
       // 执行操作
     });
    
    • compiler.hooks.shouldEmit,生命周期:在输出 asset 之前调用。返回一个布尔值,告知是否输出。
    compiler.hooks.shouldEmit.tap('MyPlugin', (compilation) => {
      // 返回 true 以输出 output 结果,否则返回 false
      return true;
    });
    

    compiler的钩子函数有很多,我们不需要都去了解,在需要用的时候去查API即可: webpack.docschina.org/api/compile…

    compilation

    compilation模块会被compiler用来创建新的 compilation 对象。 compilation实例能够访问所有的模块和它们的依赖,它会对应用程序的依赖图中所有模块, 进行字面上的编译,在编译阶段,模块会被加载(load)、封存(seal)、优化(optimize)、 分块(chunk)、哈希(hash)和重新创建(restore)。

    compilation暴露的生命周期hooks函数

    • compilation.hooks.buildModule,生命周期:在模块构建开始之前触发,可以用来修改模块。
    compilation.hooks.buildModule.tap(
      'SourceMapDevToolModuleOptionsPlugin',
      (module) => {
        module.useSourceMap = true;
      }
    );
    
    • compilation.hooks.failedModule,生命周期:模块构建失败时执行。
    compilation.hooks.failedModule.tap(
      'SourceMapDevToolModuleOptionsPlugin',
      (module, error) => {
        // 执行操作
      }
    );
    

    不一一例举,附上API文档:webpack.docschina.org/api/compila…

    compilation 对象方法

    • compilation.getStats(),返回当前编译的状态对象
    • compilation.addEntry(),为编译添加入口。
    • compilation.finish(),完成编译并调用给定的回调。

    不一一例举,附上API文档:webpack.docschina.org/api/compila…

    基于以上的基础一个简单的plugin插件就出来啦!

    class CleanWebpackPlugin {
        // 构造函数
        // 查看options具体参数: https://github.com/johnagan/clean-webpack-plugin#options-and-defaults-optional
        constructor(options) {
            console.log(options, 'options');
        }
    
        apply(compiler) {
            console.log(compiler, 'compiler')
            // 绑定钩子事件
            const hooks = compiler.hooks;
            hooks.done.tap('clean-webpack-plugin', stats => {
                console.log('done~')
            });
        }
    
    }
    

    引入自定义plugin

    这个就很简单了,像平时引入plugin那样引入就OK了

    // 引入插件
    const {  CleanWebpackPlugin } = require('./clean-webpack-plugin');
    module.exports = {
      plugins: [
       // 实例化构造函数
        new CleanWebpackPlugin(),
      ]
    }
    

    最后

    感谢大家阅读,如有问题欢迎纠正!


    起源地下载网 » 实现一个简单的webpack的plugin插件

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元