Ocavue's Blog
Yarn 2 使用体验 2020-12-25

Yarn 是 JavaScript 社区非常流行的包管理工具。在 2020-01-24,Yarn 2 正式发布了 (opens new window)。在观察了一段时间后,我从上个月起将我的几个项目升级到了 Yarn 2。在这篇文章中,我将简短地描述以下我这一个月以来对 Yarn 2 的感受。

注意:这不是一篇 Yarn 2 教程,我不会详细地介绍 Yarn 2 的每一个特性。如果你想要了解更多关于 Yarn 2 的信息,请查看 Yarn 2 的官方文档 (opens new window)

# Plug'n'Play

毫无疑问,Yarn 2 最大的特点是它的 Plug'n'Play 系统(以下简称 PnP)。虽然 Yarn 1 也可以使用 PnP,但是 Yarn 2 默认开启了它。

node_modules 是 Node.js 被广为诟病的一点,Yarn PnP 就是社区尝试替代 node_modules 的一个方案。在第一次安装依赖后,除了 yarn.lock,Yarn 2 还会创建一个 .pnp.js 文件。通过这个文件,Yarn 可以主动地告诉 Node.js 应当在哪个具体的位置找到某一个包,而不是让 Node.js 自己尝试在 node_modules 目录中寻找依赖。通过这种方式,Yarn 可以把所有的包以 zip 的格式储存起来,甚至让不同的工程共用同一份依赖文件,从而减少依赖的体积和加载时间。根据我的实际体验,Yarn PnP 的确很快,令人非常惊艳。

然而,目前的 Node.js 社区工具几乎都是基于 node_modules 进行开发的。这导致 Yarn PnP 和目前的很多工具都不兼容,比如编辑器。如果你的编辑器无法解析依赖,那么你需要额外的步骤,这包括在你的代码库中增加额外的文件,以及手动配置你编辑器,甚至安装额外的插件。更不用说,截止到今天,Yarn 还只支持 VSCode 和 Vim。

由于这些不足,虽然考虑到 Yarn PnP 速度很快,我还是回到了 node_modules 的模式(通过在 .yarnrc.yml 中添加 nodeLinker: node-modules)。PnP 很棒,但是我觉得这个世界还没有准备好。

# yarn.lock and yarn deque

Yarn 1 的一个很大的问题是 yarn.lock 中会出现依赖版本的重复和落后的问题。这个问题曾经造成了一些令人非常疑惑的现象。在过去,我一直在使用 Atlassian 公司推出的 yarn-deduplicate (opens new window) 来修复这个问题。Yarn 2 原生支持了 yarn deque 命令,可以说从根本上解决了这个问题。

# 总结

总体而言,Yarn 2 还是挺让人满意的。虽然说 PnP 有些超前,但是也兼容了 node_modules。我会在我几个大型工程中继续使用 Yarn 2,并继续观察。