npm → Yarn
你熟的 npm 指令與對應的 Yarn 寫法並排。同時涵蓋 Yarn 1(Classic)與 Yarn 2 以上(Berry),兩者在最常查的那幾條指令上並不一樣。
在你的瀏覽器中執行
| 要做的事 | npm | yarn |
|---|---|---|
| 安裝 lockfile 裡的全部相依 | ||
| CI 安裝,lockfile 若會改動就失敗 | Yarn 1(Classic): | |
| 新增相依套件 | ||
| 新增開發相依 | ||
| 鎖定版本,不用範圍 | ||
| 全域安裝 | 沒有對應指令 Yarn 1(Classic): | |
| 移除相依套件 | ||
| 在既有版本範圍內更新 | Yarn 1(Classic): | |
| 列出落後最新版的套件 | Yarn 1(Classic): | |
| 執行 package.json 裡的 script | ||
| 不安裝就執行套件的執行檔 | ||
| 建立新套件 | ||
| 查出某個套件為什麼被裝進來 | ||
| 檢查相依套件的安全通報 | Yarn 1(Classic): | |
| 把相依裝到某一個 workspace |
Yarn 欄位是 Yarn 2 以上(Berry)。Yarn 1 不同的地方會列在下面。
簡短版
| npm | Yarn |
|---|---|
npm install | yarn install,或直接 yarn |
npm install <pkg> | yarn add <pkg> |
npm install -D <pkg> | yarn add -D <pkg> |
npm uninstall <pkg> | yarn remove <pkg> |
npm run build | yarn build |
npx <pkg> | yarn dlx <pkg>——只有 Berry 有 |
完整的表格在上面,可以填入你自己的套件名稱。
你用的是哪個 Yarn?
這件事比指令清單重要。yarn --version 會告訴你。
Yarn 1.x(Classic) 是絕大多數教學寫的那個,目前只做維護。它的 lockfile 是自訂格式,安裝出
來的 node_modules 和 npm 一樣是攤平的。
Yarn 2 以上(Berry) 是同名的另一個程式。它預設用 Plug’n’Play——完全沒有 node_modules,
相依由一份 .pnp.cjs 對照表解析——而且改掉了好幾條指令。現在鎖定專案用哪一個的做法是
corepack enable 加上 package.json 裡的 packageManager 欄位。
兩者不同時,上面的表格主列顯示 Berry,Classic 列在下面。
npm 有、Yarn 做法不同的三件事
npm ci 沒有完全對應的指令。 yarn install --immutable(Berry)與
yarn install --frozen-lockfile(Classic)都會在 lockfile 將被改動時直接失敗,這正是 CI 要的;
但兩者都不會像 npm ci 那樣先把 node_modules 清掉。
Yarn 2 以上拿掉了全域安裝。 yarn global add 在 Classic 可以用,在 Berry 不存在,而且沒有
替代品。教學叫你用 Yarn 全域安裝某個東西時,先看版本,不要去找那個不存在的參數。
yarn build 會跑你的 script,npm build 不會。 npm 必須寫 npm run build。npm build
是另一個已廢棄的指令,不會執行 scripts 裡的 build。
遷移一個專案
- 刪掉
package-lock.json與node_modules。 - 執行
yarn install。 - 看 diff。Yarn 的解析器不是 npm 的,
^1.2.0這種範圍合理地落在不同版本是常有的事。 - Commit
yarn.lock,而且只 commit 這一個。
倉庫裡放兩個 lockfile,就會變成誰跑哪個指令、誰就得到不同的相依樹。
相關
npm 轉 pnpm,或含 Bun 的 四欄完整對照表。