toolfree

npm → Yarn

你熟的 npm 指令與對應的 Yarn 寫法並排。同時涵蓋 Yarn 1(Classic)與 Yarn 2 以上(Berry),兩者在最常查的那幾條指令上並不一樣。

在你的瀏覽器中執行

要做的事npmyarn
安裝 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 不同的地方會列在下面。

簡短版

npmYarn
npm installyarn install,或直接 yarn
npm install <pkg>yarn add <pkg>
npm install -D <pkg>yarn add -D <pkg>
npm uninstall <pkg>yarn remove <pkg>
npm run buildyarn 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 buildnpm build 是另一個已廢棄的指令,不會執行 scripts 裡的 build

遷移一個專案

  1. 刪掉 package-lock.jsonnode_modules
  2. 執行 yarn install
  3. 看 diff。Yarn 的解析器不是 npm 的,^1.2.0 這種範圍合理地落在不同版本是常有的事。
  4. Commit yarn.lock,而且只 commit 這一個。

倉庫裡放兩個 lockfile,就會變成誰跑哪個指令、誰就得到不同的相依樹。

相關

npm 轉 pnpm,或含 Bun 的 四欄完整對照表