如何用 pnpm patch 給 element-plus 打補丁修復線上 bug(以 2.4.4 修復 PR#15197 為例)

背景

在實際項目開發中,依賴的三方庫(如 element-plus)難免會遇到 bug。有時候官方雖然已經修復,但新版本升級成本高,或者有兼容性風險。這時,給依賴打補丁是最優雅的解決方案之一。

本文以 element-plus 2.4.4 為例,演示如何用 pnpm 的 patch 機制,優雅地修復 PR#15197 中的 bug,而無需升級到 2.5.0。


需求說明

  • 項目依賴 element-plus@2.4.4
  • 官方在 2.5.0 修復了一個嚴重 bug(見 PR#15197)
  • 現有項目不方便直接升級 element-plus
  • 目標:只打補丁,修復 bug,且能持續跟隨依賴升級

方案選型

常見的依賴補丁方案有兩種:

  1. patch-package
    適合 npm/yarn 用戶,需手動維護 patch 文件和 postinstall 鉤子。
  2. pnpm patch
    pnpm 官方支持,自動管理 patch 文件和依賴關系,推薦 pnpm 用戶使用。

本文采用 pnpm patch 方案。


實操步驟

1. 生成 patch 編輯環境

在項目根目錄執行:

pnpm patch element-plus

pnpm 會自動解壓 element-plus 到 .pnpm_patched 目錄,并用編輯器打開。


2. 修改源碼

根據 PR#15197 的改動,找到:

  • components/date-picker/src/date-picker-com/panel-date-pick.js(lib 目錄)
  • components/date-picker/src/date-picker-com/panel-date-pick.mjs(es 目錄)

分別做如下修改:

將:

const handleDatePick = (value, keepOpen) => {

改為:

const handleDatePick = async (value, keepOpen) => {

并在:

if (props.type === 'datetime') {handleFocusPicker()
}

之間插入:

if (props.type === 'datetime') {await nextTick()handleFocusPicker()
}

?? 注意:element-plus 發布包通常有 lib/es/ 兩套產物,都要 patch,否則有些構建工具(如 Vite)不會生效。


3. 保存并退出

保存所有修改,關閉編輯器。pnpm 會提示輸入 patch message,隨便寫個描述,比如 fix: handleFocusPicker delay

pnpm 會自動生成 patches/element-plus.patch 文件,并在 package.json 里寫入:

"pnpm": {"patchedDependencies": {"element-plus": "patches/element-plus.patch"}
}

4. 應用 patch

##執行
pnpm install

pnpm 會自動應用 patch 文件到 node_modules。


5. 清理緩存,確保 patch 生效

Vite、Webpack 等現代構建工具有緩存,一定要清理緩存,否則 patch 可能不生效。

rm -rf node_modules/.vite dist .cache
pnpm install
pnpm run dev

6. 驗證 patch 是否生效

  • 直接在 node_modules/element-plus/es/components/date-picker/src/date-picker-com/panel-date-pick.mjslib/ 目錄下,搜索你的改動(比如加個 console.log)。
  • 頁面上觸發 date-picker,控制臺應有輸出。
  • 如果沒生效,優先懷疑緩存問題或實際用的不是被 patch 的文件。

常見問題與排查

  1. patch 文件沒生效?

    • 檢查 package.json 里的 pnpm.patchedDependencies 配置
    • patch 文件路徑和 node_modules 結構必須完全一致
    • 清理所有緩存和 lock 文件,重新 install
  2. 只 patch 了 lib 或 es 目錄?

    • 兩個都要 patch,Vite 默認用 es 目錄
  3. pnpm 版本太低?

    • 建議用 pnpm 7.x 或 8.x,老版本不支持 patchedDependencies
  4. 構建工具緩存?

    • 清理 .vitedist.cache 等目錄
  5. 實際用的不是 element-plus?

    • 檢查 import 路徑,確認用的就是 node_modules 里的 element-plus

總結

pnpm patch 是現代前端項目修復三方依賴 bug 的利器。
只需幾步,就能優雅地給依賴打補丁,既不影響升級,也方便團隊協作和 CI/CD。

遇到類似問題,記得:

  • patch lib 和 es 兩套產物
  • 清理構建緩存
  • 檢查 patch 是否真正生效

希望本文對你有幫助,歡迎點贊、收藏、評論交流!


參考資料:

  • element-plus PR#15197
  • pnpm patch 官方文檔
  • patch-package 官方文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83835.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83835.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83835.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring AI 入門:Java 開發者的生成式 AI 實踐之路

一、Spring AI 簡介 在人工智能技術快速迭代的今天,Spring AI 作為 Spring 生態系統的新生力量,正在成為 Java 開發者擁抱生成式 AI 的最佳選擇。該框架通過模塊化設計實現了與主流 AI 服務(如 OpenAI、Anthropic)的無縫對接&…

優化電腦的磁盤和驅動器提高電腦性能和延長硬盤壽命?

磁盤優化 磁盤清理: 使用系統自帶的磁盤清理工具(如Windows的“磁盤清理”)刪除不必要的文件。清空回收站。刪除臨時文件和緩存。 磁盤碎片整理(針對機械硬盤): 定期進行磁盤碎片整理,以提高文…

EDA斷供危機下的冷思考:中國芯片設計軟件的破局之道優雅草卓伊凡

EDA斷供危機下的冷思考:中國芯片設計軟件的破局之道優雅草卓伊凡 一、EDA是什么?芯片行業的”隱形基石” 1.1 EDA技術解析 EDA(Electronic Design Automation,電子設計自動化)是用于設計和驗證集成電路的軟件工具鏈…

Jpackage

簡介 jpackage - 用于打包自包含 Java 應用程序的工具,是 JDK 14 引入的一個工具。 該工具將 Java 應用程序和 Java 運行時映像作為輸入,并生成包含所有必要依賴項的 Java 應用程序映像。它將能夠生成特定于平臺的格式的本機包,例如包括打包 …

CRM管理軟件的數據可視化功能使用技巧:讓數據驅動決策

在當今數據驅動的商業環境中,CRM管理系統的數據可視化功能已成為企業優化客戶管理、提升銷售效率的核心工具。據企銷客研究顯示,具備優秀可視化能力的CRM系統,用戶決策效率可提升47%。本文將深入解析如何通過數據可視化功能最大化CRM管理軟件…

智慧充電:新能源汽車智慧充電樁的發展前景受哪些因素影響?

全球能源結構轉型與碳中和目標的推進,新能源汽車產業迎來爆發式增長,而智慧充電樁作為其核心基礎設施,發展前景備受關注。智慧充電不僅關乎用戶充電體驗的優化,更是電網平衡、能源效率提升的關鍵環節。 然而,其發展并…

ABAP設計模式之---“簡單設計原則(Simple Design)”

“Simple Design”(簡單設計)是軟件開發中的一個重要理念,倡導以最簡單的方式實現軟件功能,以確保代碼清晰易懂、易維護,并在項目需求變化時能夠快速適應。 其核心目標是避免復雜和過度設計,遵循“讓事情保…

多模態大語言模型arxiv論文略讀(105)

UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ?? 論文標題:UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ?? 論文作者:Zhaowei…

SQLServer中的存儲過程與事務

一、存儲過程的概念 1. 定義 存儲過程(Stored Procedure)是一組預編譯的 SQL 語句的集合,它們被存儲在數據庫中,可以通過指定存儲過程的名稱并執行來調用它們。存儲過程可以接受輸入參數、輸出參數,并且可以返回執行…

使用UDP連接ssh

使用UDP連接ssh mosh簡介兩端安裝moshWindows安裝mosh 放行端口使用mosh登錄Linuxdebug mosh簡介 Mosh最大的特點是基于UDP方式傳輸,支持在服務端創建一個臨時的Key供客戶端一次性連接,退出后失效;也支持通過SSH的配置進行認證,但…

軟件功能模塊歸屬論證方法

文章目錄 **一、核心設計原則****二、論證方法****三、常見決策模式****四、驗證方法****五、反模式警示****總結** 在討論軟件功能點應該歸屬哪些模塊時,并沒有放之四海而皆準的固定方法,但可以通過系統化的論證和設計原則來做出合理決策。以下是常見的…

ServBay 1.13.0 更新,新增第三方反向代理/內網穿透

ServBay 作為一款簡化本地開發環境搭建與管理的強大工具,致力于打造一個開箱即用、穩定可靠的本地開發平臺,讓用戶專注于代碼編寫,提升開發效率。 ServBay 1.13.0 正式發布!本次更新聚焦于提升本地開發項目的外部可訪問性、增強國…

如何利用樂維網管進行IP管理

IP管理是網絡管理中的關鍵環節,對于保障網絡的正常運行、提升資源利用效率以及保障網絡安全等方面都具有不可忽視的重要性。樂維網管在IP管理方面具有多種實用功能,以下從IP規劃與分配、IP狀態監測、IP沖突處理、IP審計與報表生成四個方面,介…

Go語言學習-->go的跨平臺編譯

Go語言學習–>go的跨平臺編譯 默認我們go build的可執行文件都是當前操作系統可執行的文件,Go語言支持跨平臺編譯——在當前平臺下編譯其他平臺的可執行文件。 eg:在windows界面的代碼,編譯完成后在linux上面運行 實現方式&#…

SpringBoot自動配置原理深度解析

一、引言 SpringBoot的"約定優于配置"理念極大地簡化了Spring應用的開發流程,而其核心魔法就是自動配置(Auto-Configuration)。本文將深入剖析自動配置的實現原理,幫助開發者更好地理解和定制SpringBoot應用。 二、自動配置核心機制 1. Ena…

使用阿里云百煉embeddings+langchain+Milvus實現簡單RAG

使用阿里云百煉embeddingslangchainMilvus實現簡單RAG 注意測試時,替換其中的key、文檔等 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_community.vectorstores import Milvus from langchain_text_splitters impor…

事件監聽 ——CAD C#二次開發

一、AutoCAD .NET API 事件機制 1. 事件監聽核心 - Database.ModifyObjects 事件 當數據庫中的實體(如圖形對象)發生修改時觸發,包括: - 幾何屬性變更(移動、縮放、旋轉)。 - 非幾何屬性變更&#xff08…

動量及在機器人控制中的應用

動量是物理學中的一個基本概念,在機器人學中也有重要應用。以下是詳細解釋: 1. 動量的基本定義 動量(Momentum)是描述物體運動狀態的物理量,定義為: 線性動量:$ p mv $ $ m $ 為質量&#xf…

LeetCode 2434.使用機器人打印字典序最小的字符串:貪心(棧)——清晰題解

【LetMeFly】2434.使用機器人打印字典序最小的字符串:貪心(棧)——清晰題解 力扣題目鏈接:https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/ 給你一個字符串 s 和一個機器人,機器人當前有一個…

影樓精修-AI衣服祛褶皺算法解析

注:為避免侵權,本文所用圖像均為AIGC生成或無版權網站提供; 衣服祛褶皺功能,目前在像素蛋糕、美圖云修、百度網盤AI修圖、阿里云都有相關的功能支持,它的價值就是將不平整的衣服圖像,變得整齊平整&#xf…