在节点模块文件夹中编辑 react npm 模块的代码
Editing code of react npm modules in node module folder
是否可以更改模块文件夹中的 npm 模块代码?我认为这不是推荐的做法,还有其他方法可以实现吗?目前,我尝试更改模块目录中的代码,但这些更改似乎并不适用。提前致谢。
不建议直接修改node_modules
中的包,因为当你重新安装包时你所做的更改将消失,并且你无法与他人共享你的更改。考虑例如在 GitHub 上分叉项目并在那里进行更改,然后将其用作包。
如果您只是想试验一下,修改 node_modules
中的包仍然有效。如果包的 package.json
的 main
字段指向构建文件,您可能必须将此字段更改为源条目文件,或者在源中的每次更改后自行构建文件。
当然,您可以更改 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();
}
...
}
是否可以更改模块文件夹中的 npm 模块代码?我认为这不是推荐的做法,还有其他方法可以实现吗?目前,我尝试更改模块目录中的代码,但这些更改似乎并不适用。提前致谢。
不建议直接修改node_modules
中的包,因为当你重新安装包时你所做的更改将消失,并且你无法与他人共享你的更改。考虑例如在 GitHub 上分叉项目并在那里进行更改,然后将其用作包。
如果您只是想试验一下,修改 node_modules
中的包仍然有效。如果包的 package.json
的 main
字段指向构建文件,您可能必须将此字段更改为源条目文件,或者在源中的每次更改后自行构建文件。
当然,您可以更改 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();
}
...
}