如何爲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能夠支持多少文件修改,沒有具體測試,預感是隻能支持少量修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章