」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > NPM 對等依賴關係深入:全面介紹

NPM 對等依賴關係深入:全面介紹

發佈於2024-11-09
瀏覽:977

NPM peerDependencies in Depth: A Comprehensive Introduction

作為 Javascript 開發者,我們都知道專案中存在兩種不同的依賴關係,dependency 和 devDependency,但是peerDependency 又如何呢?

在本系列中,我們將研究 Javascript 中這種較不常見的依賴關係。我們將研究它們是什麼,作為圖書館使用者我需要了解什麼,以及圖書館作者的最佳實踐是什麼。

NPM 中的依賴關係是什麼

讓我們回顧一下不同的常見類型:

  • 依賴項:這些是您的應用程式中使用的工具;一個很好的例子是 React、Angular 和 Express。當您的應用程式投入生產時,依賴項上的庫的程式碼將在後台運行並為您的應用程式提供動力。

  • devDependency:您將使用這些實用程式來建立您的應用程式。在這裡,您將找到用於編譯或解析程式碼的程式庫以及用於執行測試的程式庫。

什麼是peerDependency

當作者要求將特定庫安裝在工作區/專案中以使一切按預期工作時,他們將特定庫指定為peerDependency。他們告訴 NPM(以及安裝該程式庫的開發人員)該套件需要另一個套件的特定版本(或版本範圍)才能正常運作。儘管如此,用戶仍負責安裝和管理該依賴項。

讓我們想像一個例子:您正在為您最喜歡的框架創建一個實用程序,該實用程式應該安裝在您的庫將運行的環境中。準確指定此場景的方法是使用 NPM PeerDependency 功能。它為您的庫的無縫集成提供了清晰的指南。

這種做法在充當「插件」的庫中特別常見,因為它們需要指示正確功能的工作區要求。

peerDependency 的真實例子

我們來分析一個流行的React庫,react-datepicker;如果我們看看它的package.json 今天的樣子,我們可以看出我們至少需要React 版本^16.9.0 才能使反應日期選擇器正常工作。

"peerDependencies": {
  "react": "^16.9.0 || ^17 || ^18",
  "react-dom": "^16.9.0 || ^17 || ^18"
},

如果我們不遵守此要求,將會出現意外行為。

peerDependency 解決的挑戰

當專案中的套件依賴同一庫的不同版本時,就會發生版本衝突。這可能會導致錯誤,特別是對於像 React 這樣的庫,共享相同實例對於狀態管理和元件通訊至關重要。如果沒有peerDependency,可能會安裝多個庫版本,從而導致意外行為。

為了防止這些問題,peerDependency 允許套件作者指定其套件需要哪個版本的依賴項,而無需直接安裝它。這將責任轉移給使用該套件的開發人員,確保他們安裝單一相容的依賴項版本。例如,像react-datepicker和react-router這樣的程式庫使用peerDependency來確保它們與專案中相同版本的React無縫運作。

另一個例子

想像這個場景:您正在建立一個函式庫來分享 rxjs 的奇特運算子。如果您將 rxjs 設定為依賴項而不是peerDependency,您的程式庫將安裝它自己的 rxjs 版本。乍一看這似乎沒什麼大不了的,但實際上,它可能會導致版本衝突。

如果安裝您的程式庫的專案已經使用了不同版本的 rxjs,則可能會導致嚴重問題。應用程式最終可能會產生兩個 rxjs 實例(一個來自您的庫,一個來自專案本身)。由於 rxjs 嚴重依賴共享的可觀察量和訂閱,因此同時執行兩個版本可能會導致不可預測的行為,例如串流無法正確同步或遺失事件。

透過使用peerDependency來代替,你可以避免這個問題。你的套件將向專案發出信號,表明它期望存在特定版本(或範圍)的 rxjs,但它不會安裝自己的版本。這樣,該專案將使用您的庫和程式庫其他部分共享的單一版本的 rxjs,確保一切順利和諧地運行。

結論

peerDependency 可能不像依賴項或 devDependency 那樣被廣泛討論,但它們在確保複雜專案中的兼容性和避免版本衝突方面發揮關鍵作用。透過明確定義庫需要哪個版本的共用依賴項而不直接安裝它,peerDependency 允許開發人員保持對其專案環境的控制。

第一篇文章的目標是為peerDependency 創造一個良好的理解基礎。在本系列的下一章中,我們將以更實用的方式探索作為具有peerDependency的庫的用戶的peerDependency的不同方面,如何克服常見問題,以及它們在不同的javascript包管理器中的行為方式。

版本聲明 本文轉載於:https://dev.to/dianjuar/npm-peerdependencies-in-depth-a-comprehensive-introduction-1o6g?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, attributeError:SomeClass實...
    程式設計 發佈於2025-05-18
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-05-18
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-05-18
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-05-18
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    程式設計 發佈於2025-05-18
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    程式設計 發佈於2025-05-18
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-05-18
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-05-18
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-05-18
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-05-18
  • `console.log`顯示修改後對象值異常的原因
    `console.log`顯示修改後對象值異常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    程式設計 發佈於2025-05-18
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案: args)拋出異常{ 日曆cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    程式設計 發佈於2025-05-18
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-05-18
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-05-18
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,可以更快地搜索這些前綴。 了解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3