Skip to main content

請說明一下 npm 的套件管理機制

npm 是 Node.js 的預設套件管理工具,用來安裝、管理、分享 JavaScript 套件。這些套件可以是函式庫(如 React、Lodash)或工具(如 Webpack、ESLint),讓我們快速引入外部程式碼,提升開發效率。

核心概念

  1. package.json:專案的設定檔,記錄專案資訊與依賴套件。

  2. node_modules:儲存實際安裝的套件檔案。

  3. npm 指令:用來管理套件的各種操作(安裝、更新、移除等)。

  4. 套件版本管理:透過語義化版本控制(Semantic Versioning, SemVer)管理版本。

  5. 全域與本地安裝:套件可以安裝在專案本地或全域環境。

  6. 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

實作範例

  1. 建立資料夾並初始化:

    mkdir my-project
    cd my-project
    npm init -y
  2. 安裝 axios:

    npm install axios
  3. 建立 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();
  4. 在 package.json 新增腳本:

    "scripts": {
    "start": "node index.js"
    }
  5. 執行:

    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

使用步驟

  1. 在既有專案中切換到 Yarn:

    yarn;

    (這會根據 package.json 安裝所有依賴,並產生 yarn.lock。)

  2. 安裝套件:

    yarn add axios
  3. 開發依賴:

    yarn add eslint --dev
  4. 移除:

    yarn remove axios
  5. 更新:

    yarn upgrade
  6. 實作範例(延續 npm 範例):

    • 切換到 Yarn:

      yarn;
    • 執行腳本:

      yarn start

    Yarn 的指令類似 npm,但更快。如果你有 package.json,直接用 Yarn 安裝,就不用改程式碼。

2. pnpm

pnpm 是高效能工具,用「內容可定址儲存」方式共享套件,節省磁碟空間。它產生 pnpm-lock.yaml 檔案。

安裝 pnpm

全域安裝:

npm install -g pnpm

使用步驟

  1. 在既有專案中切換到 pnpm:

    pnpm install

    (會安裝依賴並產生 pnpm-lock.yaml。)

  2. 安裝套件:

    pnpm add axios
  3. 開發依賴:

    pnpm add eslint --save-dev
  4. 移除:

    pnpm remove axios
  5. 更新:

    pnpm update
  6. 實作範例:

    • 切換到 pnpm:

      pnpm install
    • 執行腳本:

      pnpm start

    pnpm 的 node_modules 結構不同(用符號連結),但對程式碼無影響。適合磁碟空間小的電腦。

如何選擇?

  • 如果專案小,用 npm 就夠。

  • 團隊合作,用 Yarn 確保版本一致。

  • 多專案或空間有限,用 pnpm。

切換工具時,記得刪除舊的 node_modules:

rm -rf node_modules

安全性問題

在使用套件管理工具時,安全性是重要議題。JavaScript 生態系龐大,但有些套件可能有漏洞、惡意程式碼,或供應鏈攻擊(supply chain attacks,例如駭客滲透熱門套件)。以下說明常見問題與解決方法,讓你能一步步檢查。

常見安全性問題

  1. 依賴漏洞:套件或其子依賴有已知安全漏洞。

  2. 惡意套件:有些套件偽裝成熱門套件,但內含後門(例如竊取資料)。

  3. 版本過舊:未更新導致暴露風險。

  4. 權限過高:套件要求不必要的系統權限。

  5. 供應鏈攻擊:駭客修改官方儲存庫的套件。

如何檢查與修復(以 npm 為例,其他工具類似)

  1. 使用 npm audit 檢查漏洞

    • 執行:

      npm audit
    • 這會掃描 package.json 中的依賴,列出已知漏洞(來自 npm 的安全資料庫)。

    • 範例輸出:

      found 2 high severity vulnerabilities
    • 自動修復:

      npm audit fix

      (會更新套件到安全版本,但可能打破相容性。)

  2. 手動更新套件

    • 檢查過時套件:

      npm outdated
    • 更新特定套件:

      npm update axios
  3. 使用 Yarn 或 pnpm 的安全功能

    • Yarn:用 yarn audit 檢查漏洞。

    • pnpm:用 pnpm audit 檢查。

    • 它們的鎖定檔案(lock file)能防止意外版本變更,提高安全性。

  4. 最佳實務

    • 只安裝信任套件:檢查套件在 npm 網站的星數、下載量、維護狀態。

    • 使用 --save-exact:固定版本安裝,避免自動更新:

      npm install axios --save-exact
    • 定期審核:在 CI/CD 流程中加入 npm audit。

    • 避免全域安裝:全域套件有系統權限風險。

    • 工具輔助:用 Snyk 或 Dependabot 等第三方工具自動掃描(但需額外設定)。

    • 如果發現惡意:移除套件並報告給 npm 官方。

實作範例:檢查安全性

  1. 在你的專案中執行:

    npm audit
  2. 如果有漏洞,執行:

    npm audit fix --force
  3. 確認更新後,測試程式碼是否正常:

    npm start

如果漏洞無法自動修復,手動更新 package.json 中的版本,並重新安裝。


總結

整合 npm 的機制後,我們可以看到 Yarn 和 pnpm 是優秀的替代品,能改善速度與空間問題。安全性方面,記得定期用 audit 指令檢查,並遵循最佳實務,避免風險。這些工具都能相容你的 JavaScript 程式碼,讓你專注開發。