node.js: 从测试文件中解析相对路径

node.js: resolve path relative from a test file

我正在研究将作为 npm 包分发的函数实现。

一旦消费者将此包安装为 devDependency,他们应该能够通过从他们的测试文件调用一个函数(让我们称之为 setConfig)来加载配置文件。

我正在尝试了解当消费者调用我的函数时如何解析相对路径(相对于测试文件)(setConfig('./../some/relative/path/to/config'))。

例如,在以下项目结构中:

|- node_modules
   |- my-published-package
      |- dist/file.js (<- this hold setConfig)
|- src
   |- configToLoad.json
   |- __tests__
      |- someTest.spec.js

配置可以指定为../configToLoad.json并且setConfig应该能够解析相对于测试文件路径的路径。换句话说,测试作者会写 `importedClassFromPackage.setConfig('../configToLoad.json').

setConfig 函数具有以下签名:

setConfig(configPath: string): void {}

其中 configPath 可以是:

首先,当您的 setConfig() 函数运行时,您根本不知道它是从哪里调用的。您不知道也不能知道调用您的文件的目录。

因此,调用者有责任为您提供可以直接使用的路径。它需要是完全限定路径或相对于当前工作目录的相对路径。它不能是相对于调用者模块所在目录的路径(除非恰好与当前工作目录相同),因为您不知道调用者模块目录是什么。

因此,在您想要的规范中,您希望 configPath 是以下任何一个:

  • 相对路径(来自调用该函数的测试文件)
  • 绝对路径(配置文件的绝对路径)
  • 模块说明符(即my-module/path/to/config.json)

只有绝对路径选项可以工作或可以工作。

相对路径将不起作用,因为您的函数不知道从中调用您的测试文件的目录。

模块说明符将不起作用,因为您不知道如何获取该模块名称的目录,而且它是模棱两可的,因为有可能从多个位置加载相同名称的模块(这发生在依赖项使用通用模块但使用不同版本的真实世界)。

请注意,调用者可以使用 path.join() 将他们自己的模块目录与文件名结合起来,并向您传递该完全限定路径。在 CommonJS 模块中,调用者从 __dirname 获取他们自己的目录。在 ESM 模块中,调用者必须从 import.meta.url.

中提取目录