故障排除
虽然我们尽力让即插即用成为一种令人愉快的体验,但有时可能会出错。下页描述了一些常见情况,并提供了一些修复它们的指导。
<name> 正在尝试在未在依赖项中列出的情况下要求 <name>
此错误仅表示指定的软件包在没有在其依赖项中明确声明的情况下要求某些内容。由于此行为不安全,并且依赖于提升采取某种方式,因此即插即用不允许这样做。
话虽如此,但也可能发生伪合法使用的情况。例如,Jest 对类似 require(`jest-environment-${config.environment}`)
的内容执行类似操作 - 在这种情况下,此意图显然是为了使用指定的软件包来设置软件包配置。但此行为不安全,必须通过以下三种方式之一修复
-
要么修改代码,以便用户负责调用
require.resolve(`jest-environment-jsdom`)
(然后 Jest 只需执行require(config.environment)
) -
要么修改代码以使用
paths
选项从require.resolve
执行以下操作:require(require.resolve(`jest-environment-${config.environment}`, {paths:[config.projectPath]}))
(请注意,此选项是建议使用的选项,因为它对用户非侵入性,并且总体来说是个好主意) -
或者,最后,
jest-environment-jsdom
软件包可以指定为顶级软件包(通常是您自己的软件包)的依赖项。在这种情况下,即使未在依赖项中声明此软件包,Yarn 也允许 Jest 访问它(我们这样做是因为这是唯一安全的情况:不可能对顶级依赖项产生歧义)。
第三个选项通常意味着解锁自身的方法,但请将其报告给受影响软件包的仓库,然后将其链接到此文档(请随时联系 @arcanis 也一样,这样我们就可以跟踪这些问题)。
找不到不合格路径 <path> 的合适 Node 分辨率
此错误消息表示 Plug'n'Play 能够找到 require 的程序包部分(例如,它理解 foo
应解析为 /usr/cache/yarn/foo-1.0.0
),但无法解析解析的文件部分(使用相同示例,无法在 /usr/cache/yarn/foo-1.0.0/
中找到 index.js
文件)。这种情况通常不是 Plug’n’Play 本身造成,而是应用程序要求一些不存在的内容(在非 PnP 模式下,通常会出现一个常规的“找不到该模块”错误)。
找不到模块 <require-path>
此错误消息并不是由 Plug’n’Play 生成的。 永远不会生成。如果出现这个消息,很可能表示应用程序未使用 PnP 解析器运行,这意味着 require 调用无法从依赖项中加载文件(因为常规 Node 解析所需的 node_modules
不会被生成)。请确保使用 NODE_OPTIONS="--require /path/to/.pnp.js"
运行代码或使用 yarn node
调用代码,后者会自动执行正确操作(无论是否使用 PnP)。