Me encontré con una biblioteca de JavaScript que usa la siguiente sintaxis para importar bibliotecas:
import React, { Component, PropTypes } from 'react';
¿Cuál es la diferencia entre el método anterior y el siguiente?
import React, Component, PropTypes from 'react';
Respuestas:
Esto dice:
Esto combina las dos sintaxis comunes que probablemente hayas visto
El primero se utiliza para importar y nombrar la exportación predeterminada, el segundo para importar las exportaciones con nombre especificadas.
Como regla general, la mayoría de los módulos proporcionarán una única exportación predeterminada o una lista de exportaciones con nombre. Es algo menos habitual para un módulo para proporcionar tanto una exportación por defecto y las exportaciones con nombre. Sin embargo, en el caso de que haya una característica que se importe con mayor frecuencia, pero también subcaracterísticas adicionales, es un diseño válido exportar la primera como predeterminada y las restantes como exportaciones con nombre. En tales casos, utilizaría la
import
sintaxis a la que se refiere.Las otras respuestas están en algún lugar entre incorrectas y confusas, posiblemente porque los documentos de MDN en el momento en que se hizo esta pregunta eran incorrectos y confusos. MDN mostró el ejemplo
y dicho
name
es el "nombre del objeto que recibirá los valores importados". Pero eso es engañoso e incorrecto; En primer lugar, solo hay un valor de importación, que será "recibido" (por qué no decir simplemente "asignado a" o "utilizado para referirse a")name
, y el valor de importación en este caso es la exportación predeterminada del módulo. .Otra forma de explicar esto es observar que la importación anterior es exactamente idéntica a
y el ejemplo del OP es precisamente idéntico a
La documentación de MDN pasó a mostrar el ejemplo
y afirmó que significa
Lo que MDN dijo aquí, y lo que afirman otras respuestas basadas en la documentación de MDN incorrecta, es absolutamente incorrecto y puede basarse en una versión anterior de la especificación. Lo que esto realmente hace es
(La exportación del módulo predeterminado es el valor exportado con la
export default
sintaxis, que también podría serexport {foo as default}
).Los escritores de documentación de MDN pueden haberse confundido con el siguiente formulario:
Esto importa todas las exportaciones de
my-module
y las hace accesibles con nombres comoMyModule.name
. La exportación predeterminada también es accesible comoMyModule.default
, ya que la exportación predeterminada no es más que otra exportación nombrada con el nombredefault
. En esta sintaxis, no hay forma de importar solo un subconjunto de las exportaciones con nombre, aunque se podría importar la exportación predeterminada, si existe, junto con todas las exportaciones con nombre, confuente
from '/path/to/my-module.js'
, aunque yo personalmente usofrom '/path/to/my-module'
.Esto tomará los
{ Component, PropTypes }
miembros exportados del'react'
módulo y los asignará aComponent
yPropTypes
, respectivamente.React
será igual a ladefault
exportación del módulo .Como señala torazaburo a continuación , esto es lo mismo que
que es la abreviatura de
Aquí hay otro ejemplo ( enlace a la esencia ):
Probé el segundo ejemplo con babel:
y obtuve un error de sintaxis.
Como referencia, puede leer la nueva
import
documentación de MDN. Sin embargo, aparentemente necesita una revisión técnica. La publicación del blog del Dr. Axel Rauschmayer es una mejor referencia por ahora.fuente
React
nombreComponent
y lasPropTypes
variables del mismo nombre. Desafortunadamente, los documentos de MDN están equivocados, como descubriría si lo intentara. Consulte 2ality.com/2014/09/es6-modules-final.html . Además, la sintaxis de importación no tiene absolutamente nada que ver con la asignación de desestructuración.import
documentación", al revisar el historial de revisión de ese artículo de MDN, las partes que está citando no se han revisado desde que la página se escribió por primera vez hace más de un año, un período durante el cual la sintaxis del módulo fue cambiando rápidamenteexample3.js
¿Por qué se imprimiráundefined
paraconsole.log(d)
? Como lo hizo,export default { a, b, d }
lo exportó en formatomyModule.js
.myModule.js
nota de quea
,b
yc
fueron exportados de forma individual. Esto significa que otro archivo puede importarlos directamente conimport { a } from 'myModule'
. Por otro lado,d
solo está disponible a través de la exportación predeterminada, por lo que otro módulo puede acceder a él de dos maneras:import thisObjectContainsDefault from 'myModule'
y acceder a través dethisObjectContainsDefault.d
ORimport { default as wrapperObject }
ywrapperObject.d
. El beneficio del segundo enfoque es que también puede obtener elementos que se exportaron individualmente, como se puede ver enexample3.js
.