V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dicc
V2EX  ›  问与答

js 如何重写库代码

  •  
  •   dicc · 2023-02-23 10:17:48 +08:00 · 1300 次点击
    这是一个创建于 631 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    达到目的:

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

    感谢大佬解答

    12 条回复    2023-02-23 17:26:11 +08:00
    dicc
        1
    dicc  
    OP
       2023-02-23 10:18:30 +08:00
    或者指明一个方向能让我搜到也行
    lzgshsj
        2
    lzgshsj  
       2023-02-23 10:23:06 +08:00
    你在你魔改的 modified-Xxx.js 里 export 改过的 Xxx ,其他地方直接引用 modified-Xxx.js 里的不就好了
    Xbathy
        3
    Xbathy  
       2023-02-23 10:23:22 +08:00
    直接让他引入你的 factory1 呗,又不是对象,感觉不太行.
    fishlium
        4
    fishlium  
       2023-02-23 10:25:12 +08:00
    @lzgshsj 我猜测他是想改了一个依赖,让他其他使用了这个依赖的其他依赖也使用修改后的方法
    TomVista
        5
    TomVista  
       2023-02-23 10:35:40 +08:00
    webpack 自定义插件
    dicc
        6
    dicc  
    OP
       2023-02-23 10:37:31 +08:00
    @fishlium 对的
    molvqingtai
        7
    molvqingtai  
       2023-02-23 10:48:49 +08:00
    可是使用 patch-package ,但是你不能保证其他其他库依赖的是和你修改的库是同一个版本
    dicc
        8
    dicc  
    OP
       2023-02-23 11:37:10 +08:00
    ![https://ibb.co/VW3NCVh]( https://ibb.co/VW3NCVh) 我先来个 py 版本的
    vivipure
        9
    vivipure  
       2023-02-23 11:37:42 +08:00
    上面提到的 patch-package 可以,但是不能保证所有库都 ok, 因为某些库可能已经打包过了。
    LLaMA2
        10
    LLaMA2  
       2023-02-23 14:30:05 +08:00
    简单,代码拉回来,改好,打包,放到工程根目录
    然后在自己过程的 package.json 的 dependencies 中
    "xxx": "file:xxx.tar.gz"
    AaronLee01
        11
    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
        12
    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 类,从而实现了重写第三方库代码的目的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.