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 -- --coverage

yarn.lock

yarn.lock 记录每个依赖的精确版本、校验哈希和下载地址,确保跨机器安装结果一致。必须提交到 Git

  • Classic:yarn.lock(自定义格式)
  • Berry:yarn.lock(与 Classic 不兼容)
# 手动重新生成锁文件
yarn install --force

Workspaces(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.jsondependencies 中):

{
  "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 对比

特性npmyarn Classicyarn Berrypnpm
安装速度最快(PnP)最快
磁盘占用最高最低(零安装)最低
幽灵依赖存在存在严格(PnP)严格隔离
Monorepo基础WorkspacesWorkspaces原生优秀
锁文件package-lock.jsonyarn.lockyarn.lockpnpm-lock.yaml
零安装✓(cache 提交)

相关链接

  • npm — Node.js 默认包管理器
  • pnpm — 高效包管理器,严格隔离依赖
  • Node — Node.js 运行时基础
  • nvm — Node.js 版本管理