2017-03-16 69 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 }确实是为已经导入的对象创建一个新的绑定。

相关问题