快速修复开源社区repo的bug

项目中经常会使用很多第三方的NPM包,比如Mousetrap,很多时候会遇到bug,但是官方的bug还没修复或者还没合并发包,那么这个时候怎么办呢。这里总结下方法。

Fork仓库,走PR流程

fork仓库,源码修改,提交PR,等待官方合并和发布新包。这个方式肯定是最好的,取之社区,也回馈了社区。

但这个方式的缺点,也很明显,比如官方动作特别慢且本身我们又紧急依赖于该包的,那么这时这个方案就显得不是很合适了。

npm依赖版本调整

使用commit hash或者不同的repo地址。 package.json里本来也可以使用git commit hash,即直接锁定某个提交版本,这样合并与否都不影响。或者我们fork后,完全可以自己发布一个包,只是包名
无法跟之前的完全一致而已,比如增加@namespace前缀。

npm install from Git in a specific version

1
2
3
"dependencies": {
"package": "git://github.com/username/package.git#commit"
}

pkg alias

1
2
3
"dependencies": {
"package-a": "npm:@stacker/package-b@1.0.0"
}

patch-package

除了上面的2个方案外,我们还可以使用patch-package来快速修复bug。这个方案的本质是利用git diff来生成补丁文件,然后通过npm scripts钩子来直接执行布丁文件,从而修改了node_modules里的文件。我们如果抛开patch-package,直接修改源码会造成无法纳入版本管理,而patch-package则可以相对优雅的解决补丁和没有纳入版本管理的第三方包源码之间的冲突。

  1. 修改node_modules里下的目标包文件内容源码,比如mousetrap下的mousetrap-record.js

  2. 生成补丁文件

    1
    npx patch-package mousetrap

    https://static.1991421.cn/2024/2024-10-24-115353.jpeg

  3. 配置npm scripts钩子

    1
    2
    3
    "scripts": {
    "postinstall": "patch-package"
    }

    如果未来官方修复了bug,那么我们就可以删除补丁文件,删除该包直接执行npm install即可。

写在最后

上述即修复开源项目的几个方法,按需使用即可。