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
可以是:
- 相对路径(来自调用该函数的测试文件)
- 一个绝对路径(配置文件的绝对路径)
- 模块说明符(即
my-module/path/to/config.json
)
首先,当您的 setConfig()
函数运行时,您根本不知道它是从哪里调用的。您不知道也不能知道调用您的文件的目录。
因此,调用者有责任为您提供可以直接使用的路径。它需要是完全限定路径或相对于当前工作目录的相对路径。它不能是相对于调用者模块所在目录的路径(除非恰好与当前工作目录相同),因为您不知道调用者模块目录是什么。
因此,在您想要的规范中,您希望 configPath
是以下任何一个:
- 相对路径(来自调用该函数的测试文件)
- 绝对路径(配置文件的绝对路径)
- 模块说明符(即my-module/path/to/config.json)
只有绝对路径选项可以工作或可以工作。
相对路径将不起作用,因为您的函数不知道从中调用您的测试文件的目录。
模块说明符将不起作用,因为您不知道如何获取该模块名称的目录,而且它是模棱两可的,因为有可能从多个位置加载相同名称的模块(这发生在依赖项使用通用模块但使用不同版本的真实世界)。
请注意,调用者可以使用 path.join()
将他们自己的模块目录与文件名结合起来,并向您传递该完全限定路径。在 CommonJS 模块中,调用者从 __dirname
获取他们自己的目录。在 ESM 模块中,调用者必须从 import.meta.url
.
中提取目录
我正在研究将作为 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
可以是:
- 相对路径(来自调用该函数的测试文件)
- 一个绝对路径(配置文件的绝对路径)
- 模块说明符(即
my-module/path/to/config.json
)
首先,当您的 setConfig()
函数运行时,您根本不知道它是从哪里调用的。您不知道也不能知道调用您的文件的目录。
因此,调用者有责任为您提供可以直接使用的路径。它需要是完全限定路径或相对于当前工作目录的相对路径。它不能是相对于调用者模块所在目录的路径(除非恰好与当前工作目录相同),因为您不知道调用者模块目录是什么。
因此,在您想要的规范中,您希望 configPath
是以下任何一个:
- 相对路径(来自调用该函数的测试文件)
- 绝对路径(配置文件的绝对路径)
- 模块说明符(即my-module/path/to/config.json)
只有绝对路径选项可以工作或可以工作。
相对路径将不起作用,因为您的函数不知道从中调用您的测试文件的目录。
模块说明符将不起作用,因为您不知道如何获取该模块名称的目录,而且它是模棱两可的,因为有可能从多个位置加载相同名称的模块(这发生在依赖项使用通用模块但使用不同版本的真实世界)。
请注意,调用者可以使用 path.join()
将他们自己的模块目录与文件名结合起来,并向您传递该完全限定路径。在 CommonJS 模块中,调用者从 __dirname
获取他们自己的目录。在 ESM 模块中,调用者必须从 import.meta.url
.