Yarn 介绍
Yarn 是一个 JavaScript 包管理工具,最初由 Facebook、Google 和 Exponent 等公司共同开发,旨在解决 npm 的一些性能和可靠性问题。Yarn 的核心目标是提高包管理的速度、一致性和效率,同时保持与 npm 的兼容性。随着版本的迭代,Yarn 逐渐引入了更多创新特性,并且成为了许多开发者的首选工具。
Yarn 的主要特点
-
速度
Yarn 的最大特点之一是它的安装速度。相比于早期的 npm,Yarn 引入了并行安装的机制,这可以显著减少安装时间。此外,Yarn 会将已安装的包缓存在本地,后续安装时无需重新下载,进一步提高了效率。 -
离线模式
Yarn 提供了离线模式,允许在没有网络连接的情况下安装依赖。如果你曾经安装过某个依赖,Yarn 会从本地缓存中获取依赖,而无需重新从网络下载。 -
一致性
Yarn 使用yarn.lock
文件来锁定依赖的版本,从而确保项目的依赖一致性。这意味着无论开发者在何时、何地安装依赖,都会安装相同的版本,避免了因版本不一致导致的 bugs 或问题。与之相对的是 npm 之前的package-lock.json
(在 npm 5+ 中引入)。 -
更好的工作空间支持
Yarn 提供了对工作空间(Workspaces)的原生支持,这对于管理 monorepo(多个项目在同一个仓库中的情形)非常有用。通过工作空间,Yarn 可以让你在同一个项目中管理多个包,并且共享依赖,避免重复安装。 -
易于使用的 CLI
Yarn 的命令行接口(CLI)与 npm 很相似,但提供了更高效的操作方式。例如,使用yarn add
来安装依赖,yarn upgrade
来更新依赖,yarn remove
来删除依赖,这些命令都与 npm 的命令保持一致,但使用体验更好。 -
并行化
Yarn 在安装依赖时会并行处理多个包的安装,而不是按照顺序逐个安装。这样可以极大提高安装速度,尤其是当项目有大量依赖时。 -
可靠的依赖解析
Yarn 会确保每个包的版本号都能正确解析。即使项目的依赖有多个层次,Yarn 会根据yarn.lock
文件来确保每个包的版本都符合预期,避免了版本冲突或意外更新。
Yarn 的安装
你可以通过以下几种方式安装 Yarn:
-
通过 npm 安装: 如果你已经安装了 npm(或者 Node.js),你可以使用以下命令来全局安装 Yarn:
npm install -g yarn
-
通过安装脚本安装: 官方提供了安装脚本,你可以通过命令行来运行这个脚本,安装 Yarn:
curl -o- -L https://yarnpkg.com/install.sh | bash
-
使用 Homebrew 安装(macOS): 如果你在 macOS 上使用 Homebrew 包管理器,可以使用以下命令安装 Yarn:
brew install yarn
Yarn 的常见命令
-
安装依赖:
yarn install
会根据
package.json
安装项目所需的依赖,并生成或更新yarn.lock
文件。 -
添加依赖:
yarn add <package-name>
用于安装新的包并将其添加到
dependencies
中。如果是开发依赖,可以使用-D
参数:yarn add <package-name> -D
-
删除依赖:
yarn remove <package-name>
用于删除某个已安装的包,并且会更新
package.json
和yarn.lock
。 -
更新依赖:
yarn upgrade
会升级所有依赖到
package.json
中指定的最新兼容版本。你也可以指定包名来升级某个特定的依赖:yarn upgrade <package-name>
-
生成 yarn.lock 文件:
yarn import
这个命令会从
package-lock.json
或npm-shrinkwrap.json
文件导入信息并生成yarn.lock
文件,以便迁移到 Yarn。 -
执行脚本: 如果你在
package.json
中定义了脚本,可以通过以下命令来执行:yarn run <script-name>
-
启动工作空间: 如果你的项目是一个 monorepo 项目,使用 Yarn 的工作空间管理多个包时,可以使用:
yarn workspaces run <script-name>
Yarn 版本演变
-
Yarn 1.x
这是 Yarn 的最初版本,解决了 npm 的速度和一致性问题。它引入了yarn.lock
、离线安装、并行安装等功能,广泛被开发者接受。 -
Yarn 2.x (Berry)
在 Yarn 2(也被称为 Yarn Berry)中,Yarn 进行了重大重构。新版本引入了许多新特性和改进:- Plug'n'Play (PnP):Yarn 2 引入了 Plug'n'Play 模式,移除了传统的
node_modules
文件夹,改为通过 PnP 的方式解析模块依赖,这大大提高了性能和安全性。 - 改进的工作空间支持:更好地支持 monorepo,提供了更多灵活的配置选项。
- 扩展插件系统:Yarn 2 通过插件系统让开发者可以扩展 Yarn 的功能,支持更多自定义配置和功能。
- Plug'n'Play (PnP):Yarn 2 引入了 Plug'n'Play 模式,移除了传统的
-
Yarn 3.x
Yarn 3.x 延续了 2.x 的许多特性,并在稳定性和性能上进一步优化。此外,Yarn 3.x 还增强了与其他工具(如 pnpm 和 npm)的兼容性,并继续提升对现代 JavaScript 工具链的支持。
Yarn 与 npm 的比较
特性 | Yarn | npm |
---|---|---|
速度 | 更快,支持并行安装和缓存机制 | 较慢,但在 npm 5 以后有改进 |
依赖一致性 | 使用 yarn.lock 确保一致性 | 使用 package-lock.json 确保一致性 |
离线安装 | 支持离线模式 | 仅在缓存中有包时支持离线 |
工作空间 | 强大的工作空间支持 | 从 npm 7 开始支持工作空间 |
CLI | 提供一些额外的功能,命令更简洁 | 基本命令功能,社区扩展较多 |
社区支持 | 广泛,尤其是在 React 生态中 | 全球最大,npm 包仓库最大 |
总结
Yarn 是一个高效且功能强大的 JavaScript 包管理工具,特别适合大型项目和 monorepo 管理。它的优势体现在速度、一致性、离线安装和工作空间支持等方面。尽管 npm 在最近几年做出了许多改进,但 Yarn 依然在性能、可扩展性和开发体验上具有独特的优势,尤其是对于需要高效管理大量依赖或大型项目的开发者。