如何優(yōu)雅的修改npm第三方依賴包

想想我們在使用第三方依賴包時如果遇到了bug,通常解決的方式都是繞過這個問題,使用其他方式解決,較為麻煩?;蛘呓o作者提個issue,然后等待作者的修復(fù),等待的時間不可控。那么這時候就可以借助patch-package自己動手去修復(fù)該bug,感覺是不是很棒,并且還可以在第三方依賴包上,根據(jù)業(yè)務(wù)需求擴(kuò)展能力。

當(dāng)然最好還是擴(kuò)展一些通用性比較高的能力,如果是比較通用且該能力大多數(shù)開發(fā)者都有這種訴求的話可以給第三方依賴包提個PR。參與開源項(xiàng)目是不是簡單了起來了~(不要在魔改的路上越走越遠(yuǎn))

使用步驟

Step1: 安裝

// 使用npm安裝
npm i patch-package

// 使用yarn安裝
yarn add patch-package postinstall-postinstall

為什么要使用yarn安裝,需要多安裝postinstall-postinstall這個依賴,有興趣可以看官方解釋 Why use postinstall-postinstall

Step2:修改package.json

package.json的scripts中聲明了一系列的npm腳本命令,如下:(參考資料:npm-scripts

  • prepublish: 在包發(fā)布之前運(yùn)行,也會在npm install安裝到本地時運(yùn)行
  • publish,postpublish: 包被發(fā)布之后運(yùn)行
  • preinstall: 包被安裝前運(yùn)行
  • install,postinstall: 包被安裝后運(yùn)行
  • preuninstall,uninstall: 包被卸載前運(yùn)行
  • postuninstall: 包被卸載后運(yùn)行
  • preversion: bump包版本前運(yùn)行
  • postversion: bump包版本后運(yùn)行
  • pretest,test,posttest: 通過npm test命令運(yùn)行
  • prestop,stop,poststop: 通過npm stop命令運(yùn)行
  • prestart,start,poststart: 通過npm start命令運(yùn)行
  • prerestart,restart,postrestart: 通過npm restart運(yùn)行

可以看到依賴包在安裝完之后會執(zhí)行postinstall命令
所以我們在package.json的scripts里面增加:"postinstall": "patch-package"

"scripts": {
    ***,
+   "postinstall": "patch-package"
}

Step3:修改依賴包源碼

在項(xiàng)目的node_modules 找到要修改的依賴包, 例如(resize-observer-polyfill):


image.png

Step4: 生成補(bǔ)丁

yarn patch-package package-name(修改的包名)
或者
npx patch-package package-name(npm版本 > 5.2)
patch-package 6.4.7
? Creating temporary folder
? Installing resize-observer-polyfill@1.5.1 with yarn
? Diffing your files with clean files
? Created file patches/resize-observer-polyfill+1.5.1.patch

?? resize-observer-polyfill is on GitHub! To draft an issue based on your patch run

    yarn patch-package resize-observer-polyfill --create-issue

可以看到patch-package已經(jīng)為我們創(chuàng)建了一個補(bǔ)丁。

默認(rèn)會在我們的根目錄下創(chuàng)建一個patches文件夾。在patches文件夾下會創(chuàng)建依賴包名+版本號.patch的文件,文件描述了我們修改了什么,第幾行,有點(diǎn)像git的提交記錄


image.png

Step5: 測試補(bǔ)丁是否有效

手動刪除node_modules文件夾,重新執(zhí)行npm install安裝依賴包??梢钥吹皆谝蕾嚢惭b結(jié)束后執(zhí)行了patch-package命令,之前生成的補(bǔ)丁被應(yīng)用了

patch-package 6.4.7
Applying patches...
resize-observer-polyfill@1.5.1 ?
Done in 177.35s.

查看node-modules中之前修改的resize-observer-polyfill 修改的地方,查看之前修改的代碼是否還存在。如果之前修改的代碼還存在,說明補(bǔ)丁文件已經(jīng)生效了,如果不存在,排查下是否哪個步驟出現(xiàn)了問題。

最后將patches文件夾推送到遠(yuǎn)端倉庫,日后無論是誰拉取代碼,安裝依賴,我們之前修改的部分都會生效的

注意事項(xiàng)

  • patch是鎖定版本號的,如果升級了版本,patch內(nèi)容將會失效,最好在package.json能夠鎖定版本號。

  • 魔改的同時,也局限了升級的能力,盡量還是去提issue和PR。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容