什麼是 NPM?Node.js 套件管理完整指南
NPM 全名是 Node Package Manager(Node 套件管理器),是用來安裝、管理、分享 JavaScript 套件(packages)的工具。安裝 Node.js 時就會一併安裝 npm,不需要另外下載。
有了 npm,您不必自己重寫日期處理、資料驗證、打包工具這些輪子,一行指令就能把全世界開發者寫好的套件裝進專案裡。
還沒安裝 Node.js?
npm 是隨 Node.js 一起安裝的,建議先用 NVM 管理 Node.js 版本 再開始。
node -v # 確認 Node.js 版本
npm -v # 確認 npm 版本建立專案
在空目錄執行下列指令,即可產生 package.json:
npm init # 逐項回答問題
npm init -y # 全部使用預設值,最快NPM 基本指令
安裝套件(dependencies)
專案執行時會用到的套件(上線時也需要)。
npm install lodash --save
# 或簡寫
npm i lodash --saveNPM 5 之後,--save 成為預設行為
npm install lodash
# 或簡寫
npm i lodash安裝開發套件(devDependencies)
只在開發階段使用的套件(上線時不需要),例如:打包工具、測試框架、程式碼檢查工具。
npm install vite --save-dev
# 或簡寫
npm i vite -D指定版本安裝
npm install express@4.18.3全域安裝
npm install -g nodemon
# 或簡寫
npm i -g nodemon全域安裝要節制
全域套件會綁在「目前這個 Node 版本」底下,切換版本後就會消失,也容易造成團隊成員版本不一致。能寫進 devDependencies 就別裝全域,需要臨時執行時改用 npx。
安裝專案的所有套件
拿到別人的專案(node_modules 不會進版控)時,只要執行:
npm install # 依 package.json 安裝
npm ci # 嚴格依 package-lock.json 安裝,適合 CI/正式環境npm ci 會先清空 node_modules 再完整照 lock 檔安裝,速度更快也更可重現。
更新套件
npm outdated # 先查看哪些套件有新版本
npm update # 在 package.json 允許的範圍內升級移除套件
npm uninstall lodash免安裝執行套件(npx)
npx 會暫時下載並執行套件,用完即丟,適合只跑一次的工具:
npx create-vite my-app
npx servepackage.json 與 package-lock.json
| 檔案 | 功能 |
|---|---|
package.json | 專案描述檔,記錄專案資訊、依賴套件、腳本(scripts) |
package-lock.json | 鎖定套件版本,確保每次安裝結果一致 |
這兩個檔案都要進版控
package-lock.json 常被誤以為是自動產生就不用提交,但它正是「讓每個人裝到相同版本」的關鍵,務必一起 commit。反之 node_modules/ 一定要寫進 .gitignore。
package.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 執行,等於幫一長串指令取一個好記的名字:
npm run dev # 執行 "dev": "vite"
npm run build # 執行 "build": "vite build"
npm run # 列出所有可用的 scriptstart 與 test 是保留名稱,可以省略 run 直接寫 npm start、npm test。
開發版本管理
網站或軟體的版號規劃,通常是為了清楚標示軟體的更新內容、穩定性與相容性。這套規則稱為 語意化版本(Semantic Versioning,簡稱 SemVer)。
格式
主版號.次版號.修訂號-預發行版本.建構元資訊
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 預設會加上 ^,也就是自動接受不破壞相容性的更新。
其他套件管理工具
| 工具 | 特性 |
|---|---|
| npm | Node 官方預設,穩定、普遍 |
| 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 install 依 package.json 的版本範圍安裝,可能會更新 lock 檔;npm ci 會先清空 node_modules,再嚴格照 package-lock.json 安裝,速度更快也更可重現,適合 CI 與正式環境。
npm 與 npx 有什麼差別?
npm 用來安裝與管理套件;npx 則是暫時下載並執行套件,用完即丟,適合只跑一次的工具。
node_modules 出問題怎麼辦?
多數安裝異常都可以靠重裝解決,切換 Node 版本後尤其常見:
rm -rf node_modules package-lock.json
npm install若問題只出現在特定 Node 版本,請參考 NVM 版本管理 切換版本後再試。