Appearance
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
与其他包管理器对比
特性 | Yarn | NPM | PNPM |
---|---|---|---|
安装速度 | 快 | 中等 | 最快 |
磁盘空间使用 | 中等 | 高 | 低 |
锁文件精确度 | 高 | 高 | 高 |
工作区支持 | 优秀 | 有限 | 优秀 |
Plug'n'Play | 支持 | 不支持 | 不支持 |
插件系统 | 丰富 | 无 | 无 |