請說明一下 npm 的套件管理機制
npm 是 Node.js 的預設套件管理工具,用來安裝、管理、分享 JavaScript 套件。這些套件可以是函式庫(如 React、Lodash)或工具(如 Webpack、ESLint),讓我們快速引入外部程式碼,提升開發效率。
核心概念
-
package.json:專案的設定檔,記錄專案資訊與依賴套件。
-
node_modules:儲存實際安裝的套件檔案。
-
npm 指令:用來管理套件的各種操作(安裝、更新、移除等)。
-
套件版本管理:透過語義化版本控制(Semantic Versioning, SemVer)管理版本。
-
全域與本地安裝:套件可以安裝在專案本地或全域環境。
-
npm 儲存庫:預設連接到官方儲存庫下載套件。
如何建立 package.json?
用以下指令初始化:
npm init -y
範例 package.json:
{
"name": "my-frontend-project",
"version": "1.0.0",
"description": "一個簡單的前端專案",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Your Name",
"license": "MIT",
"dependencies": {
"axios": "^1.7.2"
},
"devDependencies": {
"eslint": "^8.0.0"
}
}
安裝與管理套件
-
安裝本地套件:
npm install axios
-
全域安裝:
npm install -g create-react-app
-
開發依賴:
npm install eslint --save-dev
-
移除:
npm uninstall axios
-
更新:
npm update
-
執行腳本:
npm start
版本管理 (SemVer)
格式:主版本號.次版本號.修補版本號(如 1.7.2)。
-
^1.7.2:允許 1.x.x 更新。
-
安裝特定版本:
npm install axios@1.7.2
實作範例
-
建立資料夾並初始化:
mkdir my-project
cd my-project
npm init -y -
安裝 axios:
npm install axios
-
建立 index.js:
const axios = require("axios");
async function fetchData() {
try {
const response = await axios.get(
"https://jsonplaceholder.typicode.com/posts/1"
);
console.log("資料:", response.data);
} catch (error) {
console.error("錯誤:", error.message);
}
}
fetchData(); -
在 package.json 新增腳本:
"scripts": {
"start": "node index.js"
} -
執行:
npm start
常見問題
-
網路問題:切換 Taobao 鏡像:
npm config set registry https://registry.npmmirror.com
-
版本衝突:用
npm install --legacy-peer-deps
。
其他熱門套件管理工具
除了 npm,還有一些熱門替代工具,能解決 npm 的效能問題(如安裝速度慢、node_modules 太大)。我會介紹兩個最常見的:Yarn 和 pnpm。它們都相容 npm 的 package.json,所以你可以輕鬆切換。以下是詳細比較與操作步驟,讓你能一步步跟著做。
比較表
工具 | 優點 | 缺點 | 適合情境 |
---|---|---|---|
npm | 預設工具,指令簡單,社群大。 | 安裝慢,node_modules 佔空間大,版本鎖定不嚴格。 | 初學者或簡單專案。 |
Yarn | 安裝更快,離線模式,嚴格版本鎖定(用 yarn.lock)。 | 需要額外安裝,較舊版本有相容性問題。 | 中大型專案,需要一致性。 |
pnpm | 儲存空間最小(用硬連結共享套件),安裝超快,嚴格依賴管理。 | 學習曲線稍高,有些舊套件不相容。 | 空間有限或多專案環境。 |
1. Yarn
Yarn 是 Facebook 開發的工具,強調速度與可靠性。它會產生 yarn.lock 檔案,確保所有開發者安裝相同版本。
安裝 Yarn
全域安裝:
npm install -g yarn
使用步驟
-
在既有專案中切換到 Yarn:
yarn;
(這會根據 package.json 安裝所有依賴,並產生 yarn.lock。)
-
安裝套件:
yarn add axios
-
開發依賴:
yarn add eslint --dev
-
移除:
yarn remove axios
-
更新:
yarn upgrade
-
實作範例(延續 npm 範例):
-
切換到 Yarn:
yarn;
-
執行腳本:
yarn start
Yarn 的指令類似 npm,但更快。如果你有 package.json,直接用 Yarn 安裝,就不用改程式碼。
-
2. pnpm
pnpm 是高效能工具,用「內容可定址儲存」方式共享套件,節省磁碟空間。它產生 pnpm-lock.yaml 檔案。
安裝 pnpm
全域安裝:
npm install -g pnpm
使用步驟
-
在既有專案中切換到 pnpm:
pnpm install
(會安裝依賴並產生 pnpm-lock.yaml。)
-
安裝套件:
pnpm add axios
-
開發依賴:
pnpm add eslint --save-dev
-
移除:
pnpm remove axios
-
更新:
pnpm update
-
實作範例:
-
切換到 pnpm:
pnpm install
-
執行腳本:
pnpm start
pnpm 的 node_modules 結構不同(用符號連結),但對程式碼無影響。適合磁碟空間小的電腦。
-
如何選擇?
-
如果專案小,用 npm 就夠。
-
團隊合作,用 Yarn 確保版本一致。
-
多專案或空間有限,用 pnpm。
切換工具時,記得刪除舊的 node_modules:
rm -rf node_modules
安全性問題
在使用套件管理工具時,安全性是重要議題。JavaScript 生態系龐大,但有些套件可能有漏洞、惡意程式碼,或供應鏈攻擊(supply chain attacks,例如駭客滲透熱門套件)。以下說明常見問題與解決方法,讓你能一步步檢查。
常見安全性問題
-
依賴漏洞:套件或其子依賴有已知安全漏洞。
-
惡意套件:有些套件偽裝成熱門套件,但內含後門(例如竊取資料)。
-
版本過舊:未更新導致暴露風險。
-
權限過高:套件要求不必要的系統權限。
-
供應鏈攻擊:駭客修改官方儲存庫的套件。
如何檢查與修復(以 npm 為例,其他工具類似)
-
使用 npm audit 檢查漏洞:
-
執行:
npm audit
-
這會掃描 package.json 中的依賴,列出已知漏洞(來自 npm 的安全資料庫)。
-
範例輸出:
found 2 high severity vulnerabilities
-
自動修復:
npm audit fix
(會更新套件到安全版本,但可能打破相容性。)
-
-
手動更新套件:
-
檢查過時套件:
npm outdated
-
更新特定套件:
npm update axios
-
-
使用 Yarn 或 pnpm 的安全功能:
-
Yarn:用 yarn audit 檢查漏洞。
-
pnpm:用 pnpm audit 檢查。
-
它們的鎖定檔案(lock file)能防止意外版本變更,提高安全性。
-
-
最佳實務:
-
只安裝信任套件:檢查套件在 npm 網站的星數、下載量、維護狀態。
-
使用 --save-exact:固定版本安裝,避免自動更新:
npm install axios --save-exact
-
定期審核:在 CI/CD 流程中加入 npm audit。
-
避免全域安裝:全域套件有系統權限風險。
-
工具輔助:用 Snyk 或 Dependabot 等第三方工具自動掃描(但需額外設定)。
-
如果發現惡意:移除套件並報告給 npm 官方。
-
實作範例:檢查安全性
-
在你的專案中執行:
npm audit
-
如果有漏洞,執行:
npm audit fix --force
-
確認更新後,測試程式碼是否正常:
npm start
如果漏洞無法自動修復,手動更新 package.json 中的版本,並重新安裝。
總結
整合 npm 的機制後,我們可以看到 Yarn 和 pnpm 是優秀的替代品,能改善速度與空間問題。安全性方面,記得定期用 audit 指令檢查,並遵循最佳實務,避免風險。這些工具都能相容你的 JavaScript 程式碼,讓你專注開發。