Yarn 版本梳理

当拷贝一个开源代码,或者自己用 Yarn 搭建一个前端项目,屡次被版本坑到了,但是之前了解过区别,毕竟 Yarn 到 2.x 之后名字都叫 berry 了。所以搞懂版本关系,以防遇到某些开源项目,跟自己本地版本不一致搞晕了

先说踩坑结论:

目前我本地是用的 3.8.7,因此在使用 yarn install 不会有 node_modules 依赖存储在 .yarn/cache 中,并且默认是 PnP 模式,因此跑低版本传统node_modules 会跑不起来

拿到开源项目,判断他们使用的什么模式很重要,例如:

项目中没有 .pnp.js.pnp.cjs 文件

没有 .yarn 文件夹结构
如果项目是传统模式,自己本地是高版本,两种解决办法:

  1. 切换自己本地 yarn 版本到低版本,切换回之前的 Yarn 版本(例如 1.x),可以运行:

    1
    volta install yarn@1

    我本地是用了 volta,所以这样切换语法:

    1
    volta install yarn@<版本号>
  2. 项目级别配置(推荐)
    在项目根目录创建或修改 .yarnrc.yml 文件,终端执行如下命令:

    1
    2
    # 在项目目录中执行
    echo 'nodeLinker: node-modules' > .yarnrc.yml

    然后重新安装依赖:

    1
    yarn install

1. Yarn 版本历史简介

Yarn 的版本可以分为以下几个阶段:

  • Yarn 1.x:经典版本,基于 node_modules 的依赖管理。
  • **Yarn 2.x (Berry)**:引入了 Plug’n’Play (PnP)、Workspaces 优化等新特性。
  • Yarn 3.x:在 2.x 基础上进一步优化性能和稳定性。
  • Yarn 4.x:最新版本,提供了更好的性能、开发者体验和兼容性。

2. Yarn 1.x vs Yarn 2.x/3.x/4.x 的主要区别

Yarn 1.x

  • 依赖管理:基于 node_modules,依赖会被解压到 node_modules 文件夹中。
  • 安装速度:相对较慢,尤其是在大型项目中。
  • 功能:支持 Workspaces,但功能较为基础。
  • 兼容性:与大多数工具和框架兼容。

Yarn 2.x/3.x/4.x

  • 依赖管理
    • 默认使用 **Plug’n’Play (PnP)**,依赖存储在 .yarn/cache 中,不生成 node_modules
    • 支持 nodeLinker: node-modules 切换回传统模式。
  • 安装速度:显著提升,尤其是在大型项目中。
  • 功能
    • 改进的 Workspaces 支持。
    • 新增 yarn dlx 命令(类似于 npx)。
    • 更好的 Monorepo 支持。
  • 兼容性
    • PnP 可能需要额外配置才能兼容某些工具(如 Babel、Webpack)。
    • Yarn 4.x 对工具链的兼容性更好。

扩展知识点

我之前博客提到了我使用 yarn4.x版本,创建项目,用了一个命令

1
yarn dlx @yarnpkg/sdks vscode 

解释:yarn dlx @yarnpkg/sdks vscode 命令用于为使用 Yarn 2+ (Berry) 的项目配置 VS Code 编辑器支持。 这个命令会在项目中生成 VS Code 特定的配置文件,使编辑器能够正确理解 Yarn 的 Plug’n’Play (PnP) 依赖管理系统。 它生成的配置能确保 VS Code 中的 TypeScript、ESLint 等工具可以正确找到项目依赖,从而提供代码补全、类型检查等功能。 执行后,它会在 .yarn/sdks 目录中创建必要的配置文件,并可能会提示你允许 VS Code 使用这些工作区特定的配置