一.背景
在团队开发的项目中,一般会依赖很多npm包。 有这样一种情况:我们想在某个npm包中自己添加一段代码,以实现某个想要的功能。
但这个包是其他人开发的,无法修改源码。这种情况下应该怎么做呢?
- 如果知道仓库地址,可以直接fork仓库到自己的仓库中,修改代码后自己维护这个仓库-发包,并使用。
- 也有一种更灵活的方式,使用 patch-package 对npm包打补丁
二. patch-package 使用
1. 安装
// 官方推荐同时安装 postinstall-postinstall
yarn add patch-package postinstall-postinstall
官方推荐 将postinstall-postinstall和patch-package一起安装。
原因简单总结就是:
只有patch-package时,运行yarn / yarn add packageA ,会自动运行补丁,使之生效。但运行 yarn remove,就不会自动运行补丁。 因此postinstall的作用就是弥补在执行yarn remove后,也可以使补丁生效。
2. 在package.json中添加命令
"scripts": {
"postinstall": "patch-package"
}
3. 修改npm包
从node_modules目录中,找到要修改的包-具体的文件,添加修改内容后,
首先在本地开发查看修改是否生效:
这里要注意两点:
- 如果这个包同时有src目录和lib或叫dist目录,那可能要修改lib或dist目录下的文件,改动才能生效。因为最终执行的应该是拿src代码去构建得到的lib/dist目录下的文件。
- 修改完node_modules中的代码后,应该要重启本地开发,在本地才会用新代码运行
在本地可以先确认好要修改的文件,修改成功,达到想要的效果后,就可以打补丁了:
4. 打补丁
需要手动执行命令:yarn patch-package your-package-name
运行这个命令后,在项目的根目录下会生成 patchs 目录,
目录下生成一个 package-name+x.x.x .patch 文件,即包名+版本号,以.patch为后缀的一个文件。
打开该文件,可以看到文件的内容,是记录了修改前后的diff,不同之处。
5. 提交改动并验证
改动其实就是多了一个patchs目录,及其下的patch文件-记录包的改动点。
需要 git add commit push 操作,将patch文件推到远程仓库。
我们上面只是在本地,运行的是我们改动的node_modules中的代码,改动会生效。
但是node_modules中的依赖并不会上传到远程仓库,我们使用yarn安装依赖的时候,只是会根据package.json中包的版本号安装。
为了验证别人是否能感知到我对这个包的改动,可以进行一下验证:
rm -rf node_modules/ 删除本地的依赖
yarn 重新安装依赖
这两部操作后,会重新安装依赖,按照期望,也会自动运行补丁使之生效。这样之后在本地启动项目,改动依然存在,就说明改动成功了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。