4

在使用 Yarn Plug'n'Play 升级到 Yarn 3.0 后(抛出 node_modules),我在启动 Node.js 时开始遇到文件名解析问题。

成功启动后server.js,它会尝试解析项目中第一个导入的文件,称为util.js,但路径解析失败,除非我明确添加.js到文件名。我宁愿不必更新项目范围内的所有路径。

我可以让 Yarn 和 Node.js自动解析文件扩展名吗?

纱线3.1.0,节点17.0.1

yarn node server.js # Automatically uses Yarn's .pnp.cjs, right?
// server.js excerpt
import util from "/tools/util"; // <--  No worky
import util from "/tools/util.js"; // <-- ✅ Worky

错误信息:

/Users/me/repo/.pnp.cjs:22839
  return Object.defineProperties(new Error(message), {
                                 ^

Error: Qualified path resolution failed - none of those files can be found on the disk.

Source path: /Users/me/repo/server/util
Not found: /Users/me/repo/server/util

    at internalTools_makeError (/Users/me/repo/.pnp.cjs:22839:34)
    at resolveUnqualified (/Users/me/repo/.pnp.cjs:24238:13)
    at resolveRequest (/Users/me/repo/.pnp.cjs:24271:14)
    at Object.resolveRequest (/Users/me/repo/.pnp.cjs:24343:26)
    at resolve$1 (file:///Users/me/repo/.pnp.loader.mjs:205:25)
    at ESMLoader.resolve (node:internal/modules/esm/loader:422:30)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:222:40)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:76:40)
    at link (node:internal/modules/esm/module_job:75:36)
4

1 回答 1

0

我能够克服这一点,但并非不放弃 PnP。我是这样做的:

首先,添加--experimental-specifier-resolution=node到实际运行代码的节点命令。我正在使用打字稿,所以我的最终命令如下所示:

tsc-watch --onSuccess \"node --experimental-specifier-resolution=node ./lib/index.js\"

我希望这个标志可以与 PnP 一起使用,但它没有。所以我进入.yarnrc.yml并添加了以下行:

nodeLinker: node-modules

重新运行后yarn,我能够yarn dev运行我的应用程序。我真的不确定为什么 PnP 在这里不起作用,但我可以牺牲我的本地配置的这种“纯度”来换取你知道的实际上有效的东西。

运行纱线工作区和打字稿的最后一部分:确保您的package.json文件指向编译后的 javascript,而不是打字稿文件,例如lib/输出目录:

  "type": "module",
  "main": "lib/index.js",
  "types": "lib/index.d.ts",
于 2022-02-05T22:29:34.587 回答