npm(Node Package Manager) 是 Node.js 的預設套件管理系統(包管理工具),完全以 JavaScript 編寫而成。當你安裝 Node.js 時,npm 通常會自動一併安裝,因此可以直接在命令列中使用相關指令進行套件管理。 

 

npm 的核心定位與功能

npm 的主要任務是讓開發者能輕鬆地下載、安裝、共享與管理專案所需的依賴套件與工具。其主要功能可分為以下幾項:

1. 套件管理(Package Management)

  • 使用簡單的指令如 npm install,即可安裝、更新或移除專案依賴。

  • npm 會自動處理複雜的依賴關係,確保所有子套件能正確安裝並相容運作。

2. 版本控制(Version Management)

  • 採用 語義化版本控制(Semantic Versioning, SemVer)
    格式為 MAJOR.MINOR.PATCH

  • 可鎖定特定版本或允許在相容範圍內自動更新,例如:

    • ^1.19.0:允許更新至 1.x 最新版,但不超過 2.0.0。

    • ~1.19.0:僅允許更新修補版本(patch)。

3. 套件發布(Package Publishing)

  • npm 提供官方的 registry(套件註冊中心),開發者可將自己開發的套件上傳並分享給全球使用者。

  • 其他人只需使用 npm install <package-name> 即可下載使用。

4. 命令列工具(CLI)

  • npm 的 CLI 功能強大,除了安裝套件,也能:

    • 初始化專案 (npm init)

    • 執行腳本 (npm run start)

    • 管理版本、快取等。

 

npm 的運作核心與重要檔案

npm 的運作圍繞著幾個關鍵檔案與資料夾:

1. package.json

  • 專案的「說明書」,記錄:

    • 套件依賴與版本範圍。

    • 專案名稱、版本、作者、授權等元數據。

  • 常見的版本符號:

    • ^(插入符):允許小版本更新。

    • ~(波浪號):僅允許修補更新。

2. node_modules 資料夾

  • 執行 npm install 後,套件會被下載並解壓至此資料夾。

  • 結構演進:

    • npm v3 以前:採用遞迴巢狀結構,導致依賴樹深且可能超出系統路徑長度限制。

    • npm v3 起:改為扁平化結構(hoisting),減少重複安裝與路徑問題。

  • 雖改善許多,但仍可能因大量依賴造成磁碟空間消耗。

3. package-lock.json

  • 自 npm v5 引入,用於鎖定套件版本,確保團隊成員間環境一致。

  • 它記錄了實際安裝的版本與依賴樹狀結構,使 npm install 結果可重現。

 

安裝模式:本地與全域

特性 本地安裝 (Local) 全域安裝 (Global)
指令 npm install <package> npm install -g <package>
安裝位置 專案內的 node_modules 系統層級的目錄
用途 專案內部依賴(如 Express) 命令列工具(如 nodemon、pm2)
是否記錄於 package.json

 

npm 的發展歷史與生態

1. 創立與收購

npm 由 Isaac Z. Schlueter 開發,後來在 2020 年 3 月被 GitHub 收購。此舉使 npm 的維護更穩定,也與 GitHub Packages 整合更緊密。

2. 與 Node.js 的關係

Node.js 基於 Google 的 V8 引擎開發,讓 JavaScript 可在伺服器端執行。而 npm 則成為 Node.js 生態系的核心支柱,負責管理所有可重複使用的模組。

3. 安全性與品質考量

  • npm registry 並無內建嚴格的安全審核機制,可能出現低品質或惡意套件。

  • 建議:

    • 鎖定版本並納入 package-lock.json

    • 定期使用 npm audit 檢查漏洞。

  • 著名事件:

    • left-pad 事件:開發者撤下一個簡單套件,導致大量專案崩潰。

    • node-ipc 惡意代碼事件:展示開源供應鏈安全的重要性。

 

效能挑戰與替代方案

由於 npm install 屬於 I/O 密集操作,速度常被詬病,因此出現了其他工具:

工具 特點
Yarn 支援平行安裝與快取機制,早期版本效能優於 npm。
pnpm 採用硬連結與符號連結(Hardlink/Symlink),節省磁碟空間並加速安裝。

 

總結

npm 不僅是 Node.js 的套件管理工具,更是現代 JavaScript 生態的基礎建設。
它讓開發者能專注於應用程式本身,而非依賴管理的細節。
儘管市面上已有 Yarn、pnpm 等替代品,但 npm 仍是業界最廣泛使用、最穩定的選擇之一。