词典
构建脚本
指在安装包后立即执行的任务;通常是清单中 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
文件。
单一仓库
单一仓库是一个包含多个包的仓库。 Babel、Jest,甚至 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 项目,但其功能使其适用于各种情况。
零安装
另请参阅:零安装