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 的 四栏完整对照表