缓存策略
概述
Yarn 拥有广泛的缓存设置,让你可以根据首选的工作流或 CI 平台进行调整。本说明档将介绍一些最值得了解的有趣模式。
默认情况下,Yarn 会缓存你安装的所有内容,并在你的机器上的所有其他项目中使它们通用;这会提高安装速度和磁盘占用,就像你使用硬链接一样。
主要模式
离线镜像
首次在机器上安装时,通常会从 npm 注册表检索包。虽然通常工作正常,但并非总是如此 - 已知注册表会时不时遇到问题,这常常会导致安装失败。如果您没有做好准备,这可能会严重影响您的开发人员,因为切换分支和执行部署可能会困难得多或不稳定。
一些公司尝试通过将他们的注册表配置为他们控制的镜像来避免这个问题(例如通过让服务器运行 Verdaccio,npm 注册表的开源实现)。然而,它需要一个特定的设置,而这个设置并不总是很容易部署到开发人员和 CI,并且这些系统有时会带来 风险。
Yarn 提供了一个非常简单但有效的替代方案:通过将 enableGlobalCache
设置为 false,它会将包缓存保存到项目本地文件夹(默认情况下为 .yarn/cache
),然后可以将其添加到 Git。因此,每个给定的提交都可以保证安装,即使 npm 注册表出现故障。
零安装
零安装是 Yarn 的两个功能的组合,它允许您在切换分支时跳过考虑运行 yarn install
- 这是一个很容易忘记的要求,直到您看到您的工具崩溃。
正如我们所看到的,离线镜像通过将 Yarn 缓存保留在存储库中,消除了项目对 npm 注册表的依赖。但我们能更进一步,直接让这个缓存成为实际缓存吗?答案是肯定的!
只要你的项目使用 Yarn PnP 和 离线镜像,你所要做的就是将加载器文件添加到 Git,然后就可以忘记 yarn install
了。由于 PnP 加载器无论在哪个机器上生成,其内容都完全相同,并且离线缓存将包含加载器引用的所有文件,因此 git checkout
调用实际上相当于 yarn install
的一种排序。
一个警告:添加或删除具有本机依赖项的包仍需要运行 yarn install
,因为此类包依赖于与 Node.js 脚本不同、无法直接从其 zip 存档中评估的文件。这些包在实践中非常少见,而且更新不频繁,并且如果你忘记执行此操作,Yarn 将显示一条有用的错误消息,因此这不会显著影响该模式的实用性。
从技术上讲,可以通过将 node_modules
文件夹添加到 Git 来实现零安装。然而,不同之处在于 node_modules
文件夹包含数千个文件,Git 必须分别对每个文件进行差异化,提升会导致它们经常被移动,并且人们倾向于对其 node_modules
文件夹进行手动更改,最终提交。
相比之下,将缓存添加到 Git 并使用 Yarn PnP 可以为你提供一个文件夹,其中每个包都有一个 zip 存档,以及 PnP 加载器文件。正如我们之前看到的,这对于 Git 来说更容易跟踪。
特定环境
GitHub 操作
我们仍在调查使 GH 操作缓存更有效的默认设置。我们很可能会为此目的中期提供一个官方的 yarn-cache
操作。