Yarn 是一款面向 JavaScript 和 Node.js 生态的包管理器,由 Meta(原 Facebook)于 2016 年联合 Exponent、Google、Tilde 共同创建,用于解决早期 npm 在安装速度、依赖确定性和离线能力上的不足。它通过 lockfile 锁定依赖版本、并行下载、全局缓存、workspaces 等机制管理项目依赖,且始终复用 npm 注册表中的同一批包,因此可在不重写 package.json 的前提下与 npm 平滑切换。经过多年发展,Yarn 分化为两条版本线:处于维护模式的 Yarn Classic(v1.x)与持续演进的 Yarn Modern(又称 Yarn Berry,v4.x),后者引入了 Plug'n'Play、零安装、约束引擎和插件系统等现代化能力。
yarn.lock 的文件,记录依赖树中每一个包的确切版本、解析地址和完整性校验值yarn add、yarn remove、yarn upgrade 等操作时,它会随之更新yarn.lock,忽略各依赖内部可能存在的同名文件,因为顶层文件已包含整棵依赖树所需的全部信息^1.2.0)的歧义yarn.lock,不同机器上会得到完全一致的依赖树yarn.lock 应纳入版本控制(如 Git),使团队成员、CI 服务器都能安装出相同的依赖yarn.lock → 计算所有包的哈希值(基于解析地址与完整性校验)→ 检查缓存中是否已有对应 zip 包 → 命中则跳过下载、直接建立链接 → 并行执行 postinstall 脚本.yarn/cache),便于纳入版本控制;也可通过 enableGlobalCache: true 切换为所有项目共享的全局缓存yarn cache cleanyarn.lock 中的校验和对每个包进行验证,降低被篡改或损坏的风险yarn npm audit 命令检查依赖树中的已知漏洞,并支持自动修复YARN_ENABLE_HARDENED_MODE=1yarn install --immutable 会在 lockfile 可能被修改时直接失败,防止 CI 中发生意外更新yarn install.pnp.cjs 映射文件,并把离线缓存(.yarn/cache)提交到仓库git checkout 实际上就等价于一次"准安装"yarn install,因为这类包依赖的文件无法像 Node.js 脚本那样直接从 zip 归档中求值yarn.config.cjs(或 .ts、.mjs)文件,导出 constraints 方法即可定义规则yarn constraints 会在规则不满足时抛出错误;运行 yarn constraints --fix 则会尝试自动修复问题update 等方法声明目标状态@yarnpkg/types 类型包,便于用 TypeScript 编写约束配置@yarnpkg/core)重新设计,大部分实际功能都通过插件实现,甚至连 yarn add、yarn install 本身也是预装插件@yarnpkg/core),无需在自己的依赖中重复声明^1.2.0)转换为完全限定的包引用.pnp.cjs,node-modules 链接器生成传统目录结构afterAllInstalled)@yarnpkg/builder 工具将 TypeScript 源码打包为单文件发布package.json 中添加 workspaces 字段,列出各子包的相对路径(支持 glob 模式,如 "packages/*")package.json,就会成为一个独立的 workspaceworkspace: 协议相互引用(如 "@my-org/utils": "workspace:^"),该协议在发布时会被透明替换为实际版本号catalog: 协议在多个 workspace 间共享依赖范围yarn workspaces foreach 可跨多个 workspace 并行运行同名脚本,-A 选中全部、-p 并行、-t 按拓扑顺序(依赖优先)执行yarn workspaces focus 可聚焦安装指定 workspace 及其传递依赖所需的包,跳过其他无关内容yarn why 命令会打印某个包出现在依赖树中的确切原因,即是哪条依赖链最终引入了它yarn why lodash@^3)来查明为何项目依赖了某个特定版本-R, --recursive 参数后,会深入列出每个 workspace 通向该依赖的所有路径--json 参数可将输出格式化为 NDJSON 流,便于脚本处理--peers 参数会同时打印与指定名称匹配的 peer dependenciesyarn.lock 中扁平化的依赖条目来理解包之间的关系yarn why,直到追溯到项目的直接依赖为止维度 | Yarn Classic(v1.x) | Yarn Modern(v4.x) |
|---|---|---|
模块链接方式 | 传统的 node_modules 目录 | 默认 Plug'n'Play,用 .pnp.cjs 映射替代目录 |
配置文件 | .yarnrc / .npmrc | 统一的 .yarnrc.yml(YAML 格式) |
插件系统 | 仅限内置功能 | 完整的模块化插件 API 生态 |
约束引擎 | 不支持 | 基于 JavaScript 的约束引擎 |
零安装 | 不支持 | 支持(PnP + 离线缓存) |
一次性运行包 | yarn global | yarn dlx |
yarn.lock 会被自动转换,通常几天即可完成中等规模项目的迁移.yarnrc.yml 中设置 nodeLinker: node-modules 回退到传统目录结构yarn audit 改为 yarn npm audit、yarn create 改为 yarn dlx create-xxx.pnp.cjs 映射文件直接回答"某个包在哪里"的问题,从机制上消除了幽灵依赖nmHoistingLimits 配置来限制提升范围,收紧依赖可见性.pnp.cjs 映射文件,从压缩缓存中直接定位包指标 | pnpm | Yarn Modern(PnP) | Yarn Classic |
|---|---|---|---|
冷安装速度 | 快(实测常为最快档) | 快(热安装场景优势明显) | 与 npm 接近 |
磁盘占用 | 最低(多项目共享 store) | 较低(PnP 缓存去重) | 较高(扁平 node_modules) |
幽灵依赖防护 | 默认严格隔离 | PnP 模式天然隔离 | 依赖提升,存在风险 |
monorepo 支持 | 过滤与拓扑排序成熟 | workspaces + 约束引擎 | 基础 workspaces |