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