介入webpack 的打包流程,将某个包给mock 掉

news/2025/3/1 17:06:40/文章来源:https://www.cnblogs.com/kongshu-612/p/18745041

介入webpack 的打包流程,将某个包给mock 掉

在某些情况下,我们对于包的体积比较敏感,某些第三方的包引用了其他第三方的包,而且第三方的包不支持摇树,我们希望在打包的时候将第三方包所依赖的第三方包给去除掉,因为那部分功能我们并不使用。思路是采用mock 的方式,将第三方的第三方包给去除。

被测试代码的例子

// index.js
// 这个里面直接import 的modA 不mock, modB 里面的 modA要mock
import {greeting} from './modA/modA';
import {greetingWrapper} from './modA/modB';
greetingWrapper();
greeting();// modA.js 
import {debounce} from 'lodash';
export const greeting=debounce(()=>`hello world`,10);// modB.js  这个里面的modA 要mock
import { greeting } from "./modA";
export const greetingWrapper = ()=>{greeting();
}// mock_modA.js
export const greeting=()=>`hello world from mock moduleA`;

webpack plugin

我们可以借助webpack 的plugin, 在normalModuleFactory这个hook里面将某个issuer里面所使用的requet给替换掉,这个是webpack 的插件,可以直接使用

class ReplacePlugin{apply(compiler){compiler.hooks.normalModuleFactory.tap('ReplacePlugin', (normalModuleFactory) => {normalModuleFactory.hooks.beforeResolve.tapAsync('ReplacePlugin', (result, callback) => {// 条件判断,issuer 就是使用方,request 就是被导入的模块if(result && /modA(\.js)?$/i.test(result.request) && result.context.issuer && /[\\/]modB(\.js)?$/i.test(result.context.issuer)){// 把request 的路径给替换掉result.request = result.request.replace(/modA(\.js)?$/i, 'mock_modA$1');}callback();});});}
}

webpack resolve 的plugin

借助webpack 的resolve, 在它解析的时候将被使用的模块给替换掉

class ResolvePlugin{apply(resolver){resolver.hooks.resolve.tapAsync('ResolvePlugin', (request, resolveContext, callback) => {const requestPath = request.request;if(/\/modA(\.js)?$/i.test(requestPath) && request.context.issuer && /[\\/]modB(\.js)?$/i.test(request.context.issuer)){console.log(request.context.issuer);const newRequest ={...request,request: requestPath.replace(/modA(\.js)?$/i, 'mock_modA$1'),};return resolver.doResolve(resolver.hooks.resolve, newRequest, `Redirecting ${requestPath} -> ${newRequest.request}`, resolveContext, callback);}callback();});}
}// webpack 的配置
const ResolvePluginInstance = new ResolvePlugin();
resolve:{extensions:['.js'],plugins:[// 记得构建实例ResolvePluginInstance]},

总结

这两种方式经过测试都可以实现我们预设的目标,但是推荐使用resolve 的这种方式,因为它只是发生在文件resolve 的时候,效率更高

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode hot 15

解题思路:思路还是比较清晰,先按照起始位置排序,然后再逐个遍历,根据起始位置与前一个结束位置进行比较,两种情况进行处理即可(这边代码比较麻烦因为前面list泛型用错了) import java.util.Arrays; class Solution {public int[][] merge(int[][] intervals) {List<Lis…

WgelCTF打靶笔记(2)

参考视频:https://www.bilibili.com/video/BV1itwgeHEEk/?spm_id_from=333.1387.upload.video_card.click&vd_source=e948147c25027ef3216b5c376b31fc96扫描dirb: 发现.ssh有一个id_rsa文件,即ssh连接私钥,右键下载到本地 ssh私钥: SSH:用于安全的连接到远程服务器 …

44页五角星绘制

点击查看代码 from turtle import * fillcolor("red") begin_fill() while True:forward(200)right(144)if abs(pos()) < 1:break end_fill()

Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?

前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进。让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 https://github.com/voidint/g/releases 下载适合您系统的版本。例如,如果您的系统是 64 位的,可以下载 g1.7.0.window…

FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)

title: FastAPI极速入门:15分钟搭建你的首个智能API(附自动文档生成)🚀 date: 2025/3/1 updated: 2025/3/1 author: cmdragon excerpt: 用虚拟环境打造纯净开发空间的3种方法 只需5行代码实现智能API端点 自动生成媲美大厂的交互式API文档 解决新手必踩的9大坑点(含依赖…

rocketmq不同服务使用相同消费者组和生产者组的问题

之前多个服务使用同一个消费者组和生产者组procfg-consumer-group和procfg-produce-group,然后共享同一个Topic。 时不时会有问题,例如主控服务版本更新之后虽然消息发出来了,但是终端接收不到,消息有时会有CONSUMED_BUT_FILTERED(被过滤)个人理解的原因是多个服务用同一个…

用python画了一个五星红旗

点击查看代码 import turtle# 设置屏幕 screen = turtle.Screen() screen.bgcolor("white") screen.setup(width=800, height=600) # 设置窗口大小# 设置画笔 pen = turtle.Turtle() pen.speed(10) pen.penup()# 绘制红旗背景 def draw_rectangle(color, width, hei…

gitlab使用自建nginx反向代理

参考文档:https://www.cnblogs.com/suruozhong/p/12468167.html 一、修改配置文件 vim /etc/gitlab/gitlab.rb# 让gitlab的内置nginx监听9002端口 nginx[listen_port] = 9002# 设置gitlab的访问路径(是通过外部nginx反向代理访问的) external_url http://域名/git例如: # 让…

Codeforces Round 1007 (Div. 2) 比赛记录

Codeforces Round 1007 (Div. 2) 比赛记录 比赛链接 很喜欢的一场比赛,题目质量很高,不是手速场,做出题超级有成就感,赛时切掉了 A - D1,上大分了。 B卡得有点久,其实是一个很常用的构造手法但一开始没想到。 过题记录:A. The Play Never Ends 题意大概就是,每场两个人…

20241901 《网络攻防实践》第1周作业 丁奕中

网络拓扑图 ,受限于内存,我只配置了四台虚拟机:虚拟机 角色kali 攻击机seed 主机Win2000server 靶机Honeywall 蜜网网关因为先解压好了Honeywall,所以先安装提权后没进配置菜单,然后意识到新建虚拟机的时候不能直接打开,重新建一次加两块网卡,分别是VMnet1和VMnet8这次启…

实验设备环境配置

1、拷贝安装Anacondabash Anaconda3-2024.10-1-Linux-x86_64.sh bim@bim-AG55:~$ bim@bim-AG55:~$ cd Anaconda bim@bim-AG55:~/Anaconda$ bim@bim-AG55:~/Anaconda$ bim@bim-AG55:~/Anaconda$ bim@bim-AG55:~/Anaconda$ ls Anaconda3-2024.10-1-Linux-x86_64.sh bim@bim-A…

面向对象学习笔记2 - Java类的实例化与内存解析

前言 在Java编程中,理解对象实例化的内存机制是掌握面向对象编程的核心。本文将以Person类为例,结合内存模型(栈、堆、方法区),深入剖析单个对象、多个对象以及引用赋值的底层内存变化。一、内存模型基础概念栈(Stack):存储方法调用和局部变量(如基本类型变量、对象引用…