跳至主要内容

词典

构建脚本

指在安装包后立即执行的任务;通常是清单中 scripts 字段中配置的 postinstall 脚本。

构建脚本应留给本机依赖项,纯 JavaScript 包几乎没有理由使用它们。它们对用户的项目有 重大副作用,因此请仔细权衡是否真的需要它们。

另请参阅:生命周期脚本

依赖项

依赖项(列在清单的 dependencies 字段中)描述了两个包之间的关系。

当包 A 具有依赖项 B 时,如果安装成功,Yarn 保证 A 能够访问 B。请注意,这是我们对常规依赖项做出的唯一承诺:特别是,无法保证包 B 将与应用程序其他部分中使用的版本相同。

另请参阅:开发依赖项对等依赖项

描述符

描述符是包名称(例如 lodash)和包 范围(例如 ^1.0.0)的组合。描述符用于标识一组包,而不是一个唯一包。

开发依赖项

依赖项(列在清单的 devDependencies 字段中)描述了两个包之间的关系。

开发依赖项与常规依赖项非常相似,只是它们仅对本地包很重要。从远程注册表(如 npm)获取的包将无法访问其开发依赖项,但从本地源(如 工作区portal: 协议)安装的包可以访问。

另请参阅:依赖项对等依赖项

获取器

获取器是负责从 引用 中提取完整包数据的组件。例如,npm 获取器会从 npm 注册表下载包 tarball。

另请参阅:架构获取器接口

提升

提升是通过尽可能多地删除节点来优化依赖项树的行为。没有一种单一的方法来决定如何转换树,不同的包管理器会做出不同的权衡(有些针对包的流行度、包的大小、最高版本进行优化)。因此,无法对最终提升布局做出任何保证 - 除非包始终能够访问其在 清单 中列出的依赖项。

由于提升与文件系统和 Node 解析紧密相关,其设计本身很容易出错,并意外访问未正确定义为依赖项的包——因此在提升过程中未考虑这些包,导致其存在性不可预测。出于此原因和其他原因,从 Yarn 2 开始,提升被搁置一旁,转而采用 即插即用解析

链接器

链接器是消耗依赖项树和包数据存储,并针对目标环境生成特定磁盘工件的组件。例如,即插即用 链接器生成单个 .pnp.cjs 文件。

另请参阅:架构安装程序界面链接器界面

本地缓存

本地缓存或离线镜像是一种保护项目免受包注册表关闭影响的方法。

启用本地缓存后,Yarn 会在 .yarn/cache 文件夹中生成你安装的所有包的副本,然后你可以将该副本添加到存储库中。后续安装将重用此文件夹中的包,而不是重新下载它们。

虽然不总是实用(它会导致存储库大小增长,尽管我们有办法大幅减轻这种情况),但它呈现出各种有趣的属性

  • 它不需要额外的基础设施,例如 Verdaccio 代理
  • 它不需要额外的配置,例如注册表身份验证
  • 安装获取步骤尽可能快,完全没有数据传输
  • 如果你还使用 PnP 链接器,它可以让你达到 零安装

要启用本地缓存,请将 enableGlobalCache 设置为 false,运行安装,并将新工件添加到存储库(你可能需要相应地 更新你的 gitignore)。

定位器

定位器是包名称(例如 lodash)和包 引用(例如 1.2.3)的组合。定位器用于识别一个唯一的包(有趣的是,所有有效的定位器也是有效的 描述符)。

清单

清单是定义与包关联的元数据(其名称、版本、依赖项等)的文件。在 JavaScript 生态系统中,它是 package.json 文件。

单一仓库

单一仓库是一个包含多个包的仓库。 BabelJest,甚至 Yarn 本身 就是此类仓库的示例 - 它们各自包含数十个相互依赖的小包。

Yarn 通过“工作区”为单一仓库提供本机支持。通过运行单个安装,可以轻松安装多个本地包的依赖项,并将它们全部连接在一起,以便在更改可以被项目的其他部分重新使用之前不必发布它们。

另请参阅:工作区(功能)工作区(词典)

包是依赖项树的节点。简单来说,包是一组源代码,通常以其根目录中的 package.json 为特征。包可以定义 依赖项,即其他包,这些包需要可供使用才能正常工作。

对等依赖项

依赖项(列在清单的 peerDependencies 字段中)描述了两个包之间的关系。

与常规依赖项相反,具有对 B 的对等依赖项的包 A 不能保证 A 能够访问 B - 由依赖于 A 的包手动提供与 A 的请求兼容的 B 版本。此缺点也有一个好处:A 将访问的 B 包实例保证与 A 的祖先使用的实例完全相同。当 B 使用 instanceof 检查或单例时,这一点非常重要。

另请参阅:开发依赖项单例包

对等依赖包

对等依赖包是列出对等依赖项的包。

另请参阅:虚拟包

插件

插件是 Yarn 2+ 中引入的新概念。通过使用插件,可以扩展 Yarn 并使其更强大 - 无论是通过添加新的解析器获取器还是链接器

另请参阅:插件插件接口

即插即用

即插即用是一种替代安装策略,它不会生成典型的 node_modules 目录,而是生成一个单个文件,然后将其注入 Node 以便让它知道在哪里可以找到已安装的包。从 v2 开始,即插即用成为 Javascript 项目的默认安装策略。

另请参阅:即插即用

PnP

请参阅即插即用

门户

门户是使用 portal: 协议的依赖项,指向位于磁盘上的包。

link: 协议(可以指向任何位置但不能有依赖项)相反,Yarn 将以这样的方式设置其依赖项映射:不仅依赖包能够访问通过门户引用的文件,而且门户本身也能够访问其自己的依赖项。甚至对等依赖项!

项目

术语项目用于涵盖属于同一依赖项树的所有工作树

另请参阅:工作区

范围

范围是一个字符串,当与包名称结合使用时,可用于选择单个包的多个版本。范围通常遵循 semver,但可以使用任何受支持的 Yarn 协议。

另请参阅:协议

引用

引用是一个字符串,当与包名称结合使用时,可用于选择单个包的单个版本。引用通常遵循 semver,但可以使用任何受支持的 Yarn 协议。

另请参阅:协议

解析器

解析器是负责将 描述符 转换为 定位符,并从包 定位符 中提取包 清单 的组件。例如,npm 解析器将检查 npm 注册表中可用的版本,并返回满足 semver 要求的所有候选版本,然后查询 npm 注册表以获取与所选解析关联的完整元数据。

另请参阅:架构解析器接口

范围

范围是一个术语,继承自 npm 注册表;它们用于描述一组全部属于同一实体的包。例如,与 v2 相关的 Yarn 包全部属于 npm 注册表上的 berry 范围。范围传统上以 @ 符号为前缀。

单例包

单例包是整个依赖项树中仅实例化一次的包。

虽然单例包不是一等公民,但可以通过使用 对等依赖项 轻松创建它们,方法是使用它们的其中一个属性:由于对等依赖项所依赖的包保证与直接祖先所使用的包完全相同,因此在整个依赖项分支中使用对等依赖项,一直到最近的工作区,将确保仅创建包的一个实例 - 使其成为事实上的单例包。

另请参阅:对等依赖项

传递依赖项

传递依赖项是你所依赖的包的依赖项。

想象一下 react 的情况。你的应用程序依赖于它(你在清单中自己列出了它),所以它是一个直接依赖项。但 react 也依赖于 prop-types!这使得 prop-types 成为一个传递依赖项,因为你没有直接声明它。

未插入的包

使用 Yarn PnP,大多数包都保留在它们的 zip 存档中,而不是解压到磁盘上。然后在运行时将存档挂载到文件系统上,并透明地访问它们。挂载是只读的,这样如果有什么东西试图写入存档,存档就不会被损坏。

然而,在某些情况下,保持包只读可能很困难(例如,当一个包列出 postinstall 脚本时 - 构建步骤通常需要生成构建工件,这使得只读文件夹不切实际)。对于这些情况,Yarn 可以解压特定包并将其保留在它们自己的单独文件夹中。这样的包被称为“未插入”。

包在以下几种情况下未插入

  • 通过将 dependenciesMeta[].unplugged 字段显式设置为 true
  • 当包将它的 preferUnplugged 字段显式设置为 true
  • 当包列出 postinstall 脚本时隐式
  • 当包包含本机文件时隐式

虚拟包

因为 对等依赖包 有效地定义了一组可能的依赖项集,而不是一组静态的依赖项集,所以一个对等依赖包可能有多个依赖项集。当这种情况发生时,需要为每个这样的集合实例化该包至少一次。

由于在 Node 领域,JS 模块是基于它们的路径实例化的(对于任何给定的路径,文件永远不会被实例化两次),并且由于 PnP 使得包在任何给定的项目中只安装一次,所以实例化这些包多次的唯一方法是给它们多个路径,同时仍然引用相同的磁盘位置。这就是虚拟包派上用场的地方。

虚拟包是对等依赖包的专门实例,它对该特定实例应该使用的依赖项集进行编码。每个虚拟包都被赋予一个唯一的文件系统路径,以确保它引用的脚本将使用它们适当的依赖项集进行实例化。

过去,虚拟包是使用符号链接实现的,但最近已更改,现在它们通过虚拟文件系统层实现。这避免了创建数百个令人困惑的符号链接的需要,提高了与 Windows 的兼容性,并防止了第三方工具调用 realpath 时出现的问题。

工作区

一般来说,工作区是 Yarn 功能,用于处理存储在同一存储库中的多个项目。

在 Yarn 词汇的上下文中,工作区是直接属于 项目 的本地

另请参阅:工作区

工作树

工作树是一个私有工作区,它将新的子工作区添加到当前 项目

另请参阅:工作区

Yarn

Yarn 是一个用于管理编程环境的命令行工具。它使用 Javascript 编写,主要用于其他 Javascript 项目,但其功能使其适用于各种情况。

零安装

另请参阅:零安装