Skip to content

什麼是 NPM?Node.js 套件管理完整指南

NPM:安裝、管理與分享 JavaScript 套件

NPM 全名是 Node Package Manager(Node 套件管理器),是用來安裝、管理、分享 JavaScript 套件(packages)的工具。安裝 Node.js 時就會一併安裝 npm,不需要另外下載。

有了 npm,您不必自己重寫日期處理、資料驗證、打包工具這些輪子,一行指令就能把全世界開發者寫好的套件裝進專案裡。

還沒安裝 Node.js?

npm 是隨 Node.js 一起安裝的,建議先用 NVM 管理 Node.js 版本 再開始。

bash
node -v   # 確認 Node.js 版本
npm -v    # 確認 npm 版本

建立專案

在空目錄執行下列指令,即可產生 package.json

bash
npm init        # 逐項回答問題
npm init -y     # 全部使用預設值,最快

NPM 基本指令

安裝套件(dependencies)

專案執行時會用到的套件(上線時也需要)。

bash
npm install lodash --save
# 或簡寫
npm i lodash --save

NPM 5 之後,--save 成為預設行為

bash
npm install lodash
# 或簡寫
npm i lodash

安裝開發套件(devDependencies)

只在開發階段使用的套件(上線時不需要),例如:打包工具、測試框架、程式碼檢查工具。

bash
npm install vite --save-dev
# 或簡寫
npm i vite -D

指定版本安裝

bash
npm install express@4.18.3

全域安裝

bash
npm install -g nodemon
# 或簡寫
npm i -g nodemon

全域安裝要節制

全域套件會綁在「目前這個 Node 版本」底下,切換版本後就會消失,也容易造成團隊成員版本不一致。能寫進 devDependencies 就別裝全域,需要臨時執行時改用 npx

安裝專案的所有套件

拿到別人的專案(node_modules 不會進版控)時,只要執行:

bash
npm install     # 依 package.json 安裝
npm ci          # 嚴格依 package-lock.json 安裝,適合 CI/正式環境

npm ci 會先清空 node_modules 再完整照 lock 檔安裝,速度更快也更可重現。

更新套件

bash
npm outdated    # 先查看哪些套件有新版本
npm update      # 在 package.json 允許的範圍內升級

移除套件

bash
npm uninstall lodash

免安裝執行套件(npx)

npx 會暫時下載並執行套件,用完即丟,適合只跑一次的工具:

bash
npx create-vite my-app
npx serve

package.json 與 package-lock.json

檔案功能
package.json專案描述檔,記錄專案資訊、依賴套件、腳本(scripts)
package-lock.json鎖定套件版本,確保每次安裝結果一致

這兩個檔案都要進版控

package-lock.json 常被誤以為是自動產生就不用提交,但它正是「讓每個人裝到相同版本」的關鍵,務必一起 commit。反之 node_modules/ 一定要寫進 .gitignore

package.json

json
{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "start": "node index.js"
  },
  "dependencies": {
    "vue": "^3.5.0"
  },
  "devDependencies": {
    "vite": "^5.0.0"
  }
}

npm scripts

scripts 裡定義的指令可用 npm run 執行,等於幫一長串指令取一個好記的名字:

bash
npm run dev     # 執行 "dev": "vite"
npm run build   # 執行 "build": "vite build"
npm run         # 列出所有可用的 script

starttest 是保留名稱,可以省略 run 直接寫 npm startnpm test

開發版本管理

網站或軟體的版號規劃,通常是為了清楚標示軟體的更新內容、穩定性與相容性。這套規則稱為 語意化版本(Semantic Versioning,簡稱 SemVer)

格式

主版號.次版號.修訂號-預發行版本.建構元資訊

matlab
1.2.3
1.2.3-alpha.1
2.0.0-beta

組成說明

部分說明
主版號 (Major)大更新、破壞相容性,舊版可能無法直接升級
次版號 (Minor)新功能更新,仍向下相容
修訂號 (Patch)修正錯誤、微小改進,完全向下相容
預發行版本 (Pre-release)alpha / beta / rc (release candidate) 等,表示尚未正式穩定
建構元資訊 (Build metadata)通常用來記錄 build number 或 commit id,不影響版本排序

套件版本管理

package.json 裡的版本號前面常帶有符號,用來描述「允許升級到哪裡」:

符號說明
^1.2.3可升級到 1.x.x 但不含 2.0.0
~1.2.3可升級到 1.2.x 但不含 1.3.0
1.2.3鎖定該版本

npm install 預設會加上 ^,也就是自動接受不破壞相容性的更新。

其他套件管理工具

工具特性
npmNode 官方預設,穩定、普遍
yarn速度快、鎖檔一致性強、離線快取
pnpm以硬連結節省磁碟空間、安裝極快、近年最受歡迎

同一個專案只用一種

三者的 lock 檔互不相容(package-lock.json / yarn.lock / pnpm-lock.yaml),同一個專案請固定使用一種,避免依賴解析結果不一致。

常見問題

dependencies 與 devDependencies 有什麼差別?

dependencies 是專案執行時需要的套件,上線後仍會用到;devDependencies 只在開發階段使用,例如:打包工具、測試框架、程式碼檢查工具。安裝時加上 --save-dev(或 -D)即可歸類到 devDependencies

package-lock.json 需要提交到 Git 嗎?

需要。它記錄了實際安裝的版本,是讓每位開發者與 CI 都裝到相同版本的關鍵;node_modules/ 則要寫進 .gitignore

npm install 與 npm ci 有什麼不同?

npm installpackage.json 的版本範圍安裝,可能會更新 lock 檔;npm ci 會先清空 node_modules,再嚴格照 package-lock.json 安裝,速度更快也更可重現,適合 CI 與正式環境。

npm 與 npx 有什麼差別?

npm 用來安裝與管理套件;npx 則是暫時下載並執行套件,用完即丟,適合只跑一次的工具。

node_modules 出問題怎麼辦?

多數安裝異常都可以靠重裝解決,切換 Node 版本後尤其常見:

bash
rm -rf node_modules package-lock.json
npm install

若問題只出現在特定 Node 版本,請參考 NVM 版本管理 切換版本後再試。

延伸閱讀