.js 后缀规则?

问题描述 投票:0回答:1

在 package.json 导出字段的子路径子句中,右侧文件路径说明符是否需要 .js 后缀?

我之前被告知规范是这么说的,但是当我读到该规范时,

https://nodejs.org/api/packages.html#subpath-exports

我实际上没有看到任何地方明确说明这一点?只有所有列出的示例 do 都包含 .js 后缀。

规范详细介绍了子路径的扩展,但那些只涉及左侧? (即要匹配的模式,而不是它解析的模式)。

右侧的实际定义是什么?我发现的唯一具体声明声称它必须是“以 ./ 开头的相对文件 URL”。 此外,我可以从规范中看到它允许通配符。 我假设它的类型是“包入口点”,但我还没有找到 that 的详细定义。

我的兴趣源于两个问题:

javascript import 语句的规则详细说明了 import-moduleName-specifier 中的合法内容 - 特别是其处理对特定于主机/实现/捆绑程序开放。 但对我来说,这并不是很明显,这会延续到 package.json 导出的规则 - 特别是,它只会涉及导出子句的左侧

那么,我在哪里可以找到有关右侧文件路径说明符合法性的明确参考?

https://nodejs.org/api/packages.html#extensions-in-subpaths

示例: - 这两者都是合法的,还是只有后者?

{
  "exports": {
    "./examples/jsm/*": "./examples/jsm/*",
    "./addons/*": "./examples/jsm/*",
    "./src/*": "./src/*",
  }
}

{
  "exports": {
    "./examples/jsm/*": "./examples/jsm/*.js",
    "./addons/*": "./examples/jsm/*.js",
    "./src/*": "./src/*.js",
  }
}

更新:我终于弄清楚了,package.json 中的导出和 js 中的导入如何在“主机相关说明符”上相互影响: 我之前说过,js 导入“主机规则”不会影响 package.json 导出规则.. 但它们会影响..

原因是我们正在制作一条“A->B->C”链。

C 是“package.json”-exports 中的右侧文件路径。

B 是“package.json”-exports 中的左侧子路径。

但是,B 也是 javascript 导入中的右侧模块名称说明符!主机规则适用的地方!

因此,即使我们不讨论有关 package.json 左侧的后缀规则,当这些 package.json 子路径作为说明符映射到 javascript import 语句时,主机特定的后缀规则将适用!

因此,无论您在 package.json 子路径中包含还是排除 .js 后缀,都将影响 javascript 导入中导入说明符的特定于主机的行为。

module package.json module.exports
1个回答
0
投票

据我了解,答案是它是合法的。 你只需要承受后果: 子路径和文件路径之间的映射是简单的字符串替换, 因此,只有在该简单字符串替换对应的路径中存在文件时,您才会实现匹配。 也就是说,对于

"./src/*":    "./source/*",
"./src/*":    "./source/*.js",
"./src/*.js": "./source/*.js",

第一条规则会将any原始文件名映射到其自身。

第二个会将 myname 映射到 myname.js (并将 myname.js 映射到 myname.js.js!)

第三个将映射限制为例如myname.js -> myname.js, 并忽略任何非 js 模块名称说明符(子路径)。

一般规则是不存在“扩展魔法”。

结论基于

https://nodejs.org/api/packages.html#subpath-patterns

© www.soinside.com 2019 - 2024. All rights reserved.