一、背景在团队开发的项目中,一般都会依赖很多npm包。有这样一种情况:我们想在一个npm包中加入一段代码,实现一个想要的功能。但是这个包是别人开发的,不能修改源码。这种情况应该怎么办?如果知道仓库地址,可以直接把仓库fork成自己的仓库,自己修改代码维护仓库——发包就用。还有一种更灵活的方式,使用patch-package给npm包打补丁2.patch-package使用官网1.安装//官方推荐同时安装postinstall-postinstallarnaddpatch-packagepostinstall-postinstall官方推荐的是postinstall-postinstall和patch-package一起安装。简单总结一下原因是:当只有patch-package时,运行yarn/yarnaddpackageA会自动运行patch使其生效。但是运行yarnremove不会自动运行补丁。所以postinstall的作用是弥补执行yarnremove后patch的效果。2.在package.json中添加命令“scripts”:{“postinstall”:“patch-package”}3.修改npm包从node_modules目录中,找到要修改的特定于包的文件。添加修改内容后,首先在本地Develop查看修改是否生效:这里需要注意两点:如果包中同时有src目录和lib或dist目录,可能需要修改lib中的文件或dist目录以使更改生效。因为最终执行的应该是构建src代码得到的lib/dist目录下的文件。修改node_modules中的代码后,需要重启本地开发,只在本地运行新的代码。可以先在本地确认要修改的文件。修改成功并达到预期效果后,就可以打补丁了:4.打补丁需要手动执行命令:yarnpatch-packageyour-package-name运行该命令后,会在项目根目录下生成一个patches目录,其中会生成一个package-name+x.x.x.patch文件目录,即包名+版本号,一个后缀为.patch的文件。打开文件,可以看到文件的内容,其中记录了修改前后的差异。5.提交更改并验证更改。其实多了一个patches目录,下面是补丁文件——录制包的变化点。需要gitaddcommitpush操作将补丁文件推送到远程仓库。我们上面只是在本地,我们正在运行我们更改的node_modules中的代码,更改将生效。但是node_modules中的依赖是不会上传到远程仓库的。当我们使用yarn安装依赖时,只会根据package.json中包的版本号进行安装。为了验证别人是否能感知到我对这个包的修改,可以进行验证:rm-rfnode_modules/删除本地依赖yarn重新安装依赖这两个操作后,依赖会重新安装,自动运行为预期补丁使其工作。之后在本地启动项目,修改依然存在,说明修改成功。
