Import/Export 名称冲突解决
Import/Export name collision resolution
在 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 规范中找到有关如何管理它的内容。
import/export 顺序重要吗?
您认为这是扩展模块重载函数的可靠方法and/or 添加新函数吗?
Is this a rule? I have not found something about how to manage this in Ecmascript specs.
是的,本地出口优先。实际上,standardized in the spec:
- 对于 module 中的每个 ExportEntry 记录 e。[[LocalExportEntries]],执行
一种。 Assert: module 为这个导出提供直接绑定。
b.将 e.[[ExportName]] 附加到 exportedNames。
- 对于 module 中的每个 ExportEntry 记录 e。[[IndirectExportEntries]],执行
一种。 Assert: module 为此导出导入一个特定的绑定。
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?
是的,它是可靠的,因为它在标准中有规定。
在 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 规范中找到有关如何管理它的内容。
import/export 顺序重要吗?
您认为这是扩展模块重载函数的可靠方法and/or 添加新函数吗?
Is this a rule? I have not found something about how to manage this in Ecmascript specs.
是的,本地出口优先。实际上,standardized in the spec:
- 对于 module 中的每个 ExportEntry 记录 e。[[LocalExportEntries]],执行
一种。 Assert: module 为这个导出提供直接绑定。
b.将 e.[[ExportName]] 附加到 exportedNames。 - 对于 module 中的每个 ExportEntry 记录 e。[[IndirectExportEntries]],执行
一种。 Assert: module 为此导出导入一个特定的绑定。
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?
是的,它是可靠的,因为它在标准中有规定。