javascript - 导入/导出名称冲突解决

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

在 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 规范中找到有关如何管理它的内容。

导入/导出顺序重要吗?

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

最佳答案

Is this a rule? I have not found something about how to manage this in Ecmascript specs.

是的,本地导出优先。事实上,这就是 standardized in the spec :

  1. 对于 module.[[LocalExportEntries]] 中的每个 ExportEntry Record e,执行
    一个。 Assert : 模块 为该导出提供直接绑定(bind)。
    b.将 e.[[ExportName]] 附加到 exportedNames
  2. 对于 module.[[IndirectExportEntries]] 中的每个 ExportEntry Record e,执行
    一个。 Assert : module 为此导出导入一个特定的绑定(bind)。
    b.将 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.

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

Do you see this as a reliable method for extending a module overloading functions and/or adding new ones?

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

关于javascript - 导入/导出名称冲突解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66533367/

相关文章:

javascript - 如何让 nyc 覆盖范围与 es6 导入(.mjs 文件)一起使用

javascript - 下划线_.every方法是否同步?

javascript - 为普通 JS 和 AngularJS 应用程序添加 RWD 是否有区别?

angularjs - 有没有事件表明上传的文件是用CollectionFS写的?

javascript - 使用 Mocha 和 Express Rest API 进行单元测试

javascript - Jest 监视模块功能

javascript - Closure Compiler 编译的 es6 模块库没有导出符号

javascript - CSS、JavaScript风格的动态表格

javascript - Bootstrap Tooltip 动态值 取决于是否需要填写

javascript - 使用 $push 和 db.update 时 Meteor.methods() 出现意外行为