yarn
Yarn 是 Facebook 开源的 Node.js 包管理器,以更快的安装速度和确定性锁文件著称。目前有两个主流版本:Yarn Classic(v1) 和 Yarn Berry(v2+,现为 v4),两者命令大体兼容但内部机制差异较大。
同类工具:npm(Node.js 默认)、pnpm(硬链接节省磁盘)。
安装
# 通过 npm 全局安装 Yarn Classic(v1)
npm install -g yarn
# 升级到 Yarn Berry(推荐在项目内独立使用)
yarn set version stable # 切换到最新 stable(Berry)
yarn set version 4.x # 指定主版本
# 验证版本
yarn --version推荐通过 Corepack(Node 16.10+ 内置)管理 Yarn 版本:
corepack enable corepack prepare yarn@stable --activate
初始化项目
yarn init # 交互式创建 package.json
yarn init -y # 全部默认值,快速生成安装依赖
# 安装 package.json 中的所有依赖
yarn install
yarn # 缩写
# CI 严格模式:按 yarn.lock 安装,不更新锁文件
yarn install --frozen-lockfile # Classic
yarn install --immutable # Berry
# 安装生产依赖
yarn add express
yarn add express@4.18.2 # 指定版本
# 安装开发依赖
yarn add -D typescript jest
yarn add --dev eslint
# 安装全局工具(Classic)
yarn global add nodemon
# Berry 不推荐全局安装,改用 yarn dlx
yarn dlx create-react-app my-app # 临时执行,类似 npx卸载与更新
# 卸载
yarn remove express
# 查看可更新包
yarn outdated # Classic
yarn upgrade-interactive # 交互式选择升级
# 更新到最新版(在 SemVer 范围内)
yarn upgrade
yarn upgrade express
# 强制升级到最新(忽略范围)
yarn upgrade express --latest运行脚本
yarn run dev
yarn run build
yarn test # test / start 可省略 run
yarn start
# 传递额外参数
yarn run test -- --coverageyarn.lock
yarn.lock 记录每个依赖的精确版本、校验哈希和下载地址,确保跨机器安装结果一致。必须提交到 Git。
- Classic:
yarn.lock(自定义格式) - Berry:
yarn.lock(与 Classic 不兼容)
# 手动重新生成锁文件
yarn install --forceWorkspaces(Monorepo)
Yarn 原生支持 Workspaces,是 Monorepo 的主流方案之一:
配置
根目录 package.json:
{
"name": "my-monorepo",
"private": true,
"workspaces": [
"packages/*",
"apps/*"
]
}项目结构:
monorepo/
├── package.json
├── yarn.lock
├── packages/
│ ├── ui/
│ │ └── package.json # name: "@myorg/ui"
│ └── utils/
│ └── package.json # name: "@myorg/utils"
└── apps/
└── web/
└── package.json
工作区命令
# 在所有工作区运行命令(Classic)
yarn workspaces run build
# 在指定工作区运行(Classic)
yarn workspace @myorg/ui run build
# Berry:更强大的过滤(类似 pnpm --filter)
yarn workspaces foreach -A run build
yarn workspaces foreach --include '@myorg/*' run test工作区内互相引用(在 package.json 的 dependencies 中):
{
"dependencies": {
"@myorg/ui": "workspace:*"
}
}Yarn Berry — Plug’n’Play(PnP)
Berry 默认启用 PnP 模式,抛弃 node_modules,改用 .pnp.cjs 映射文件:
.yarn/
├── cache/ ← 压缩包缓存(可提交到 Git,实现零安装)
├── releases/
│ └── yarn-4.x.js ← 项目锁定的 Yarn 版本
└── unplugged/ ← 需要原生构建的包
.pnp.cjs ← 依赖映射(不能删)
优势:安装速度极快,无 node_modules,可「零安装」(将 cache 提交到 Git,CI 无需 install)。
零安装配置(.gitignore):
.yarn/*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions若工具不支持 PnP,可降级为 node_modules 模式(.yarnrc.yml):
nodeLinker: node-modules.yarnrc.yml 配置(Berry)
Berry 使用 .yarnrc.yml(Classic 用 .yarnrc):
# 指定 Yarn 版本(提交到 Git,团队统一使用)
yarnPath: .yarn/releases/yarn-4.x.js
# 依赖安装模式
nodeLinker: node-modules # 兼容模式(替代 pnp)
# 镜像源
npmRegistryServer: "https://registry.npmmirror.com"
# 私有包作用域
npmScopes:
myorg:
npmRegistryServer: "https://npm.mycompany.com"
npmAuthToken: "${MY_NPM_TOKEN}"常用命令速查
yarn # 安装所有依赖
yarn add <pkg> # 安装生产依赖
yarn add -D <pkg> # 安装开发依赖
yarn remove <pkg> # 卸载
yarn upgrade-interactive # 交互式升级
yarn run <script> # 运行脚本
yarn dlx <pkg> # 临时执行(Berry,类似 npx)
yarn info <pkg> # 查看包信息
yarn list # 列出已安装包
yarn why <pkg> # 解释为何安装该包
yarn dedupe # 合并重复依赖版本(Berry)
yarn workspaces list # 列出所有工作区yarn vs npm vs pnpm 对比
| 特性 | npm | yarn Classic | yarn Berry | pnpm |
|---|---|---|---|---|
| 安装速度 | 中 | 快 | 最快(PnP) | 最快 |
| 磁盘占用 | 最高 | 高 | 最低(零安装) | 最低 |
| 幽灵依赖 | 存在 | 存在 | 严格(PnP) | 严格隔离 |
| Monorepo | 基础 | Workspaces | Workspaces | 原生优秀 |
| 锁文件 | package-lock.json | yarn.lock | yarn.lock | pnpm-lock.yaml |
| 零安装 | ✗ | ✗ | ✓(cache 提交) | ✗ |