Skip to content

Yarn

简介

Yarn (Yet Another Resource Negotiator) 是由 Facebook 在 2016 年推出的 JavaScript 包管理器,旨在解决 NPM 的一些性能和安全问题。Yarn 提供了更快的依赖安装、更好的离线支持和更确定的依赖解析。

核心特性

速度优化

Yarn 通过并行下载和缓存机制显著提升了安装速度:

bash
# 安装所有依赖
yarn

# 添加新依赖
yarn add lodash

# 添加开发依赖
yarn add --dev jest

# 全局安装
yarn global add typescript

确定性安装

Yarn 使用锁文件 (yarn.lock) 确保在不同环境中安装完全相同的依赖版本,提高了项目的可复现性。

工作区 (Workspaces)

Yarn 支持单仓库多包 (Monorepo) 开发模式:

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

这允许多个相关项目共享依赖和构建过程,简化了大型项目的管理。

版本对比

Yarn Classic (v1)

最广泛使用的稳定版本,提供了基础功能和性能优化。

Yarn Berry (v2+)

全新架构的 Yarn 版本,引入了 Plug'n'Play (PnP) 模式,无需 node_modules 文件夹,进一步提升了性能和安全性。

bash
# 启用 Yarn 2
yarn set version berry

# 配置 PnP 模式
yarn config set nodeLinker pnp

常用命令

bash
# 初始化项目
yarn init

# 安装依赖
yarn
yarn install

# 添加依赖
yarn add package-name
yarn add package-name@version
yarn add package-name --exact  # 精确版本

# 更新依赖
yarn upgrade
yarn upgrade package-name

# 移除依赖
yarn remove package-name

# 运行脚本
yarn run script-name
yarn script-name  # 简写形式

# 查看过时依赖
yarn outdated

# 清理缓存
yarn cache clean

配置文件

package.json

与 NPM 使用相同的 package.json 格式:

json
{
  "name": "my-project",
  "version": "1.0.0",
  "scripts": {
    "start": "node index.js",
    "build": "webpack"
  },
  "dependencies": {
    "react": "^17.0.2"
  },
  "devDependencies": {
    "jest": "^27.0.0"
  }
}

yarn.lock

自动生成的锁文件,记录了确切的依赖版本和完整性校验信息。

.yarnrc.yml

Yarn 2+ 的配置文件,用于自定义 Yarn 行为:

yaml
yarnPath: .yarn/releases/yarn-3.2.0.cjs

packageExtensions:
  "package-name@*":
    dependencies:
      missing-dependency: "^1.0.0"

plugins:
  - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
    spec: "@yarnpkg/plugin-typescript"

nodeLinker: pnp

高级功能

插件系统

Yarn 2+ 提供了强大的插件系统,可以扩展其功能:

bash
# 添加 TypeScript 插件
yarn plugin import typescript

# 添加工作区工具插件
yarn plugin import workspace-tools

离线镜像

bash
# 生成离线镜像
yarn workspaces focus --production --json > workspaces-info.json
yarn pack

# 从离线镜像安装
yarn config set yarn-offline-mirror ./npm-packages-offline-cache
yarn install --offline

最佳实践

依赖管理

  • 使用 --exact 标志锁定关键依赖的精确版本
  • 利用 resolutions 字段解决依赖冲突
  • 定期运行 yarn upgrade-interactive 审查和更新依赖

工作区优化

  • 使用 yarn workspaces run 在所有工作区执行命令
  • 利用 yarn workspace <name> 在特定工作区执行命令
  • 配置共享的 ESLint 和 TypeScript 配置

常见问题与解决方案

依赖冲突

json
// package.json
{
  "resolutions": {
    "problematic-package": "1.2.3"
  }
}

PnP 兼容性问题

bash
# 回退到 node_modules 模式
yarn config set nodeLinker node-modules

缓存问题

bash
# 清理并重建缓存
yarn cache clean
yarn install --force

与其他包管理器对比

特性YarnNPMPNPM
安装速度中等最快
磁盘空间使用中等
锁文件精确度
工作区支持优秀有限优秀
Plug'n'Play支持不支持不支持
插件系统丰富

学习资源