在节点模块文件夹中编辑 react npm 模块的代码

Editing code of react npm modules in node module folder

是否可以更改模块文件夹中的 npm 模块代码?我认为这不是推荐的做法,还有其他方法可以实现吗?目前,我尝试更改模块目录中的代码,但这些更改似乎并不适用。提前致谢。

不建议直接修改node_modules中的包,因为当你重新安装包时你所做的更改将消失,并且你无法与他人共享你的更改。考虑例如在 GitHub 上分叉项目并在那里进行更改,然后将其用作包。

如果您只是想试验一下,修改 node_modules 中的包仍然有效。如果包的 package.jsonmain 字段指向构建文件,您可能必须将此字段更改为源条目文件,或者在源中的每次更改后自行构建文件。

当然,您可以更改 node_modules 中的包内容,因为它是一种标准格式。但是,您不应该这样做,因为您应该提交更改并重新分发它们。

不幸的是,这个问题的解决方案并不简单,这是我过去一直在努力解决的问题。

npm link

第一种方法是在本地克隆 repo 并使用 npm link 在您的项目中使用它。

npm link ../path/to/my/proj

这种方法的缺点是您仍然必须手动下载存储库才能使用它,并且 npm link 使您的 linked 版本成为 包在您的系统上全局使用可能会产生意想不到的副作用。话虽如此,如果您想在本地测试对包的更改并将它们贡献到上游,npm link 可能是最好的方法。

使用分叉的 git 存储库

您也可以通过执行以下操作直接从分叉的 git 存储库安装它:

npm install --save $GIT_REPO_URL

但是使用这种方法,您需要具有访问 git 存储库的凭据,因此在处理私有存储库等时会出现额外的复杂性,尤其是在处理 CI 时环境。此外,您应该包括一个 commitish,以便您可以获得可重现的构建——尽管在不使用 npm link 的情况下开发它有点痛苦。 You can consult the npm documentation for other install options or for more specifics如果您不必担心这些事情,这是一个很好的方法。

本地 npm 模块

完成更改后,您还可以像这样将分叉版本安装到您​​的项目中:

npm install --save ../path/to/my/proj

但是,您实际上可以让另一个 NPM 项目成为您项目的一部分,其中包含 git 子模块、git 子树或使用 monorepo。对于一个团队来说,这可能是一个很好的方法,但对于您正在尝试做的事情来说可能有点矫枉过正,而且您需要考虑很多工具才能使它成为一个很好的方法。

发布你自己的 npm 模块

不幸的是,所有先前的方法都假设这些包没有构建过程,或者它们是通过 npm's postinstall scripts 之类的东西自动构建的。但是,一些 npm 模块是通过发布特定的构建目录来编写的,这使得 npm 上的内容与源代码有很大不同。

在这些情况下,您需要将构建发布到 npm 可以安装的地方。这包括 public scoped package、私有 npm 存储库或将您的 npm 模块发布到个人工件服务器。

对我来说,最好的方法是,正如@Kevin Raoofi 所说,克隆包并发布我自己的包,然后将我的包下载到特定文件夹中,其中只有“myNpmPackages”。

然后:

  • 在你的项目中,安装你的克隆
  • 在您的 json 中输入“*”,以便始终更新 pkj
  • 编辑包(在您的“myNpmPackages”文件夹中)
  • 更改版本号
  • npm 发布
  • 在你的项目中,npm install

您也可以使用补丁。

在 React Native 世界中,它工作得相当可靠 - 所以我猜它也可以在 React 世界和许多其他依赖 npm 的世界中工作。

补丁包

是一个 与 npm 和 yarn 一起工作的库(注意:对于 yarn,请参阅它们的安装说明)。 您可以为 本地文件夹 node_modules 中的库(也 嵌套 )制作补丁,或应用补丁仅适用于开发依赖项(忽略生产构建中的补丁)。

Link 就在这里:https://www.npmjs.com/package/patch-package

1.Making 补丁

首先对 node_modules 文件夹中特定包的文件进行 更改,然后 运行

npm patch-package package-name-where-you-made-changes
// or
// yarn patch-package package-name-where-you-made-changes 

如果您尝试修补嵌套包,例如node_modules/package/node_modules/another-package 你可以在包名之间放一个 /:

npx patch-package package/another-package

它也适用于 作用域包

npx patch-package @my/package/@my/other-package

2.'/patches'文件夹

如果这是您第一次使用补丁包,它将在 root 目录 中创建一个名为 patches 的文件夹你的应用程序。里面会有一个名为 package-name+0.44.0.patch 之类的文件,它是普通旧包名和固定版本之间的 Git diff .

3.Sharing 团队补丁

简单地说,将 'patches' 文件夹中的文件(补丁)提交到存储库。

当其他团队成员(或CI服务)运行s npm install时,自动执行补丁(使用npm post-install script underhood) - 如果您想自定义此行为(例如排除一些补丁等),请参阅补丁包官方文档。

4.TIP:

如果包托管在 Github(并且您已登录),您可以 运行 使用相同的 patch-package 命令 --create-issue 参数,所以它会自动创建一个 pull-request,在主 repo 中应用补丁(以便维护者可以修复问题):

npm patch-package package-name-where-you-made-changes --create-issue
// or
// yarn patch-package package-name-where-you-made-changes

5.TIP:

要还原补丁,运行 使用 --reverse 参数:

npm patch-package package-name-where-you-made-changes --reverse

就我而言,我无法接受上述所有方法,因为我需要进行一些小的更改。 所以我从 node_module 文件夹中导入了一些必要的 classes 并在我的源代码树中覆盖了它们。

假设我们需要从已安装的 node_module: 计算机更改 class“计算机”。

import
{
    RAM,
    Display,
    HardDisk
} from "computer"

class Computer{
    constructor() {
        this._ram = new RAM();
        this._display = new Display();
        this._hardDisk = new HardDisk();
    }

    ...
}

然后您可以这样更改,例如在您的源代码树中。

import
{
    RAM,
    Display,
    HardDisk
} from "computer"

// assume you made additional classes, Keyboard, Mouse 
import {KeyBoard, Mouse} from "./mysourceTree"

class Computer{
    constructor() {
        this._ram = new RAM();
        this._firstDisplay = new Display();
        this._hardDisk = new HardDisk();
        
        
        this._keyBoard = new Keyboard();
        this._mouse = new Mouse();
    }

    ...
}