导入/导出名称冲突解决方案

Fab*_*oli 3 javascript node.js ecmascript-next es6-modules

在 Node JS 中测试以下模块布局,看起来本地导出的定义总是替换外部导出的,以防名称冲突(请参阅 B.js 中的 f1)。

A.js

export const f1 = 'A'
Run Code Online (Sandbox Code Playgroud)

B.js

export * from './A.js'
export const f1 = 'B'
Run Code Online (Sandbox Code Playgroud)

C.js

import * as A from './A.js'
import * as B from './B.js'
console.log(A.f1)
console.log(B.f1)
Run Code Online (Sandbox Code Playgroud)
> node C.js
// A
// B
Run Code Online (Sandbox Code Playgroud)

这是规则吗?我还没有在 Ecmascript 规范中找到有关如何管理此问题的内容。

进出口订单重要吗?

您认为这是扩展模块重载功能和/或添加新功能的可靠方法吗?

Nul*_*Dev 5

这是规则吗?我还没有在 Ecmascript 规范中找到有关如何管理此问题的内容。

是的,本地出口优先。事实上,这是在规范中标准化的

  1. 对于模块.[[LocalExportEntries]]中的每个 ExportEntry 记录e ,执行 a。断言模块为此导出提供直接绑定。 b. 将e .[[ExportName]] 附加到导出名称


  2. 对于模块.[[IndirectExportEntries]]中的每个 ExportEntry 记录e ,执行 a。断言模块为此导出导入特定绑定。 b. 将e .[[ExportName]] 附加到导出名称


具体来说,starExport您的情况是以下内容的一部分:

For each ExportEntry Record e in module.[[StarExportEntries]], do
    (...)
    c. Let starNames be requestedModule.GetExportedNames(exportStarSet).
    d. For each element n of starNames, do
        i. If SameValue(n, "default") is false, then
            1. If n is not an element of exportedNames, then
                a. Append n to exportedNames.
Run Code Online (Sandbox Code Playgroud)

那么,回答你的第二个问题:

您认为这是扩展模块重载功能和/或添加新功能的可靠方法吗?

是的,它是可靠的,因为它是在标准中指定的。

  • `[[IndirectExportEntries]]` 是“export * as Id from 'module'”形式的导出条目。op 使用的导出子句不同,最终成为“[[StarExportEntries]]”的一部分。但在这种情况下你是对的,它确实优先考虑本地出口。 (2认同)