如何为npm包打补丁

我们在开发中经常遇到,npm包有点小问题或者不符合我们的场景。

通常的解决方案,是提交一个issue或者PR,等待作者修改,又或者copy源码到本地,修改依赖指向本地。

这两种方案,都有明显的缺点,不是等待时间太久,就是太过暴力。

这里推荐一个新的方案:patch-package

 

patch-package适用于对npm包简单的修改,它能在不copy源码修改依赖的前提下,将修改记录下来,利用git进行管理,保证修改在组内小伙伴间一致。

通过npm scripts集成,可以无感的使用,效果不错,成本较低。

话不多说,上demo:

0、准备

首先,当然是安装patch-package,按照文档说明来,装devDependencies就好了

yarn add patch-package --dev

1、栗子生成

这里拿lodash.clonedeep 这个包来做一下实验

找到cloneDeep函数,增加一行console.log

2、补丁生成

然后执行命令生成补丁,格式是这样滴 npx patch-package 【包名】,还有其他复杂参数,参考文档自行选用

npx patch-package lodash.clonedeep

 

如图所示,生成成功了,提示我们说,Created file patches... blabla 

查看一下目录下的patches文件夹,如下图所示,生成了lodash.clonedeep+4.5.0.patch文件

文件描述了我们修改了什么,第几行,和git的记录类似。

 

 3、补丁还原

补丁生成好了,接下来就是还原,我们首先将lodash.clonedeep包内的修改还原。

 

然后,使用 命令还原我们的修改。

 npx patch-package

执行完后,再查看文件内容,会发现我们的修改已经回来了。

 

 将代码跑起来,会发现我们的修改确实应用了。

 

4、传播与集成

至此,我们的补丁就打好了,不过好像还少了点什么。

对,缺了自动化。

我们通过npm scripts 进行自动化还原,每次构建之前,进行打补丁工作,这样我们的修改就能同步给组内其他小伙伴了。

  "scripts": {
        "serve": "npm-run-all postinstall vue-cli-service serve",
        "build": "npm-run-all postinstall vue-cli-service build"
        "postinstall": "patch-package"
    },

以上呢,是简略后的scripts,大致思路就是利用npm-run-all 执行postinstall,安装我们的补丁,然后再进行构建。

使用方法不变,只是增加了打补丁的过程。

 5、注意事项

(1)patch是锁定版本号的,如果升级了版本,patch内容将会失效,最好在package.json能够锁定版本号。

(2)魔改一时爽,但是也失去了升级的能力,提issue和PR才是正途。

(3)patch能够支持多少文件修改,没有具体测试,预感是只能支持少量修改。

posted @ 2020-12-11 14:53  jydeng  阅读(3377)  评论(0编辑  收藏  举报