Skip to main content

使用 patch-package 修改 node_modules 中的包

背景

在项目开发过程中,常常会遇到网上现有的开源插件并不能满足实际项目的预期,需要对源码进行修改。

修改源码往往有下面两种方式:

  1. 直接在项目 node_modules 下找到插件的源码直接修改,但是一旦重新安装就会失效,不方便维护使用
  2. 去 github 上 fork 代码到自己的仓库进行修改,并将修改后的代码发布到 npm 上使用,但是步骤十分麻烦

因此,推荐使用 patch-package 来修改源码,不受重新安装的影响。

使用

安装

npm install patch-package

修改文件

直接在 node_modules 中找到要修改依赖包的相关文件,直接修改

创建/更新补丁

npx patch-package package-name

package-name 就是要修改的依赖包名,例如我修改的是 @docusaurus/core

执行完成后,会在项目根目录的 patches 目录中创建补丁文件 @docusaurus+core+2.4.1.patch(2.4.1 是依赖包版本),这个补丁需要提交到代码仓库中

创建补丁

@docusaurus+core+2.4.1.patch

嵌套模块

支持修改依赖包的依赖包

例如修改 node_modules/@docusaurus/core/node_modules/chalk 包中的文件,通过 / 分隔

npx patch-package @docusaurus/core/chalk

额外选项

  • --use-yarn:patch-package 默认是根据项目中的 lockfile 来决定使用 npm 还是 yarn,如果两种都有,则使用 npm,可以通过这个参数启用 yarn

  • --exclude <regexp>:创建补丁文件时,忽略与正则表达式匹配的路径,路径相对于要修改的依赖包的根目录,默认: package\\.json$

  • --include <regexp>:与 --exclude <regexp> 相反,创建补丁文件时仅考虑与正则表达式匹配的路径,默认: .*

  • --case-sensitive-path-filtering:使 --include 或 --exclude 中使用的正则表达式区分大小写

  • --patch-dir:指定放置补丁文件的目录

打补丁

重新安装依赖包时,执行以下命令:

npx patch-package # 应用所有补丁

如果打补丁后,补丁文件被修改过,此操作将失败,此时可以重新安装 node_modules

额外选项

  • --reverse:撤回所有补丁

  • --patch-dir:指定补丁文件所在目录

部署

package.json 的 scripts 中加入 "postinstall": "patch-package",后续执行 npm install命令时,就会自动为依赖包打补丁了