Yarn 3.1 🎃👻Corepack、ESM、pnpm、可选包...
欢迎阅读Yarn 3.1的发行说明!我们对这个版本的发布感到非常兴奋,因为它带来了我们一直期待的各项改进。让我们深入了解一下!
一如既往,请记住,这些只是亮点,完整的更新日志要全面得多。如果你恰好喜欢阅读我们的发布文章,这里有过去的更新日志👇
- Yarn 3.0 🚀🤖 性能、ESBuild、更好的补丁……
- Yarn 2.4 🎄🎁 日志过滤器、审计、更好的警告……
- Yarn 2.3 🍦✨ 信息命令、详细选项、Nohoist、...
- Yarn 2.2 🚅🌟 重复数据删除,更快,更轻......
- Yarn 2.1 🐱🏍 Git 工作区、重点安装、松散模式、...
赞助
Yarn org 需要您的帮助,让我们的工作更具可持续性!更多详情,请访问我们的OpenCollective和GitHub 赞助商页面😊
目录
改进
Node.js Corepack 集成
你知道 Yarn 现在已随 Node 一起提供吗?这是通过 Node.js Corepack 项目实现的,该项目包含 Yarn 和 pnpm 二进制文件作为 shim。通过将packageManager
字段添加到你的package.json
,你可以以完全透明的方式强制使用特定的包管理器及其版本:
{
"packageManager": "yarn@3.1.0"
}
请注意,Corepack 从 Node.js 16.9 开始可用,但目前是可选的。别忘了运行corepack enable
一次,以确保 shims 已全局安装!
我们还在 3.1 中改进了init
命令以正确支持 Corepack:运行yarn init -2
现在将自动设置 Yarn Modern 项目,packageManager
并根据需要设置其字段💫
ESM 支持
node_modules
使用链接器时,ESM 始终受支持,因为它与 Node 一直支持的旧安装策略相同。然而,由于 PnP 接管了解析管道,因此与 ESM 的兼容性并非必然,必须使用Loader Hook API 来实现。
虽然 Loader Hook API 尚未完全稳定,但最近我们进行了大量的工作,我们的团队已经能够为 ESM 模块提供初步的实验性支持。如果我们检测到您的依赖关系树中的某个包包含某个"type": "module"
字段,它应该会自动启用,但您也可以通过设置手动启用或禁用它:
pnpEnableEsmLoader: true
由于实验性,可能会出现一些错误,或者新版本的 Node 会对 API 带来一些重大更改。请务必在我们的错误跟踪器上报告问题!
新安装模式:pnpm
pnpm 包管理器是最早提倡在node_modules
文件夹内安装包时使用符号链接的工具之一。虽然我们采用了 PnP 的另一种方式,但我们认为实现成本足够低,因此值得添加对这种基于符号链接的安装策略的支持。
从 Yarn 3.1 开始,您可以通过向文件添加以下设置来尝试基于符号链接的安装.yarnrc.yml
:
nodeLinker: pnpm
条件包
Esbuild和swc是两个原生软件包,由于其在竞争对手中表现出色,最近备受关注。它们最近改进了软件包的构建方式,以避免使用复杂的安装后脚本,但这种方式对于 Yarn 项目来说效率不如以前。
optionalDependencies
Yarn 3.1 引入了一项新的优化,当某个包被列为列表os
和/或字段时,该优化就会生效cpu
。当这种情况发生时,Yarn 将跳过获取和安装这些包的操作,除非它们与当前系统参数匹配。
如果您需要手动配置一组严格的软件包体系结构来支持(例如在零安装情况下,您想要从一组不可变的软件包中读取),则可以使用以下supportedArchitectures
设置:
supportedArchitectures:
os: [linux, darwin]
cpu: [x64, arm64]
智能变更集过滤器
yarn workspaces foreach
和命令yarn workspaces list
现在附带了全新的标志。设置后,这些命令将仅针对与主分支(或,取决于您仓库中的分支)--since
相比有所更改的包执行。main
master
如果您希望仅在某些特定工作区中运行构建,或者仅获取为脚本目的而更改的工作区列表,这会很方便:
yarn workspaces foreach --since run eslint .
yarn workspaces list --since
该--since
标志还接受一个可选参数(--since=${commit-ish}
)来手动定义应从中得出更改的源。
新的工作区语法:workspace:^
工作区支持一种特殊的语法workspace:*
,即通过 将这些范围在发布时替换为与目标工作区实际版本对应的精确范围。但是,如果您想使用插入符号而不是精确范围,则必须使用详细workspace:^x.y.z
格式,Yarn 会在每次发布后在整个仓库范围内更新该格式。
Yarn 现在也支持workspace:^
,workspace:~
通过防止在 Yarn 更新详细范围后发生的大量合并冲突,可以更轻松地在大多数包计划发布的 monorepo 中交叉引用工作区。
此外,作为一种特殊情况,现在也允许在字段中使用以下语法peerDependencies
:
{
"peerDependencies": {
"@my/other-package": "workspace:^"
}
}