React Native 详解 patch-package:如何优雅地修改 node_modules(打补丁)

38 阅读3分钟

React Native 详解 patch-package:如何优雅地修改 node_modules(打补丁)

在开发过程中,我们经常会遇到第三方库(node_modules)有 bug 或者不支持某些功能的情况。直接修改 node_modules 下的文件虽然能暂时解决问题,但一旦重新运行 npm install 或者同事拉取代码,这些修改就会丢失。

patch-package 就是为了解决这个问题而生的。它允许你持久化node_modules 的修改,并确保团队中的每个人都能自动应用这些修改。

1. 核心原理与配置解读

你提到的 package.json 中的两行代码是整个机制的核心:

L117: 工具依赖

"devDependencies": {
  "patch-package": "^8.0.1",
}
  • 作用:安装 patch-package 这个工具本身。
  • 目的:让你能够使用 npx patch-package <库名> 命令来生成补丁文件。

L13: 自动化钩子 (Hook)

"scripts": {
  "postinstall": "patch-package"
}
  • 作用:这是一个 npm 生命周期钩子。
  • 目的这是最关键的一步。每当你(或者你的 CI/CD 系统)运行 npm installyarn 安装依赖完成之后,npm 会自动执行 postinstall 指定的命令。
  • 流程npm install (下载原始包) -> postinstall (触发 patch-package) -> patch-package 会查找 patches/ 目录下的补丁文件 -> 自动将补丁应用到 node_modules 中

2. 环境要求

使用 patch-package 不需要复杂的环境,只需要标准的 Node.js 开发环境:

  • Node.js: >= 14 (推荐 LTS 版本)
  • 包管理器: npm, yarn, 或 pnpm 均可。
  • Git: 用于版本控制(必须提交生成的 .patch 文件)。

3. 完整操作流程 (Workflow)

假设我们要修改 @ant-design/icons-react-native 这个库(就像刚才做的那样)。

第一步:安装 patch-package (一次性设置)

如果项目中还没有配置,需要先安装并设置 postinstall 脚本。

# 安装
npm install patch-package --save-dev
# 或者
yarn add patch-package -D

# 配置 package.json (手动添加或修改)
# "scripts": {
#   "postinstall": "patch-package"
# }

第二步:直接修改源码

在你的 IDE 中,直接打开 node_modules/@ant-design/icons-react-native/react-native.config.js,进行你想要的修改。

  • 修改前assets: ['fonts']
  • 修改后// assets: ['fonts'] (注释掉,避免字体链接错误)

第三步:生成补丁 (Snapshot)

修改完成后,运行以下命令告诉 patch-package 你修改了哪个包:

npx patch-package @ant-design/icons-react-native

结果: 工具会在你的项目根目录下自动生成一个文件夹 patches/,里面有一个文件,例如 @ant-design+icons-react-native+2.3.2.patch。这个文件记录了你的修改内容(diff)。

第四步:提交代码

将生成的 patches/ 目录和 package.json 的变动提交到 Git。

git add patches/ package.json
git commit -m "fix: patch @ant-design/icons-react-native to disable font linking"

第五步:验证与自动应用

  • 你自己:下次你删除了 node_modules 重新 yarn 时,补丁会自动应用。
  • 你的同事:拉取最新代码并运行 yarn 后,补丁也会自动应用,他们的 node_modules 会和你的一模一样。

4. 总结

文件/命令作用
node_modules/...临时修改源码的地方。
npx patch-package <包名>将你的临时修改保存为补丁文件。
patches/*.patch补丁文件,必须提交到 Git
"postinstall": "patch-package"确保每次安装依赖后,补丁都会被重新应用

这就是为什么我们在 package.json 中需要那两行配置。它们保证了“一次修改,永久生效,团队共享”。