記錄--npm, npx, cnpm, yarn, pnpm梭哈

来源:https://www.cnblogs.com/smileZAZ/p/17980646
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 依賴管理解決了在軟體開發過程中管理和協調各種依賴項的問題,簡化了開發流程,提高了項目的可靠性、可維護性和可重覆性。它們幫助開發人員更高效地管理項目的依賴關係,減少了潛在的錯誤和衝突,並提供了更好的開發體驗。 常用的依賴管理 在 JavaS ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

依賴管理解決了在軟體開發過程中管理和協調各種依賴項的問題,簡化了開發流程,提高了項目的可靠性、可維護性和可重覆性。它們幫助開發人員更高效地管理項目的依賴關係,減少了潛在的錯誤和衝突,並提供了更好的開發體驗。


常用的依賴管理

在 JavaScript 生態系統中,有多種工具可用於管理項目的依賴項。

  1. npm(Node Package Manager):npm 是 Node.js 官方提供的包管理器,用於安裝、管理和發佈 JavaScript 包。它是 Node.js 安裝時預設包含的工具。通過 npm install 命令可以安裝項目依賴。
npm install package-name
  1. pnpm:pnpm 是一個快速、磁碟空間效率高的包管理器。與 npm 不同,pnpm 採用了符號鏈接的方式共用依賴項,因此在項目之間共用依賴時可以節省磁碟空間。pnpm 的命令與 npm 類似。
pnpm install package-name
  1. yarn:yarn 是由 Facebook 開發的另一個包管理器,旨在提供更快、更可靠的依賴管理。它具有與 npm 類似的功能,但執行速度更快,並且具有一些額外的功能,例如離線模式和鎖定文件。與 npm 不同,yarn 使用 yarn add 命令來安裝依賴。
yarn add package-name
  1. npx:npx 是 npm 5.2.0 版本及以上內置的命令行工具,用於執行項目安裝的依賴項中的可執行文件。它可以臨時安裝依賴項並運行其中的命令,而無需全局安裝。
npx command-name
  1. cnpm:cnpm 是淘寶鏡像提供的 npm 的鏡像版本,用於加速國內用戶對 npm 包的安裝和下載速度。它是通過將 npm 的源地址配置為淘寶的源地址來實現的。與 npm 相比,使用 cnpm 可以更快地安裝依賴項。

常用依賴管理的對比

準確地說,npx 並不是一個專門的依賴管理工具,而是 npm 附帶的一個命令行工具,用於臨時執行項目依賴中的可執行文件,而無需全局安裝。以下對其它常用依賴管理工具的對比,npx在後續小節會提到期妙用。

優勢pnpmnpmcnpmYarn
性能 - 採用硬鏈接來共用依賴項,減少磁碟空間占用和安裝時間 - 單線程安裝和構建依賴項 - 採用並行安裝模式,速度較快 - 並行安裝和構建依賴項,速度較快
  - 並行安裝和構建依賴項,提高安裝速度      
  - 增量安裝依賴項,只安裝更新的部分      
  - 本地緩存和離線安裝支持      
效率 - 快速的重覆安裝速度 - 較慢的重覆安裝速度 - 較快的重覆安裝速度 - 快速的重覆安裝速度
  - 較小的網路傳輸量      
依賴大小 - 僅保存每個包的單個實例 - 需要保存每個包的多個實例,占用較大的磁碟空間 - 僅保存每個包的單個實例,占用較小的磁碟空間 - 僅保存每個包的單個實例,占用較小的磁碟空間
鎖定文件機制 使用 pnpm-lock.yaml 使用 package-lock.json 使用 package-lock.json 使用 yarn.lock
生態系統支持 - 生態系統相對較小,但相容 npm 生態系統 - 龐大的生態系統和廣泛的社區支持 - 生態系統相對較小,可能有一些包不完全支持 - 龐大的生態系統和廣泛的社區支持
         
社區支持與更新頻率 - 社區相對較小,更新頻率較低 - 龐大的社區支持和活躍的更新頻率 - 社區相對較小,更新頻率較低 - 龐大的社區支持和活躍的更新頻率

軟鏈接與硬鏈接

在依賴管理工具中,常見的使用軟鏈接和硬鏈接的方式有以下情況:

  1. 符號鏈接(Symbolic Link)或軟鏈接(Soft Link):

    • npm:npm使用符號鏈接來創建軟鏈接。當使用npm link命令時,它會創建一個全局軟鏈接,將全局安裝的模塊鏈接到當前項目中,從而實現模塊的共用和開發環境的快速調試。
    • Yarn:Yarn也使用符號鏈接來創建軟鏈接。類似於npm link,Yarn通過yarn link命令創建一個全局軟鏈接,將全局安裝的模塊鏈接到當前項目中。
  2. 硬鏈接(Hard Link):

    • pnpm:pnpm使用硬鏈接來共用已安裝的依賴項。當安裝依賴項時,pnpm會在項目之間創建硬鏈接,這樣相同的依賴項可以被多個項目共用,減少了磁碟空間占用和安裝時間。

需要註意的是,符號鏈接(Symbolic Link)是一種創建鏈接的方式,它創建了一個文件或目錄的指向目標的鏈接。而軟鏈接(Soft Link)是符號鏈接的一種特殊類型,用於指向文件或目錄。硬鏈接(Hard Link)創建了一個新的文件名,直接在文件系統中指向同一個索引節點和數據。

軟硬鏈接的適用場景

軟鏈接和硬鏈接各有其適用的情況,沒有絕對的好與壞。它們的選擇取決於具體的使用場景和需求。

軟鏈接的優點
  1. 跨文件系統:軟鏈接可以跨越不同的文件系統,可以指向其他分區或磁碟上的文件或目錄。
  2. 可讀性:軟鏈接是可讀的,可以通過查看鏈接文件獲取目標文件或目錄的路徑信息。
  3. 靈活性:軟鏈接可以指向文件和目錄,可以創建迴圈鏈接(即鏈接的鏈條形成閉環),可以鏈接到不存在的目標,可以鏈接到目錄的特定子目錄。
硬鏈接的優點
  1. 空間效率:硬鏈接不會額外占用磁碟空間,多個鏈接共用相同的數據和索引節點,節省存儲空間。
  2. 性能:由於硬鏈接直接指向同一索引節點,訪問硬鏈接文件的速度與訪問目標文件相同,不需要額外的解析步驟。
  3. 指向目錄:硬鏈接可以指向目錄,而軟鏈接無法直接指向目錄。

根據具體的使用情況,可以選擇合適的鏈接類型。一般來說:

  • 如果需要跨越文件系統或者需要鏈接到目錄,可以選擇軟鏈接。
  • 如果註重空間效率和性能,並且在同一文件系統內進行鏈接,可以選擇硬鏈接。

對於pnpm來說,當一個項目使用pnpm安裝依賴項時,pnpm會將這些依賴項安裝到一個稱為node_modules/.pnpm的目錄中。其他項目可以通過創建硬鏈接來使用這個已安裝的依賴項,而無需在各自項目的node_modules目錄中重覆安裝。

這種共用依賴項的機制使得多個項目可以共用相同的依賴項,但每個項目仍然需要維護自己的package.json文件和項目特定的配置。這樣,每個項目可以獨立地管理自己的開發和構建過程,而共用的依賴項保持一致,減少了重覆的依賴項下載和存儲消耗。這是pnpm的一項優勢,可以提高項目的構建速度和整體效率。

npx的妙用

npx 是一個非常有用的命令行工具,特別適用於以下幾種場景:

  1. 臨時執行項目依賴的可執行文件: 有時候你可能需要在命令行中臨時執行某個項目依賴的可執行文件,而不想全局安裝這個工具。npx 可以幫助你在不污染全局環境的情況下直接運行這些可執行文件。
npx eslint index.js

上述示例中,我們使用 npx 來運行項目依賴中的 eslint 工具,對 index.js 文件進行代碼檢查,而無需事先全局安裝 eslint。

  1. 執行最新版本的工具: npx 可以確保你運行的是最新版本的工具。當你使用全局安裝的工具時,可能會受限於舊版本,而 npx 可以自動下載和使用最新版本。
npx create-react-app my-app

在上述示例中,我們使用 npx 創建一個新的 React 應用程式,npx 會自動下載最新版本的 create-react-app 工具並使用它來初始化項目。

  1. 嘗試新的工具和庫: 當你想嘗試一個新的工具或庫時,不必將其全局安裝,只需使用 npx 運行它。這樣可以節省磁碟空間,並且你可以快速嘗試新工具而無需擔心與現有環境衝突。
npx next init my-app

在上述示例中,我們使用 npx 初始化一個新的 Next.js 應用程式,而不必預先全局安裝 Next.js。

  1. 運行一次性命令: 當你只需要運行一次性的命令時,npx 是一個很好的選擇。你可以直接在命令行中指定要運行的命令,而無需創建額外的腳本文件。
npx http-server

在上述示例中,我們使用 npx 啟動一個簡單的 HTTP 伺服器,而不必事先編寫啟動腳本。

總之,npx 是一個非常方便的工具,適用於在命令行中臨時執行項目依賴的可執行文件、運行最新版本的工具、嘗試新的工具和庫,以及運行一次性命令等場景。

npx的執行機制

當你使用 npx 執行可執行文件時,npx 會首先檢查本地是否已經存在該可執行文件。如果本地已經安裝了這個可執行文件(位於項目的 node_modules/.bin 目錄中),npx 會直接運行它,而無需下載。

如果本地不存在該可執行文件,npx 會自動下載對應的包,並將其安裝在一個臨時目錄中,然後執行該可執行文件。這意味著 npx 會在需要時臨時下載所需的包,而不會將其全局安裝或污染項目的依賴。

臨時下載的包會被存儲在一個緩存目錄中,以便下次使用相同的包時可以快速載入。預設情況下,npx 使用 npm 的緩存目錄作為臨時下載的包的存儲位置。

在執行完可執行文件後,npx 會自動刪除臨時下載的包,以節省磁碟空間。這意味著每次使用 npx 執行可執行文件時,它都會檢查本地是否存在該包,如果不存在則臨時下載,執行完後再刪除。

總之,npx 會檢查本地是否已經安裝了要執行的可執行文件,如果沒有,則會臨時下載並執行它,執行完畢後再刪除臨時下載的包。這樣可以確保你在運行命令時使用的是最新版本的工具,同時避免全局安裝或污染項目的依賴。

本文轉載於:

https://juejin.cn/post/7326268908984352777

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【版權聲明】未經博主同意,謝絕轉載!(請尊重原創,博主保留追究權) https://www.cnblogs.com/cnb-yuchen/p/17977495 出自【進步*於辰的博客】 之前使用SSM+JSP做網站開發,由於沒有註意setter、getter的隱式調用問題,出現了多次bug,對開發進 ...
  • C# 布爾值 在編程中,通常需要一個只能有兩個值之一的數據類型,比如: 是 / 否 開 / 關 真 / 假 為此,C# 有一個 bool 數據類型,可以取 true 或 false 的值。 布爾值 使用 bool 關鍵字聲明布爾類型,只能取 true 或 false 的值: 示例: bool isC ...
  • 概述:在C#中,字元串連接有兩種實現方法:使用`+`運算符和使用`StringBuilder`。前者在每次連接時都會創建新的字元串對象,效率較低。後者通過內部管理字元數組,避免了頻繁的記憶體分配和垃圾回收,因此性能更高。在處理大量字元串連接時,使用`StringBuilder`可以顯著提高性能。這兩種 ...
  • DevToys —— 號稱是開發人員的“瑞士軍刀”,一款適用於開發者的工具集合,包含各種實用的開發小工具。JSON格式化、文本對比、正則表達式...無需網路,離線即可使用! ...
  • Linux 是一個嚴謹的操作系統,每個目錄存放什麼文件是有明確的要求和規範的。我們應該去瞭解這些目錄的作用,然後按照目錄要求去操作。 ...
  • 一、海豚調度介紹 Apache DolphinScheduler 是一個分散式易擴展的可視化DAG工作流任務調度開源系統。適用於企業級場景,提供了一個可視化操作任務、工作流和全生命周期數據處理過程的解決方案。 Apache DolphinScheduler 旨在解決複雜的大數據任務依賴關係,併為應用 ...
  • 下麵介紹三種用於進行排序的專用視窗函數: 1、RANK() 在計算排序時,若存在相同位次,會跳過之後的位次。 例如,有3條排在第1位時,排序為:1,1,1,4······ 2、DENSE_RANK() 這就是題目中所用到的函數,在計算排序時,若存在相同位次,不會跳過之後的位次。 例如,有3條排在第1 ...
  • 在近日舉辦的鴻蒙生態千帆啟航儀式上,華為常務董事、終端BG CEO餘承東表示,鴻蒙生態設備已經增至8億 ,將打開萬億產業新藍海。 在本次論壇上,華為宣佈HarmonyOS NEXT鴻蒙星河版(開發者預覽版)已面向開發者開放申請。該版本,能夠實現原生精緻、原生易用、原生流暢、原生安全、原生智能、原生互 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...