2017-03-16 66 views
3

什麼,當你在下面的表格寫一個import語句情況:導入默認導出與命名導出一起加載模塊兩次?

import React, { Component } from 'react'; 

是解構發生在解構的目的是實現Component,而不是需要React.Component進口模塊的?或者它是否使用完全不同的語法進行命名導出,儘管它看起來很像解構?

一個重要推論問題:作爲兩次相比簡單地import React ...import React, { Component } ...不必要加載從React模塊Component對象(假定Component是較大的組成陣營庫)?

+0

記錄'React.Component === Component'事實證明他們是完全相同的對象。 '真',我不知道爲什麼,但似乎你的問題的答案是'不'。 – aeid

+0

我做了一個很大的編輯,只是想讓問題更清楚。如果有任何問題,可以根據需要回滾並編輯。 – Li357

+0

無論多久,你指的是模塊(有多個綁定,即使有多個語句,甚至是解析爲同一目標不同符),將有隻有一個依賴和一個實例。 – Bergi

回答

2
  1. import語法中沒有解構發生。儘管看起來有點相似 - 它是一種分離的語法。

  2. 導入的標識符綁定到在模塊初始化期間創建的對象。因此,實際上你可以得到2個綁定到同一個對象上的綁定,這會花費你1個額外的引用,僅此而已。

  3. 無論您在源代碼樹中導入了多少次模塊,它只會初始化一次,所有值只創建一次。而且所有的import語句本質上都會「綁定」到內存中的值,而不會創建重複項。

+0

@dandavis哦,這很複雜:-S感謝,現在它更有意義? – zerkms

+0

@Bergi這就是我究竟無法表達,感謝。 – zerkms

3

要回答你的第一個問題:

不,它不反對解構。語法可能已經建立了這種關聯的方式,但沒有確認它們是有意與之相關的。每the ECMAScript 2015 Language Specification

第15.2.2節進口

語法

[...]

ImportClause : 
    [...] 
    ImportedDefaultBinding , NamedImports 

[...]

NamedImports : 
    { } 
    { ImportsList } 
    { ImportsList , } 

它是完全獨立的語法。

要回答你的第二個問題:

是的,它進口了兩次,一次React訪問作爲React.Component由默認的出口,而一旦作爲Component爲命名的出口。每the specification

12.2.2靜態語義:BoundNames

[...]

ImportClause : ImportedDefaultBinding , NamedImports

  1. namesImportedDefaultBinding的BoundNames。

  2. 附加到namesNamedImports的BoundNames的元素。

  3. 返回names

正如你所看到的,導入與import React, { Component }名字綁定的兩倍,這意味着你得到React作爲默認的出口,從而React.Component,然後綁定名稱Component也被附加到導入的名稱。你基本上在兩種不同的綁定或名稱下得到它兩次。

應當注意的是,只有勢必名是不同的。 React.ComponentComponent指同一個對象,只是用不同的綁定,因爲你使用的進口出口得名。一旦導入ReactReact.Component已經導入。所有{ Component }確實是爲已經導入的對象創建一個新的綁定。

相關問題