跳到主要内容

yarn

yarn 是 Facebook(现 Meta)开发的 JavaScript 包管理器,于 2016 年发布,旨在解决 npm 早期版本的性能和安全问题。

yarn 版本

yarn 有两个主要版本:

版本说明
yarn 1 (Classic)经典版本,稳定可靠
yarn 2+ (Berry)现代版本,支持 Plug'n'Play (PnP)

安装

yarn 1 (Classic)

# 使用 npm 安装
npm install -g yarn

# 使用 Corepack(Node.js 16.10+)
corepack enable

# 使用 Homebrew(macOS)
brew install yarn

# 使用安装脚本
curl -o- -L https://yarnpkg.com/install.sh | bash

yarn 2+ (Berry)

# 在项目中启用 yarn 2
yarn set version berry

# 或指定版本
yarn set version 4.0.0

# 升级到最新版本
yarn set version latest

基本使用

初始化项目

# 创建 package.json
yarn init

# 使用默认值
yarn init -y

# 初始化 yarn 2 项目
yarn init -2

安装依赖

# 安装所有依赖
yarn

# 或
yarn install

# 安装生产依赖
yarn add lodash

# 安装指定版本
yarn add [email protected]

# 安装开发依赖
yarn add -D jest
yarn add --dev jest

# 安装 peer 依赖
yarn add -P react

# 安装可选依赖
yarn add -O eslint

# 全局安装
yarn global add typescript

# 安装精确版本
yarn add --exact lodash

删除依赖

# 删除依赖
yarn remove lodash

# 删除开发依赖
yarn remove -D jest

# 删除全局依赖
yarn global remove typescript

更新依赖

# 检查可更新的依赖
yarn outdated

# 更新依赖
yarn upgrade

# 更新到最新版本
yarn upgrade --latest

# 更新特定包
yarn upgrade lodash

# 交互式更新
yarn upgrade-interactive

yarn.lock

yarn 使用 yarn.lock 文件锁定依赖版本,确保团队成员安装的依赖完全一致。

# yarn.lock
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz"
integrity sha512-v3k...

注意事项

  • 提交到版本控制
  • 不要手动编辑
  • 使用 yarn install 时自动更新

配置管理

.yarnrc.yml (yarn 2+)

# 设置镜像源
npmRegistryServer: "https://registry.npmmirror.com"

# 启用 Plug'n'Play
nodeLinker: pnp

# 使用 node_modules(兼容模式)
nodeLinker: node-modules

# 缓存设置
cacheFolder: "./.yarn/cache"

# 全局文件夹
globalFolder: "./.yarn/global"

# 压缩级别
compressionLevel: mixed

.yarnrc (yarn 1)

# 设置镜像源
registry "https://registry.npmmirror.com"

# 代理设置
proxy "http://proxy.example.com:8080"
https-proxy "http://proxy.example.com:8080"

# 缓存文件夹
cache-folder "./.yarn-cache"

# 离线镜像
offline-mirror "./offline-mirror"

常用配置命令

# 查看所有配置
yarn config list

# 查看特定配置
yarn config get registry

# 设置配置
yarn config set registry https://registry.npmmirror.com

# 删除配置
yarn config unset registry

Plug'n'Play (PnP)

yarn 2+ 引入了 Plug'n'Play 模式,完全消除了 node_modules 文件夹。

启用 PnP

# 设置 PnP 模式
yarn config set nodeLinker pnp

# 生成 .pnp.cjs 文件
yarn install

PnP 优点

  • 安装速度极快
  • 磁盘空间占用少
  • 严格的依赖管理
  • 确定性的依赖解析

PnP 兼容性

某些工具可能需要额外配置:

# 安装 VS Code 支持
yarn dlx @yarnpkg/sdks vscode

# 安装 TypeScript 支持
yarn dlx @yarnpkg/sdks base

切换回 node_modules

# 切换到 node_modules 模式
yarn config set nodeLinker node-modules

# 重新安装
yarn install

工作区 (Workspaces)

yarn 原生支持单体仓库管理。

配置

// package.json
{
"private": true,
"workspaces": [
"packages/*",
"apps/*"
]
}

workspace 命令

# 安装所有 workspace 依赖
yarn install

# 在特定 workspace 执行命令
yarn workspace @myproject/core run build

# 添加依赖到特定 workspace
yarn workspace @myproject/core add lodash

# 在所有 workspace 执行命令(yarn 1)
yarn workspaces run build

# 在所有 workspace 执行命令(yarn 2+)
yarn workspaces foreach run build

workspace 协议 (yarn 2+)

{
"dependencies": {
"@myproject/core": "workspace:*",
"@myproject/utils": "workspace:^"
}
}
协议说明
workspace:*使用精确版本
workspace:^使用兼容版本
workspace:~使用近似版本

脚本命令

定义脚本

{
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest",
"build": "webpack --mode production"
}
}

运行脚本

# 运行脚本
yarn start
yarn test
yarn build

# 运行自定义脚本
yarn run custom-script

# 传递参数
yarn test --coverage

# 并行运行(yarn 2+)
yarn workspaces foreach -p run test

# 按拓扑顺序运行(yarn 2+)
yarn workspaces foreach -t run build

发布包

# 登录
yarn login

# 发布前检查
yarn pack --dry-run

# 发布
yarn publish

# 发布到指定镜像源
yarn publish --registry https://registry.npmjs.org

# 发布 scoped 包
yarn publish --access public

# 发布 beta 版本
yarn publish --tag beta

# 发布新版本
yarn version patch # 1.0.0 -> 1.0.1
yarn version minor # 1.0.0 -> 1.1.0
yarn version major # 1.0.0 -> 2.0.0

yarn dlx

类似于 npx,用于执行包命令:

# 创建项目
yarn dlx create-react-app my-app
yarn dlx create-vite my-app

# 使用特定版本
yarn dlx [email protected] my-app

# 从 GitHub 执行
yarn dlx github:user/repo

# 执行本地包
yarn dlx ./local-package

常用命令速查

yarn 1

命令说明
yarn init初始化项目
yarn / yarn install安装所有依赖
yarn add <pkg>安装依赖
yarn add -D <pkg>安装开发依赖
yarn remove <pkg>删除依赖
yarn upgrade更新依赖
yarn outdated检查过期依赖
yarn run <script>运行脚本
yarn list查看已安装依赖
yarn global add <pkg>全局安装
yarn global list查看全局依赖
yarn why <pkg>查看依赖原因
yarn cache clean清除缓存
yarn check检查依赖

yarn 2+ 额外命令

命令说明
yarn set version <version>设置 yarn 版本
yarn plugin import <plugin>安装插件
yarn workspaces foreach遍历所有 workspace
yarn npm audit安全审计
yarn npm info <pkg>查看包信息
yarn rebuild重新构建依赖

与 npm 命令对比

npmyarn 1yarn 2+
npm installyarnyarn
npm install <pkg>yarn add <pkg>yarn add <pkg>
npm install -D <pkg>yarn add -D <pkg>yarn add -D <pkg>
npm uninstall <pkg>yarn remove <pkg>yarn remove <pkg>
npm run <script>yarn <script>yarn <script>
npm listyarn listyarn info
npm outdatedyarn outdatedyarn upgrade-interactive
npm updateyarn upgradeyarn up
npm ciyarn install --frozen-lockfileyarn install --immutable
npx <cmd>yarn dlx <cmd>yarn dlx <cmd>

插件系统 (yarn 2+)

yarn 2+ 支持插件扩展功能。

常用插件

# 安装插件
yarn plugin import typescript
yarn plugin import interactive-tools
yarn plugin import workspace-tools
yarn plugin import version

# 查看已安装插件
yarn plugin runtime

常用插件功能

插件功能
typescriptTypeScript 支持
interactive-tools交互式工具
workspace-toolsworkspace 工具
version版本管理

最佳实践

1. 使用 Zero-Install

yarn 2+ 支持 Zero-Install 模式,将缓存提交到仓库:

# .yarnrc.yml
pnpEnableInlining: false
# .gitignore
.pnp.*
!.yarn/cache
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions

2. 使用约束

# .yarnrc.yml
enableConstraints: true
# constraints.pro
gen_enforced_dependency(DEV, "jest", null, null).

3. 安全审计

# yarn 1
yarn audit

# yarn 2+
yarn npm audit

# 检查许可证
yarn licenses list

4. 使用 .yarnignore

# .yarnignore
*.test.js
*.spec.js
coverage/
docs/
.DS_Store

5. 缓存管理

# 查看缓存路径
yarn cache dir

# 清除缓存
yarn cache clean

# 清除特定包缓存
yarn cache clean lodash

从 yarn 1 迁移到 yarn 2+

# 1. 安装 yarn 2
yarn set version berry

# 2. 更新配置
# 将 .yarnrc 转换为 .yarnrc.yml

# 3. 重新安装依赖
yarn install

# 4. 检查兼容性
yarn install --check-resolutions

了解更多