Node.js CommonJS规范中LOAD_PACKAGE_EXPORTS的工作机制疑问
Node.js require()模块ID解析器:LOAD_PACKAGE_EXPORTS与LOAD_PACKAGE_SELF疑问解答
LOAD_PACKAGE_EXPORTS的NAME与SUBPATH分割规则
官方描述:
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 ('/').
针对你的问题,明确规则如下:
- SUBPATH的起始位置:当X包含多个斜杠时,SUBPATH从NAME部分结束后的第一个斜杠开始。比如
@foo/bar/baz/qux里,NAME是@foo/bar,SUBPATH就是/baz/qux;无scope的foo/bar/baz中,NAME是foo,SUBPATH是/bar/baz。 - @scope/前缀末尾的斜杠不能作为分隔符:@scope/是NAME的一部分,比如
@babel/core里的@babel/属于NAME的组成部分,它末尾的斜杠只是scope与包名的内部分隔,不是NAME和SUBPATH的分界。 - @scope/前缀属于NAME的一部分:带scope的包的NAME完整格式就是
@scope/package-name,Node.js解析时会把整个字符串当作包名处理,@scope/是包名的必要组成部分。
LOAD_PACKAGE_SELF中slice操作的作用
官方定义:
let MATCH = PACKAGE_EXPORTS_RESOLVE(pathToFileURL(SCOPE), "." + X.slice("name".length), package.json "exports", ["node", "require"]) defined in the ESM resolver.
你猜的没错,这里的"name"就是package.json里的name字段。虽然X确实以name开头,但X的格式是name/subpath(比如lodash/map),X.slice("name".length)会把开头的name截掉,得到/map,再加.变成./map——这是PACKAGE_EXPORTS_RESOLVE要求的相对路径格式,因为这个ESM解析函数需要传入相对于当前包的路径(必须以.开头),所以必须通过slice去掉包名,再拼接.转换成符合要求的格式。
内容的提问来源于stack exchange,提问作者Tau
相关产品推荐
相关产品推荐

