Yarn 4.0 发布

Yarn团队宣布4.x版本首次贴上稳定标签,包括升级至Node.js18、启用Corepack、强化模式以提高安全性、TypeScript集成和性能优化。新版本降低了学习曲线,同时提供了改进的用户体验。
摘要由CSDN通过智能技术生成

今天就是这一天! 经过一年多的工作,我们的团队很高兴终于在 4.x 发行版的第一个版本上贴上了精美的“稳定”标签! 为了庆祝,让我们一起游览一下这些重大变化; 如果您需要更详细的列表,请查看变更日志

重大变更

以下是从 3.x 项目升级时需要了解的信息:

  • 我们现在需要 Node.js 18+。
  • 使用 yarn init 创建的新项目将不再默认启用 零安装
  • 使用 yarn init 创建的新项目将使用 Corepack 而不是 yarnPath
  • 现在默认包含所有官方插件(typescriptinteractive-tools…)。
  • yarn workspaces foreach 命令的语法略有改变。

安装纱线

自 2.0 以来,我们的建议是使用“yarnPath”设置在每个项目的基础上安装 Yarn(自动设置“yarn init -2”和“yarn set version”)。 我们故意不在 npm yarn 包上发布现代版本,[以免破坏尚未迁移的旧项目](https://yarnpkg.com/getting-started/qa#why-is- the-yarn-package-on-npm-still-on-1x)。

为此,我们过去建议使用指向签入二进制文件的“yarnPath”设置,但这种模式增加的摩擦超出了我们的预期 - 许多人不喜欢将二进制文件添加到他们的存储库中的想法,无论二进制文件多么小。 我们倾听并与 Node.js 共同开发了一个名为 Corepack 的项目。 Corepack 是 Node.js 16+ 附带的工具,它将根据您正在处理的项目自动选择要运行的正确的包管理器版本。

现在 Corepack 随 Node 18 和 20 一起提供,我们不再需要依赖 yarnPath,因此我们更新了我们的 安装指南 以反映 那。 “yarn init -2”和“yarn set version”命令已更新,以便在可能时更新“packageManager”字段。

信息

由于“package.json”中的标准“packageManager”字段,Corepack 知道要使用哪个包管理器版本。 该字段通常通过“yarn init -2”、“yarn set version x.y.z”或更通用的“corepack use yarn@x.y.z”之一进行设置。

强化模式

Yarn 试图保护您免受常见攻击,而强化模式的引入进一步推动了这一点。 在此模式下运行时,Yarn 将执行两个额外的验证:

  • 它将验证存储在锁定文件中的分辨率与范围可以解析的一致。
  • 它将验证存储在锁定文件中的包元数据与远程注册表元数据是否一致。

总之,这些检查将防止任何攻击者在使用 Yarn 对您的项目进行 PR 时秘密修改您的锁定文件 (<https://snyk.io/blog/why-npm-lockfiles-can-be-a-security-blindspot-for -注入恶意模块/>)。

提示

强化模式是通过切换“enableHardenedMode”来启用的,但当 Yarn 检测到它在公共存储库上的 GitHub 拉取请求中运行时,它也会自动启用。 可以通过在yarnrc文件中显式关闭“enableHardenedMode”来禁用此功能。

警告

在强化模式约束下运行的安装比平常慢得多,因为它们需要执行许多否则会被跳过的网络请求。 我们不建议默认启用它 - 如果您在特定 CI 作业中需要它,请通过环境变量将其打开:

 导出 YARN_ENABLE_HARDENED_MODE=1

JavaScript 约束

Yarn 是唯一实现约束引擎 的包管理器。 如果您不知道,此功能可让您定义项目必须满足的一组规则。 例如,Yarn 存储库强制要求两个工作区不得依赖于任何给定依赖项的不同版本,除非明确允许。

我们的约束引擎过去由 Tau-Prolog 提供支持,Tau-Prolog 是一种 JavaScript Prolog 实现。 与 JavaScript 等命令式语言不同,Prolog 使用称为逻辑编程的不同模型 - 如果规则为真,则定义某些事物存在。 这是一个非常有趣的模式,与基于规则的 linting 概念很好地结合在一起。 不幸的是,Prolog 被证明使用起来非常复杂,增加了约束的学习曲线,超出了我们可以接受的阈值。

因此,从 Yarn 4 开始,Prolog 约束已被弃用,并且 它们已被一个闪亮的基于 JavaScript 的新引擎取代,并具有可选的 TypeScript 支持! 我们一直在 Datadog 使用这个框架已有几个月了,取得了巨大的成功。 您还可以查看公共 Yarn 存储库,了解可以在以下位置强制执行的规则类型的实际示例: 存储库级别和新修改的文档 可帮助您快速上手。

提示

新的可选“enableConstraintsChecks”设置将使 Yarn 作为“yarn install”的一部分运行您的约束。 这是一种在等待远程 CI 提出错误之前显示错误的便捷方法,而且由于新引擎速度如此之快,它对您的安装时间几乎没有影响 🚀

TypeScript 集成、交互工具…

Yarn 中的各种功能过去都是作为侧载插件提供的,需要与主包分开管理。 虽然这帮助我们建立了一个插件生态系统,但事实证明,为我们的用户管理也具有挑战性。 我们实现了一些功能来使这变得更容易(自动更新 Yarn 时自动升级插件),但最终我们通过不默认提供所有功能而获得的几个 KiB 不值得它们造成的混乱和摩擦。

因此,虽然 Yarn 仍然支持第三方插件(并将在未来继续支持),但我们构建的所有功能和命令现在都可以作为主发行版的一部分。 现在,您可以在没有插件的情况下使用“yarn Upgrade-interactive”和“yarn stage”,如果您在项目中配置了 TypeScript,那么每当您使用“更新依赖项”时,Yarn 现在都会根据需要自动添加和删除“@types”包。 纱线添加纱线移除`。

改进的用户界面

用户界面的各个部分都经过了改进,以更好地传达信息。 例如,“yarn install”现在会告诉您添加的包及其总重量。 您还会注意到,它不会打印有关对等依赖项的尽可能多的警告,因为我们现在尝试仅打印可操作情况的警告:

 ➤ YN0000:·纱线 4.0.0
 ➤ YN0000: ┌ 解析步骤
 ➤ YN0085: │ + next@npm:13.5.4、react-dom@npm:18.2.0 以及其他 24 个。
 ➤ YN0000: └ 0s 280ms 完成
 ➤ YN0000: ┌ 获取步骤
 ➤ YN0013: │ 22 个包已添加到项目中 (+ 177.72 MiB)。
 ➤ YN0000: └ 3s 723ms 完成
 ➤ YN0000: ┌ 链接步骤
 ➤ YN0000: └ 已完成
 ➤ YN0000: · 4s 123ms 内完成警告

另一个例子是“yarn config”命令,它显示新的树形结构,现在还接受任意数量的设置作为位置参数,让您选择您希望看到的内容:

 ├─ 缓存文件夹
 │ ├─ 说明:必须写入缓存文件的文件夹
 │ ├─ 来源:
 │ └─ 值:'/Users/global/.yarn/berry/cache'
 │
 └─ 启用HardenedMode
    ├─ 描述:如果为 true,则在安装时自动启用 --check-分辨率 --refresh-lockfile
    ├─ 来源:
    └─ 值:空

表演

4.0 在性能改进方面并不落后,并且安装速度明显快于 3.6。 例如,以下是从冷缓存安装 Gatsby 及其约 350MiB 依赖关系树的时间差。 性能提高了 3 倍,这是由于新的包元数据缓存显着提高了重复安装的性能:

 hyperfine -L v stable,canary --prepare 'rm -rf ~/.yarn/berry/cache' 'cd $(mktemp -d) && 纱线初始化 -2 && 纱线设置版本 {v} && 纱线 && 纱线添加 gatsby - -mode=跳过构建'

 基准1:3.6.0
   时间(平均值±σ):65.599 s ± 2.214 s [用户:82.952 s,系统:8.638 s]
   范围(最小值 … 最大值):62.167 s … 68.277 s 10 次运行

 基准2:4.0.0

   时间(平均值±σ):16.724 s ± 0.928 s [用户:14.622 s,系统:5.743 s]

   范围(最小值 … 最大值):15.318 s … 18.110 s 10 次运行

 概括
   4.0.0 的运行速度比 3.6.0 快 3.92 ± 0.25 倍

这些变化使得 Yarn 在大多数场景下与 pnpm 一样快,尽管竞争仍然激烈🔥

精美网站

您可能已经注意到,我们的网站在风格和内容上都进行了重大改革! 我们在这个新版本上工作了一年多,我们希望它能帮助您比以前更快地找到更好的信息。

一些具体的改进:

  • 所有引用的命令现在都链接到其文档(yarn install
  • 所有引用的选项现在都有一个工具提示来解释其目标(yarn --immutable-cache
  • 大多数页面都经过重写,以便在需要时进行简化和澄清
  • 包页面现在显示各种可配置的检查,例如包是否支持 CJS、ESM、具有类型……

我们的专业知识不仅仅在于构建网站,还在于工具,因此我确信仍然存在各种悬而未决的成果 - 特别是在加载时间附近。 如果您有兴趣帮助我们,请查看来源请随时向我们发送 PR!

结束语

从 Yarn 3 过渡到 Yarn 4 的旅程是漫长的,一路上有多达 53 个候选版本,但我们终于成功了! 我们这次新迭代的目标是降低 Yarn 的学习曲线并改善您的用户体验,而不会让迁移感到难以承受。 我们共同努力避免做出重大破坏性更改,除非我们还有自动迁移项目的方法,因此,如果您遇到任何您认为该软件应该解决的问题,请在 Discord 上与我们分享您的反馈 .gg/yarnpkg)。

至于未来会发生什么,现在提供明确的答案还为时过早,但我可以告诉你,我对原生 Yarn 构建的潜力特别感兴趣。 性能最近成为人们关注的焦点,我有时想知道 Node.js 的整体执行时间有多少开销。 话虽这么说,我们不打算对代码库进行另一次完全重写,也不希望损害使 Yarn 对贡献者如此友好的因素,因此具体细节以及时间表仍在考虑中。

与此同时,我们将继续在现有的基础上继续发展。 从 CLI 完成和 UI 命令到减少学习曲线和一般维护,我们的雷达进行了广泛的改进。 那么下次见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值