假設loadsh有一個bug,影響線上開發,應該怎麼辦?
答:三步走。
- 在github上提交pull request,修復bug,等待合併
- 合併pr後,等待新版本發包
- 升級項目中的lodash依賴
很合理的很規範的一個流程,但是它一個最大的問題就是太慢了。此時可直接上手修改node_modules中的lodash代碼,並修復問題!新問題:node_modules未納入版本管理,在生產環境並沒有用。請看流程
- 本地修改node_modules/lodash,本地正常運行
- 線上npm i loadsh,lodash未被修改,線上運行失敗
此時有一個簡單的方案,臨時將修復文件納入工作目錄,可以解決這個問題
- 本地修改node_modules/lodash,本地正常運行
- 將修改文件複製到
根目錄/patchs/lodash
中,納入版本管理- 線上
npm i lodash
,並將修改文件再度複製到node_modules/lodash
中,線上正常運行但此時並不是很智能,且略有小問題,演示如下:
- 本地修改
node_modules/lodash
,本地正常運行- 將修改文件複製到
根目錄/patchs/lodash
中,納入版本管理- 線上
npm i lodash
,並將修改文件再度複製到node_modules/lodash
中,線上正常運行- 2個月後升級
lodash
,該問題得以解決,而我們代碼引用了lodash
的新特性- 線上
npm i lodash
,並將修改文件再度複製到node_modules/lodash
中,由於已更新了lodash,並且依賴於新特性,線上運行失敗此時有個萬能之策,那就是patch-package
patch-package
想要知道patch-package如何解決上述問題,請先了解它的用法,流程如下
# 修改lodash中的一個小問題 update node_modules/lodash/index.js # 對lodash的修復生成一個patch文件,位於patches/lodash+4.17.21.patch npx patch-package lodash(注意這個地方,取package.json裏面的依賴,@dcloudio/webpack-uni-pages-loader) npx patch-package '@dcloudio/webpack-uni-pages-loader' # 將修復文件提交到版本管理之中 git add patches/lodash+4.17.21.patch git commit -m 'fix bug' #####################此後在生成環境中執行##################### # 安裝生產環境包 npm i #爲生產環境的lodash運行修復 npx patch-package
再看下patch-package自動生成patch文件本來的面目吧!
它實際上是一個diff文件,在生產環境中可自動根據diff文件與版本號(根據patch文件名存取)將修復場景復原!
# 打開patches/lodash+4.17.21.patch diff --git a/node_modules/lodash/index.js b/node_modules/lodash/index.js index 5d063e2..fc6fa33 100644 --- a/node_modules/lodash/index.js +++ b/node_modules/lodash/index.js @@ -1 +1,3 @@ +console.log('FIX BUG') + modules.export = require('lodash');
參考:https://www.bilibili.com/video/BV1qP4y157jn?spm_id_from=333.337.search-card.all.click