瞭解patch-package

假設loadsh有一個bug,影響線上開發,應該怎麼辦?

答:三步走。

  1. 在github上提交pull request,修復bug,等待合併
  2. 合併pr後,等待新版本發包
  3. 升級項目中的lodash依賴

很合理的很規範的一個流程,但是它一個最大的問題就是太慢了。此時可直接上手修改node_modules中的lodash代碼,並修復問題!新問題:node_modules未納入版本管理,在生產環境並沒有用。請看流程

  1. 本地修改node_modules/lodash,本地正常運行
  2. 線上npm i loadsh,lodash未被修改,線上運行失敗

此時有一個簡單的方案,臨時將修復文件納入工作目錄,可以解決這個問題

  1. 本地修改node_modules/lodash,本地正常運行
  2. 將修改文件複製到根目錄/patchs/lodash中,納入版本管理
  3. 線上npm i lodash,並將修改文件再度複製到node_modules/lodash中,線上正常運行

但此時並不是很智能,且略有小問題,演示如下:

  1. 本地修改node_modules/lodash,本地正常運行
  2. 將修改文件複製到根目錄/patchs/lodash中,納入版本管理
  3. 線上npm i lodash,並將修改文件再度複製到node_modules/lodash中,線上正常運行
  4. 2個月後升級lodash,該問題得以解決,而我們代碼引用了lodash的新特性
  5. 線上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

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