【问题标题】:Import/Export name collision resolution导入/导出名称冲突解决
【发布时间】:2021-06-06 13:03:00
【问题描述】:

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

A.js

export const f1 = 'A'

B.js

export * from './A.js'
export const f1 = 'B'

C.js

import * as A from './A.js'
import * as B from './B.js'
console.log(A.f1)
console.log(B.f1)
> node C.js
// A
// B

这是规定吗?我还没有在 Ecmascript 规范中找到有关如何管理它的信息。

导入/导出顺序重要吗?

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

【问题讨论】:

标签: javascript node.js es6-modules ecmascript-next


【解决方案1】:

这是规定吗?我没有在 Ecmascript 规范中找到有关如何管理此问题的信息。

是的,本地出口优先。其实就是standardized in the spec:

  1. 对于 module.[[LocalExportEntries]] 中的每个 ExportEntry Record e,执行
    一种。 Assert: module 为这个导出提供了直接绑定。
    湾。将 e.[[ExportName]] 附加到 exportedNames
  2. 对于 module.[[IndirectExportEntries]] 中的每个 ExportEntry Record e,执行
    一种。 Assert模块为此导出导入特定绑定。
    湾。将 e.[[ExportName]] 附加到 exportedNames

具体而言,您的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.

所以,回答你的第二个问题:

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

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

【讨论】:

  • [[IndirectExportEntries]]export * as Id from 'module' 形式的导出条目。导出子句 op 使用不同,最终成为 [[StarExportEntries]] 的一部分。但在这种情况下你是对的,它确实优先考虑本地出口。
  • @MinusFour 是的,你是对的。谢谢!更新了答案
猜你喜欢
  • 1970-01-01
  • 2016-02-22
  • 2019-05-18
  • 2018-12-18
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
相关资源
最近更新 更多