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

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

發佈於2024-11-08
瀏覽:550

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]刪除
最新教學 更多>
  • 如何有效地將PHP變數插入字串?
    如何有效地將PHP變數插入字串?
    將PHP 變數插入字串將PHP 變數合併到字串中時,注意語法以確保所需的輸出為至關重要的獲得。為了解決這個問題,讓我們檢查一下提示中顯示的程式碼:目標是包含$ width 變數在寬度樣式屬性中,並確保其後跟“px”。不幸的是,嘗試用空格分隔變數和“px”或將它們連接在一起會導致錯誤。 解決方案1:串...
    程式設計 發佈於2024-11-08
  • 了解 JavaScript 中底線 (`_`) 的使用
    了解 JavaScript 中底線 (`_`) 的使用
    在 JavaScript 中編碼時,您可能會遇到用作變數名稱的下劃線字元 (_),特別是在函數參數中。雖然乍看之下似乎很不尋常,但由於各種原因,這種做法在開發人員中很常見。在這篇文章中,我們將探討底線代表什麼,為什麼要使用它,以及它在現實範例中的顯示方式,例如 coalesceES6 函數。 ...
    程式設計 發佈於2024-11-08
  • 像程式設計師一樣思考:學習 C 基礎知識
    像程式設計師一樣思考:學習 C 基礎知識
    以程式設計師思考學習 C 語言:基本語法:變數、資料型態、常數、運算子、控制流。實戰案例:計算兩個數的平均值,輸入兩個整數並計算其平均值。 以程式設計師思考:用C 語言學習基礎引言學習程式設計並不難,尤其是當你以程式設計師思維思考時。本文將從基礎開始,用 C 語言引導你逐步了解程式設計入門知識。 C...
    程式設計 發佈於2024-11-08
  • Python 中的列表理解語法何時需要三元運算子?
    Python 中的列表理解語法何時需要三元運算子?
    列表理解難題:可迭代物件中的條件篩選在Python 中,列表理解提供了一種基於現有可迭代物件建立清單的簡潔方法。然而,出現了一個關於涉及 if 語句的列表理解的問題。 目標是比較兩個可迭代物件 a 和 b,並僅列印兩者中出現的元素。預期的程式碼如下所示:print([y if y not in b ...
    程式設計 發佈於2024-11-08
  • 使用 MetaTrader 訂單管理和市場資料收集進行自動交易
    使用 MetaTrader 訂單管理和市場資料收集進行自動交易
    Your AsimovMT class provides a comprehensive interface for interacting with MetaTrader5 (MT5) using Python. However, there are several areas in your c...
    程式設計 發佈於2024-11-08
  • Python 清單的最大大小是多少以及它如何影響功能?
    Python 清單的最大大小是多少以及它如何影響功能?
    Python列表的最大大小:綜合分析在Python中,列表是基本的資料結構,可以容納多個不同類型的元素。它們的多功能性和靈活性使得了解它們的局限性至關重要,特別是在處理大型數據集時。本文探討了 Python 清單可以達到的最大大小及其對其功能的影響。 最大清單大小Python 清單的最大大小已定義通...
    程式設計 發佈於2024-11-08
  • 託管平台清單:綜合指南
    託管平台清單:綜合指南
    在數位時代,可靠的託管平台對於任何線上展示都至關重要,無論是個人部落格、電子商務網站還是公司網站。有無數的選項可供選擇,選擇合適的託管平台可能會令人畏懼。本指南將幫助您瀏覽當今一些最好的託管平台,比較它們的功能、價格和對不同需求的適用性。 1. 藍色主機 概述:Bluehost 是...
    程式設計 發佈於2024-11-08
  • 在瀏覽器中將影片壓縮為 webm
    在瀏覽器中將影片壓縮為 webm
    ?增強您的網路影片:使用 React 將 MP4 壓縮為 WebM 工作中沒有任何有趣的事情感到無聊嗎?好吧,就在那時我決定抓緊時間修補瀏覽器 API 的當前狀態。我們可以直接透過 Web API 壓縮影片嗎?在這篇部落格中,我將向您展示如何使用現代瀏覽器功能將 MP4 影片壓縮為...
    程式設計 發佈於2024-11-08
  • 現代 PHP 中的 PHP Fiber 並發性
    現代 PHP 中的 PHP Fiber 並發性
    PHP Fibers 在 PHP 8.1 中引入,帶來了一種令人興奮的新方法來處理 PHP 中的並發和非同步程式設計。纖維可讓您在執行過程中暫停和恢復函數,使開發人員能夠更好地控制非阻塞操作,例如處理 I/O、資料庫查詢或 HTTP 請求,而無需停止整個腳本。 在本部落格中,我們將探討 PHP 纖...
    程式設計 發佈於2024-11-08
  • Laravel 的新時代:Accel 的百萬美元 A 輪融資——這就是為什麼它改變了遊戲規則!
    Laravel 的新時代:Accel 的百萬美元 A 輪融資——這就是為什麼它改變了遊戲規則!
    各位,请戴好帽子! Laravel 刚刚发布了一些激动人心的消息,震惊了开发界——由 Accel 领投的 A 轮融资 5700 万美元。作为一名热情的 Laravel 用户和企业家同事,这一公告在整个 PHP 社区引起了震动,我感到非常兴奋!那么,让我们来分析一下为什么这项投资意义重大,以及为什么 ...
    程式設計 發佈於2024-11-08
  • C++11 的 `string::c_str()` 仍然以 Null 終止嗎?
    C++11 的 `string::c_str()` 仍然以 Null 終止嗎?
    C 11 的 string::c_str() 是否消除空終止? 在 C 11 中,string::c_str 不再保證產生一個以 null 結尾的字串。 原因:在C 11 中,string::c_str 的定義與string::data 相同,而string::data 又被定義相當於*( begi...
    程式設計 發佈於2024-11-08
  • 資料分析師清單
    資料分析師清單
    SQL 清單 Excel女士清單 Power BI 清單 Tableau 清單 Python 清單 請關注此 WhatsApp 頻道以獲取更多資源
    程式設計 發佈於2024-11-08
  • 如何在 Go 中將 YAML 欄位動態解析為有限結構集?
    如何在 Go 中將 YAML 欄位動態解析為有限結構集?
    在 Go 中將 YAML 欄位動態解析為有限結構體集簡介在 Go 中將 YAML 解析為結構體非常簡單。但是,當 YAML 欄位可以表示多個可能的結構時,任務就會變得更加複雜。本文探討了使用 Go 的 YAML 套件的動態方法。 使用 YAML v2 進行動態解組對於 Yaml v2,可以使用以下方...
    程式設計 發佈於2024-11-08
  • 為什麼我的 C++ 程式碼中會出現「vtable」和「typeinfo」未定義符號錯誤?
    為什麼我的 C++ 程式碼中會出現「vtable」和「typeinfo」未定義符號錯誤?
    未定義的符號:「vtable」和「typeinfo」在提供的程式碼中,出現連結錯誤並顯示下列訊息: Undefined symbols: "vtable for Obstacle", referenced from: Obstacle::Obstacle()in ...
    程式設計 發佈於2024-11-08
  • 如何在 Python 中執行指數和對數曲線擬合?
    如何在 Python 中執行指數和對數曲線擬合?
    曲線擬合:Python 中的指數和對數方法雖然Python 中可以使用polyfit() 輕鬆進行多項式曲線擬合,但本指南探討了指數和對數曲線的方法擬合。 對數擬合擬合 y 形式的直線= A B log x,只需執行 y 對 log x 的多項式擬合。 import numpy as np x = ...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3