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 以同步方式运行。
     * */

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/895970.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW提高开发效率技巧----节省内存

在LabVIEW开发过程中,内存管理是保障程序稳定性和性能的关键。本文将详细介绍如何通过队列处理来节省内存,尤其是如何通过解耦释放不再需要的数据,防止内存泄漏。通过多个实际例子,从不同角度探讨队列处理在大数据量或长时间运行的…

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作,从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例,并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

C0027.在Clion中解决CPU和内存过高的问题

解决办法 最新版的 clion 在 advance setting里,可以勾选 Use the Resharper C language engine (CLion Nova)。 有显著的性能提升。

深入探索JavaCV:功能强大的Java计算机视觉库

🧑 博主简介:历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,…

积木报表静态资源不生效,界面乱码 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 从实战中分析问题,解决问题,以下笔记学习为主 关于JimuReport的网站:文档中心 1. 问题所示 引入积木报表之后,界面静态文件不生效,最终截图如下: 大致浏览器终端报错如下: 基本信息如下: Uncaught SyntaxError: U…

项目管理的坎坷之路与 MBTI 的启示录

项目管理这一路走来,经历了无数的坎坷、不顺和阻碍。幸运的是,遇见 MBTI 之后,我仿佛看到了新的希望,终于我也看到了花团锦簇,也看到了灯彩佳话。那一夜,我也曾梦见百万雄兵。 什么是 MBTI ? M…

AI大模型学习路线路径,巨详细!

大模型技术已经成为推动人工智能发展的关键力量。无论你是初学者还是有经验的开发者,想要掌握大模型应用,都需要遵循一定的学习路线。 从核心技术解析到模型微调与私有化部署,逐步深入大模型应用的世界。 这份学习路线图详细的介绍了那年每…

gitee建立/取消关联仓库

目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件,右击,选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…

【CSS3】css开篇基础(3)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

经营异常移除申请操作流程

经营异常是怎么回事?是什么意思?企业工商异常通常由以下几个原因造成1.未及时填报年度报告(补报年报后解除,目前新规最高罚款一万)2.公司地址是挂靠或者搬迁地址未及时变更,被列入地址异常名录。&#xff0…

MFC工控项目实例二十六创建数据库

承接专栏《MFC工控项目实例二十五多媒体定时计时器》 用选取的型号为文件名建立文件夹,再在下面用测试的当天的时间创建文件夹,在这个文件中用测试的时/分/秒为数据库名创建Adcess数据库。 1、在StdAfx.h文件最下面添加代码 #import "C:/Program F…

flutter TabBar自定义指示器(带文字的指示器、上弦弧形指示器、条形背景指示器、渐变色的指示器)

带文字的TabBar指示器 1.绘制自定义TabBar的绿色带白色文字的指示器 2.将底部灰色文字与TabrBar层叠,并调整高度位置与胶囊指示器重叠 自定义的带文字的TabBar指示器 import package:atui/jade/utils/JadeColors.dart; import package:flutter/material.dart; im…

LeetCode102. 二叉树的层序遍历(2024秋季每日一题 43)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2: 输入…

React 项目热更新失效问题的解决方案和产生的原因

背景和意义 在修复React项目热更新失效的问题时,经过一系列问题排查和依赖升级,最终成功修复了问题并为后续开发规避了类似的问题。 依赖升级 Vite版本升级 原React项目Vite版本升级到^4.4.5 Vite 4 在构建和开发服务器的性能上进行了优化&#xff…

气膜高尔夫:不惧天气,挥杆无忧—轻空间

高尔夫是一项户外运动,但恶劣天气常常成为阻碍。然而,在气膜高尔夫球馆中,无论外面下雨或酷暑,内部环境始终保持宜人,提供理想的打球体验。气膜技术为球员打造了一个全天候的运动空间,彻底摆脱了天气的束缚…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后,复测出一处中危漏洞:Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID,探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法: 1. 不应该使…

大数据治理:数据时代的挑战与应对

目录 大数据治理:数据时代的挑战与应对 一、大数据治理的概念与内涵 二、大数据治理的重要性 1. 提高数据质量与可用性 2. 确保数据安全与合规 3. 支持数据驱动的决策 4. 提高业务效率与竞争力 三、大数据治理的实施策略 1. 建立健全的数据治理框架 2. 数…

【Linux系统编程】冯诺依曼体系结构与操作系统

目录 1、冯诺依曼体系结构 1.1 冯诺依曼体系结构的组成 1.2 程序运行时必须要加载到内存 1.3 数据通信 1.4 为什么要有内存 2、操作系统 2.1 概念 2.2 设计OS的目的 2.3 如何理解管理 2.4 系统调用和库函数的概念 1、冯诺依曼体系结构 我们常见的计算机,如…

5g工业路由器最新案例:高原气象站网络升级项目

背景: 某省气象局决定在高原地区升级其气象观测网络,以提高天气预报的准确性和及时性,同时为气候变化研究提供更可靠的数据支持。该项目面临以下挑战: 需要在高原广袤且地形复杂的区域部署大量自动气象站,要求网络覆…

JAVA八股

快速失败(fail-fast) 设计的目的是为了避免在遍历时对集合进行并发修改,从而引发潜在的不可预料的错误。 通过迭代器遍历集合时修改集合: 如果你使用Iterator遍历集合,然后直接使用集合的修改方法(如add(…