簡體   English   中英

導入/導出名稱沖突解決

[英]Import/Export name collision resolution

在 Node JS 中測試以下模塊布局,看起來本地導出的定義總是在名稱沖突的情況下替換外部導出的定義(參見 B.js 中的 f1)。

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 規范中找到有關如何管理此問題的信息。

進口/出口訂單重要嗎?

您認為這是擴展模塊重載功能和/或添加新功能的可靠方法嗎?

這是規則嗎? 我還沒有在 Ecmascript 規范中找到有關如何管理此問題的信息。

是的,本地出口優先。 事實上,這在規范中是標准化的:

  1. 對於模塊.[[LocalExportEntries]] 中的每個 ExportEntry Record e ,執行
    一個。 斷言模塊為此導出提供直接綁定。
    灣。 Append e .[[ExportName]] 到exportsNames
  2. 對於模塊.[[IndirectExportEntries]] 中的每個 ExportEntry Record e ,執行
    一個。 斷言模塊為此導出導入特定綁定。
    灣。 Append e .[[ExportName]] 到exportsNames

具體來說,您的案例中的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.

所以,回答你的第二個問題:

您認為這是擴展模塊重載功能和/或添加新功能的可靠方法嗎?

是的,它是可靠的,因為它是在標准中指定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM