导入默认导出和命名导出是否会将模块加载两次?

时间:2017-03-16 02:11:36

标签: javascript reactjs import ecmascript-6

以下列形式编写import语句时会发生什么:

import React, { Component } from 'react';

导入模块的解构是在解构对象以实现Component而不是需要React.Component时发生的吗?或者它是使用具有完全不同语法的命名导出导入的,尽管它确实类似于解构?

一个重要的推论问题:与import React, { Component } ...相比,Component模块React会不必从import React ...模块加载Component两次(假设为1. private string path;// = Application.dataPath + "/Resources/"; 2. private string filename = "Magnelli_0.27.txt"; 3. private TextAsset asset; 4. private string str; 5. private string[] names; 6. private Vector3 ViewPosition; 7. private double ViewZPosition; 8. 9. private int length; 10. private double[] arrZ; 11. private double[] arrCV; 12. 13. // Use this for initialization 14. void Start () { 15. Screen.sleepTimeout = SleepTimeout.NeverSleep; 16. //AssetDatabase.ImportAsset(path); 17. //LoadTextFile(); 18. 19. path = Application.dataPath + "/Resources/"; 20. asset = Resources.Load ("Magnelli_0.27")as TextAsset; 21. str = asset.ToString(); 22. names = str.Split('\n'); 23. length = names.Length; 24. 25. Debug.Log ("length: " + length); 26. //Debug.Log ("str: " + str); 27. Debug.Log ("names[0]: " + names[0] + "names[1]: " + names[1]); 28. //Debug.Log (asset.text); 29. } 30. 31. // Update is called once per frame 32. void Update () { 33. 34. ViewPosition = GameObject.FindWithTag("MainCamera").transform.position; 35. ViewZPosition = ViewPosition.z; 36. 37. StreamReader reader = new StreamReader (path + filename); 38. 39. TextReader txtreader = new StringReader (asset.text); 40. 41. StringReader streader = new StringReader (asset.text); 42. 43. string txt = ""; 44. 45. arrZ = new double[length]; 46. arrCV = new double[length]; 47. 48. for (int i = 0; i < length; ++i) { 49. 50. txt = streader.ReadLine(); 51. //Debug.Log ("txt: " + txt); 52. string[] sprite = txt.Split (' '); 53. 54. foreach (string b in sprite) { 55. //Debug.Log ("b: " + b); 56. } 57. 58. 59. 60. arrZ[i] = Convert.ToDouble(sprite[0]); 61. arrCV[i] = Convert.ToDouble(sprite[1]); 62. } 63. 64. // clear memories 65. reader.Dispose(); 66. 67. for (int i = 0; i < length; i++) { 68. 69. if ((arrZ[i])*100-0.2 < ViewZPosition & (arrZ[i])*100+0.2 > ViewZPosition) 70. { 71. 72. GetComponent<Text>().text = "redshift z : " + ViewZPosition*0.01 + "\nComoving Volume : " + arrCV[i] + " Gpc³"; 73. } 74. } 75. 76. reader.Close (); 77. txtreader.Close (); 78. 79. } 是更大的React库的组成部分)?

2 个答案:

答案 0 :(得分: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. names成为 ImportedDefaultBinding 的BoundNames。

  2.   
  3. 附加names NamedImports的BoundNames的元素。

  4.   
  5. 返回names

  6.   

正如您所看到的,您使用import React, { Component }导入的名称被绑定两次,这意味着您将React作为默认导出,因此React.Component,然后绑定名称{{1还会附加到导入的名称。你基本上在两个不同的绑定或名称下得到它两次。

应该注意,只有绑定名称不同。 ComponentReact.Component引用相同的对象,只是使用不同的绑定,因为您使用命名导出导入。导入Component后,React已导入。所有React.Component都会创建一个与已导入对象的新绑定。

答案 1 :(得分:2)

  1. import语法中没有发生解构。即使它看起来有点类似 - 它是一个单独的语法。

  2. 导入的标识符绑定到模块初始化期间创建的对象。所以实际上你得到2个绑定到同一个对象,这需要你额外的1个参考,仅此而已。

  3. 无论您在源代码树中导入模块多少次,它都只会初始化一次,所有值只创建一次。并且所有import语句基本上都是&#34; bind&#34;到内存中的值而不创建重复项。