js 如何重写库代码

2023-02-23 10:17:48 +08:00
 dicc

比如有个第三方库 Xxx, 它原本有属性 Factory (为 class) 我先给它引入后, 然后给它 Xxx.Factory = Factory1 (继承于 Factory, 然后修改了几个方法)

达到目的:

当其他库 require 或 import 用到 Xxx 时,他们所用的 Factory 其实为我自定义的 Factory1

感谢大佬解答

1309 次点击
所在节点    问与答
12 条回复
dicc
2023-02-23 10:18:30 +08:00
或者指明一个方向能让我搜到也行
lzgshsj
2023-02-23 10:23:06 +08:00
你在你魔改的 modified-Xxx.js 里 export 改过的 Xxx ,其他地方直接引用 modified-Xxx.js 里的不就好了
Xbathy
2023-02-23 10:23:22 +08:00
直接让他引入你的 factory1 呗,又不是对象,感觉不太行.
fishlium
2023-02-23 10:25:12 +08:00
@lzgshsj 我猜测他是想改了一个依赖,让他其他使用了这个依赖的其他依赖也使用修改后的方法
TomVista
2023-02-23 10:35:40 +08:00
webpack 自定义插件
dicc
2023-02-23 10:37:31 +08:00
@fishlium 对的
molvqingtai
2023-02-23 10:48:49 +08:00
可是使用 patch-package ,但是你不能保证其他其他库依赖的是和你修改的库是同一个版本
dicc
2023-02-23 11:37:10 +08:00
![https://ibb.co/VW3NCVh]( https://ibb.co/VW3NCVh) 我先来个 py 版本的
vivipure
2023-02-23 11:37:42 +08:00
上面提到的 patch-package 可以,但是不能保证所有库都 ok, 因为某些库可能已经打包过了。
LLaMA2
2023-02-23 14:30:05 +08:00
简单,代码拉回来,改好,打包,放到工程根目录
然后在自己过程的 package.json 的 dependencies 中
"xxx": "file:xxx.tar.gz"
AaronLee01
2023-02-23 17:19:52 +08:00
假如你要修改是是 C ,A ,B 依赖 C ,可以直接去改 node_module 下面 C 的 package.json 里的 main 文件对应的地方,这样就能保证你的修改对 A ,B 起作用了,测试 ok 的话再用 patch-package 持久化修改,避免重新 install 覆盖
reallg
2023-02-23 17:26:11 +08:00
不会编程,试着 gpt 一下,贴上回答 ,以下是回答内容:
------------------------------------------

要重写第三方库中的代码,可以先在自己的项目中引入该库,然后直接修改该库中的代码。但这样做有一定的风险,如果该库在更新时修改了代码,那么你的修改就会被覆盖。

另一种更好的方法是,通过继承原本的库,重新实现你需要修改的方法。具体来说,你可以创建一个新的类 Factory1 ,继承 Xxx 库中的 Factory 类,然后在 Factory1 类中重新实现你需要修改的方法。最后,将 Xxx.Factory 指向 Factory1 ,这样其他库在使用 Xxx 时,就会使用你自定义的 Factory1 类。

下面是一段示例代码,可以帮助理解这个过程:

// 引入 Xxx 库
const Xxx = require('Xxx');

// 自定义 Factory1 类
class Factory1 extends Xxx.Factory {
// 重新实现 foo 方法
foo() {
console.log('This is the modified foo method.');
}

// 重新实现 bar 方法
bar() {
console.log('This is the modified bar method.');
}
}

// 将 Xxx.Factory 指向 Factory1
Xxx.Factory = Factory1;


这样,在其他库 require 或 import 使用 Xxx 时,实际上会使用你自定义的 Factory1 类,从而实现了重写第三方库代码的目的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX