Yarn 套件管理器完整指南:初學者入門
更新日期: 2025 年 3 月 20 日
本文為 Yarn 套件基礎,第 1 篇:
在開發 JavaScript 應用程式時,管理第三方函式庫(libraries)或模組(modules)是一個不可避免的工作。
對於這個需求,開發者通常會使用套件管理器(Package Manager)來安裝、更新和移除所需的套件。
最常見的 JavaScript 套件管理器是 npm(Node Package Manager),但在專案規模變大時,npm 可能會遇到安裝速度慢、相依性管理(dependencies management)混亂等問題。
為了解決這些痛點,Facebook 於 2016 年推出了 Yarn,提供更快、更安全、更穩定的套件管理體驗。
本篇文章將帶你了解 Yarn 的基本概念、安裝方式,以及如何在專案中使用它來管理套件,讓你能夠更有效率地開發 JavaScript 應用程式!
Yarn 是什麼?
在 JavaScript 開發的世界裡,專案往往需要依賴大量的外部函式庫(libraries)和模組(modules)。
這時候就需要一個套件管理器(Package Manager)來幫助我們安裝、更新、移除和管理這些相依性(dependencies)。
傳統上,開發者大多使用 npm(Node Package Manager) 來處理這些需求。
然而,隨著專案規模變大,npm 逐漸暴露出了一些缺點,例如:
- 安裝速度較慢:npm 會逐一下載相依套件,導致安裝時間變長。
- 相依性管理不夠穩定:不同環境可能會安裝不同版本的相依性,造成「在我這裡可以運作,但在你那裡卻不行」的問題。
- 安全性風險:npm 下載的套件可能會被惡意篡改,帶來安全漏洞。
為了解決這些問題,Facebook 在 2016 年推出了 Yarn,它是一款高效、穩定且安全的 JavaScript 套件管理器。
Yarn 的全名是 “Yet Another Resource Negotiator”(另一個資源協調器),這個名稱源於 Apache Hadoop 生態系統中的一個技術,也反映了 Yarn 的核心目標——有效管理專案的相依性。
Yarn 相較於 npm,主要強化了以下幾個方面:
更快的安裝速度
Yarn 採用並行下載(parallel downloads),可以同時下載多個套件,而 npm 則是逐一下載,因此 Yarn 安裝速度通常比 npm 更快。
此外,Yarn 內建快取機制(caching),下載過的套件會被存儲起來,下一次安裝時可以直接使用,不需要重新下載,大幅提升效能。
gantt title Yarn vs npm 並行下載示意圖比較 dateFormat X axisFormat %s section Yarn 下載 (並行) 套件 A :a1, 0, 3 套件 B :a2, 0, 4 套件 C :a3, 0, 5 section npm 下載 (順序) 套件 A :b1, 0, 3 套件 B :b2, 3, 7 套件 C :b3, 7, 12 section 時間對比 Yarn 總時間 (並行) :crit, m1, 0, 5 npm 總時間 (順序) :crit, m2, 0, 12
更好的相依性管理
Yarn 使用 yarn.lock
檔案 來記錄專案的相依性版本,確保不同環境下安裝的套件版本一致,避免開發者之間的環境差異導致錯誤。
- npm 早期(v5 之前)沒有類似
lock
檔案,導致相依性可能不一致。 - Yarn 的
yarn.lock
設計,確保每次安裝的套件版本與前一次完全相同,減少「在 A 端能跑,但 B 端無法運作」的情況。 - npm 在 v5+ 之後才加入
package-lock.json
,但 Yarn 的yarn.lock
更早推出且更穩定。
更高的安全性
Yarn 內建校驗機制(checksum verification),在下載套件時會驗證完整性,確保下載的檔案沒有遭到惡意篡改。
這比 npm 更安全,因為 npm 早期的版本並未內建這種機制,開發者需要額外使用 npm audit
工具來檢查安全性。
支援離線安裝
Yarn 會自動快取下載過的套件,因此即使沒有網路,開發者也能安裝之前用過的套件,這對於網路不穩定的環境(例如:飛機上、公司內部受限的網路)特別有幫助。
📌 離線模式安裝示意:
# 只要之前下載過某個套件,即使沒有網路,仍然可以安裝
yarn install --offline
Yarn 與 npm 的比較
雖然 npm 近年來也做了不少優化(例如 npm v7+
改進了相依性管理與安裝速度),但 Yarn 仍然具備一些獨特的優勢。
以下是 Yarn 與 npm 在不同方面的比較:
功能 | Yarn | npm(舊版 v5-) | npm(新版 v7+) |
---|---|---|---|
安裝速度 | ✅ 快(並行下載 + 快取) | ❌ 較慢(逐一下載) | ✅ 改進後較快(並行下載) |
相依性管理 | ✅ yarn.lock 確保一致性 | ❌ package-lock.json(v5+) | ✅ package-lock.json |
安全性 | ✅ 內建校驗機制,防止惡意套件 | ❌ 需額外使用 npm audit | ✅ 內建 npm audit 工具 |
離線安裝 | ✅ 支援 | ❌ 需手動設定 | 🔸 部分支援 |
CLI 指令 | yarn add/remove/install | npm install/uninstall | npm install/uninstall |
npm 新版的改進
值得一提的是,npm 在 v7+ 版本開始逐步優化,改善了安裝速度、支援 peerDependencies
、並行下載等功能,使其在效能上更接近 Yarn。
不過,Yarn 仍然在離線模式與相依性管理方面表現更優秀,因此許多大型專案仍然選擇 Yarn 作為首選的套件管理器。
Yarn 與 npm 的選擇建議
📌 何時選擇 Yarn?
- 需要更快的安裝速度(特別是多人協作時)。
- 希望確保每次安裝的套件版本完全一致。
- 需要高安全性,避免下載到被篡改的套件。
- 需要離線安裝功能,提升開發效率。
📌 何時選擇 npm?
- 使用 Node.js 內建的功能,不想額外安裝 Yarn。
- 專案已經基於 npm 且運行穩定,不想切換工具。
- 需要與 npm 官方生態系統(如
npm audit
)更緊密結合。
如何安裝 Yarn?
Yarn 可以透過多種方式安裝,以下是幾種常見的方法:
透過 npm 安裝 Yarn
如果你的系統已安裝 Node.js,你可以直接使用 npm 來安裝 Yarn:
npm install --global yarn
安裝完成後,可以透過以下指令確認 Yarn 是否安裝成功:
yarn --version
若顯示版本號(如 1.22.19
或 3.0.2
),表示安裝成功。
使用官方安裝方式
如果你不想透過 npm 安裝,Yarn 提供了官方安裝方式,支援 macOS、Windows 和 Linux。
你可以依照官方文件的說明,使用 Homebrew(macOS)、Chocolatey(Windows)或 Shell Script(Linux)來安裝。
官方文件網址:https://yarnpkg.com/getting-started/install
使用 Corepack 安裝(Node.js 16.10+ 版本)
如果你的 Node.js 版本為 16.10.0 或以上,建議使用 Corepack 來管理 Yarn:
corepack enable
啟用後,即可使用 yarn
指令安裝與管理專案套件。
Yarn 基本指令
初始化專案
在專案目錄中執行以下指令,建立 package.json
設定檔:
yarn init -y
📌 適用版本: Yarn v1, v2, v3
執行後,專案目錄中會生成 package.json
檔案,記錄專案的基本資訊與相依性。
⚠ Yarn v2 及 v3 的不同點
- 在 Yarn v1,預設會互動式詢問專案資訊,
-y
可略過詢問並使用預設值。 - 在 Yarn v2+(Berry),
yarn init
主要建立package.json
,但若要轉換為 Yarn v2,需要執行:yarn set version berry
安裝套件
使用 yarn add
指令安裝 npm 套件,例如安裝 lodash
:
yarn add lodash
📌 適用版本: Yarn v1, v2, v3
✅ 安裝特定版本的套件(例如 [email protected]
):
yarn add [email protected]
✅ 安裝開發相依性(devDependencies)(只在開發環境使用):
yarn add eslint --dev
⚠ Yarn v2+ 的不同點
- Yarn v1 預設使用
node_modules/
來儲存安裝的套件。 - Yarn v2+(Berry) 採用 Plug’n’Play(PnP),不再使用
node_modules/
,相依性會記錄在.pnp.cjs
檔案中,提升效能。
如果專案需要 node_modules/
目錄,可以使用 “node_modules linker” 模式:
yarn config set nodeLinker node-modules
yarn install
移除套件
要移除某個已安裝的套件,使用 yarn remove
指令,例如移除 lodash
:
yarn remove lodash
📌 適用版本: Yarn v1, v2, v3
安裝所有相依性(專案初始化)
當你從 GitHub 或其他開發者獲取專案程式碼時,通常會有 package.json
和 yarn.lock
檔案。執行以下指令來安裝所有必要的套件:
yarn install
📌 適用版本: Yarn v1, v2, v3
📌 Yarn v2+ 可簡寫為 yarn
,效果等同於 yarn install
⚠ 不同版本的 yarn install
行為:
- Yarn v1:建立
node_modules/
,下載相依性。 - Yarn v2+(Berry):使用 PnP,不建立
node_modules/
,而是透過.pnp.cjs
來管理相依性。 - 若專案強制使用
node_modules/
,請執行:yarn config set nodeLinker node-modules yarn install
Yarn 進階功能
使用 Yarn 離線模式
Yarn 會自動快取下載過的套件,因此即使沒有網路,你仍然可以安裝之前用過的套件:
yarn install --offline
📌 適用版本: Yarn v1, v2, v3
✅ 如果快取中有該套件,將直接使用,不從網路下載。
✅ 適合在沒有網路或受限環境下工作,例如:內部專案、飛機上開發(過勞命)等。
⚠ 注意:
- 如果快取中沒有某個套件,
yarn install --offline
會安裝失敗。 - 可以使用
yarn cache list
來檢查已快取的套件。
清除 Yarn 快取
如果遇到 Yarn 安裝異常,或想強制重新下載套件,可以清除 Yarn 的快取:
yarn cache clean
📌 適用版本: Yarn v1, v2, v3
✅ 清除所有快取的 npm 套件,提高安裝穩定性。
✅ 如果安裝遇到奇怪的問題(例如:某些套件安裝失敗或版本不匹配),建議執行此指令後再重新安裝。
安裝專案相依性,但不變更 yarn.lock(CI/CD 推薦)
在 CI/CD(持續整合/部署)環境中,為了確保專案相依性與 yarn.lock
一致,不應自動變更 yarn.lock
,可以使用:
yarn install --frozen-lockfile
📌 適用版本: Yarn v1, v2, v3
✅ 確保 yarn.lock
沒有變更,若有變更則報錯,防止不一致的相依性版本被安裝。
✅ 適合 CI/CD、自動化部署,確保安裝的版本與 yarn.lock
完全相符。
Yarn v1、v2、v3 指令對應表
指令 | Yarn v1 | Yarn v2 | Yarn v3 |
---|---|---|---|
初始化專案 | yarn init -y | yarn init -y | yarn init -y |
安裝相依性 | yarn install | yarn install 或 yarn | yarn install 或 yarn |
安裝套件 | yarn add [pkg] | yarn add [pkg] | yarn add [pkg] |
安裝開發套件 | yarn add [pkg] --dev | yarn add [pkg] -D | yarn add [pkg] -D |
移除套件 | yarn remove [pkg] | yarn remove [pkg] | yarn remove [pkg] |
使用離線模式 | yarn install --offline | yarn install --offline | yarn install --offline |
清除快取 | yarn cache clean | yarn cache clean | yarn cache clean |
確保 yarn.lock 一致 | yarn install --frozen-lockfile | yarn install --immutable | yarn install --immutable |
結論
Yarn 提供了許多實用的指令來管理專案相依性,並且不同版本的 Yarn 在指令使用上略有不同。
- Yarn v1 依賴
node_modules/
,較接近 npm 的使用方式。 - Yarn v2+(Berry) 採用 PnP,不使用
node_modules/
,效能更優化,但可透過nodeLinker
設定回傳統模式。 - 在 CI/CD 環境中,推薦使用
yarn install --frozen-lockfile
或yarn install --immutable
來確保相依性一致。
結論
Yarn 是一款強大且高效的 JavaScript 套件管理器,相較於 npm,Yarn 具備更快的安裝速度、更好的相依性管理能力,並提供更高的安全性與離線安裝功能。
如果你是一名 JavaScript 開發者,學會使用 Yarn 將能幫助你更流暢地管理專案的相依性,提升開發效率!快試試吧 🚀!