我正在尝试实现
require()
模块ID解析器,如https://nodejs.org/api/modules.html#all-together中所述,目前被LOAD_PACKAGE_EXPORTS的非正式措辞所困扰:
Try to interpret X as a combination of NAME and SUBPATH where the name may have a @scope/ prefix and the subpath begins with a slash ('/').
如果 X 包含多个斜杠,哪一个开始 SUBPATH? @scope/ 前缀结尾的斜杠也可以作为分隔符吗?前缀是否被视为名称的一部分?
稍微不那么重要:LOAD_PACKAGE_SELF 说
let MATCH = PACKAGE_EXPORTS_RESOLVE(pathToFileURL(SCOPE), "." + X.slice("name".length), package.json "exports", ["node", "require"]) defined in the ESM resolver.
我假设
"name"
指的是 package.json
中的“名称”字段。当上一步断言 X 以名称字符串开头时,为什么要对 X 进行切片?
https://nodejs.org/api/esm.html#resolution-algorithm-specification中的PACKAGE_RESOLVE处理类似的模式,我假设这里也意味着:如果X不以
@
开头,则第一个斜杠开始子路径,否则第二个斜杠开始子路径。前缀是名称的一部分。
这并不完全相同,因为 PACKAGE_RESOLVE 中的子路径可能为空,而 LOAD_PACKAGE_EXPORTS 意味着子路径必须至少包含一个斜杠,但我愿意处理这个问题。
我没有解开第二个谜团;这可能只是由于另一个疏忽。