当前位置: 首页 > article >正文

webpack自定义插件 ChangeScriptSrcPlugin

插件文件

class ChangeScriptSrcPlugin {
  apply(compiler) {
    const pluginName = "ChangeScriptSrcPlugin";
    compiler.hooks.compilation.tap(pluginName, (compilation, callback) => {
      compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(
        pluginName,
        (htmlPluginData, callback) => {
          htmlPluginData.body
            .filter(item => {
              const { attributes } = item;
              return (
                attributes.src.includes("main") &&
                attributes.type === "text/javascript"
              );
            })
            .forEach(ele => {
              ele.attributes.src = ele.attributes.src.replace(
                "http://localhost:3000/",
                "http://localhost:3000/"
              );
            });
          callback(null, htmlPluginData);
        }
      );
    });
  }
}

module.exports = ChangeScriptSrcPlugin;

配置文件 webpack.config.js

// webpack.config.js
var ChangeScriptSrcPlugin = require('ChangeScriptSrcPlugin.js');

module.exports = {
  // ... 这里是其他配置 ...
  plugins: [new ChangeScriptSrcPlugin()],
};

一、compiler 和 compilation的区别 和 作用

/** 1、compiler(编译器)  和 compilation(编译)的区别 和 作用
     * 打包是被细分为很多个子进度的。
     * compiler 是 webpack 打包过程的一个编译器,这个对象上有打包过程中的很多钩子函数。
     * compilation 是 compiler上的一个子进度,也包含了许多钩子函数。htmlWebpackPluginAlterAssetTags就是其中一个
     *
     * 在编译的每个阶段中,任何插件都拥有对 compiler 对象的完全访问能力,
     * 并且在合适的时机,还可以访问当前的 compilation 对象。
   *
   * compiler 
   * 1. 包含整个构建流程的全部钩子,通过它可以把控整个 webpack 构建周期。
   * 2. 在运行期间 compiler 会根据 webpack 不同阶段触发的各种事件钩子,执行插件附加/绑定在 hook 上的函数。
   * 3. 只是负责维持生命周期运行的功能,所有的加载、打包和写入工作,都被委托到注册过的插件上了。
   * 4. 对象代表的是构建过程中不变的 webpack 环境,整个 webpack 从启动到关闭的生命周期。针对的是webpack。
   * 
   * compilation 
   * 1. 只代表一次新的编译,只要项目文件有改动,compilation 就会被重新创建。针对的是随时可变的项目文件。
   * 2. 负责:构建 module 和 chunk,并利用插件优化构建过程,同时把本次打包编译的内容全存到内存里

作者:AizawaSayo
链接:https://www.jianshu.com/p/fb3a8182838c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     * */

2. htmlWebpackPluginAlterAssetTags 方法

/** 2、htmlWebpackPluginAlterAssetTags
 *  上边这个钩子函数,必须得让webpack使用  📚📚htmlWebpackPlugin📚 才能访问
 *  HtmlWebpackPlugin 简化了 HTML 文件的创建,以便为你的 webpack 包提供服务。这对于那些文件名中包含哈希值,并且哈希值会随着每次编译而改变的 webpack 包特别有用。
 * */

3. tabTable

/** 3、Tabable  类的方法
  * 参考 https://zhuanlan.zhihu.com/p/367931462 理解Tapable
  * Tabable 
  * Tapable 使用时通常需要经历如下步骤:
  *  1. 创建钩子实例
  *  2. 调用【订阅接口】,【注册】回调,包括:tap、tapAsync、tapPromise
  *  3. 调用【发布接口】,【触发】回调,包括:call、callAsync、promise
        (之前我一直以为 发布订阅 是 先发布 再订阅,注册是在发布这一步做的。) 
   *
   * 同步 hook 只能使用 tap 方法;而异步 hook 除了 tapAsync 和 tapPromise 这些异步方法,也支持用 tap 方法让 hook 以同步方式运行。
     * */

在这里插入图片描述


http://www.kler.cn/news/356860.html

相关文章:

  • 结合seata和2PC,简单聊聊seata源码
  • 暴雨讲堂:AI已成为交叉学科科研工具
  • 监督学习、无监督学习、半监督学习、强化学习、迁移学习、集成学习分别是什么对应什么应用场景
  • Facebook Marketplace无法使用的原因
  • 【Bootstrap】bootstrap-table 的打印按钮功能正常但缺失图标
  • python爬虫加解密分析及实现
  • OSI参考模型与TCP/IP模型
  • 《深空彼岸》TXT完整版下载,知轩藏书校对版!
  • QGIS的入门(实习指导)
  • Android SELinux——其他常见策略⽂件(十一)
  • Go语言基础学习(Go安装配置、基础语法)
  • SpringBoot实现桂林旅游的智能推荐
  • LED显示屏与手机连接:简单便捷的操作指南
  • Apache Seatunnel Zeta引擎-启动脚本分析
  • 【Hive】6-Hive函数、运算符使用
  • [mysql]mysql的全部单行函数
  • TCP 全连接队列与 tcpdump 抓包
  • JAVA学习-练习试用Java实现“成绩归类”
  • 前端考试总结
  • 机器学习——图神经网络