Parece obvio, pero me encontré un poco confundido acerca de cuándo usar llaves para importar un solo módulo en ES6. Por ejemplo, en el proyecto React-Native en el que estoy trabajando, tengo el siguiente archivo y su contenido:
initialState.jsvar initialState = {
todo: {
todos: [
{id: 1, task: 'Finish Coding', completed: false},
{id: 2, task: 'Do Laundry', completed: false},
{id: 2, task: 'Shopping Groceries', completed: false},
]
}
};
export default initialState;
En TodoReducer.js, tengo que importarlo sin llaves:
import initialState from './todoInitialState';
Si adjunto las initialState
llaves, aparece el siguiente error para la siguiente línea de código:
TodoReducer.js:No se puede leer la propiedad todo de indefinido
export default function todos(state = initialState.todo, action) {
// ...
}
Errores similares también le ocurren a mis componentes con llaves. Me preguntaba cuándo debería usar llaves para una sola importación, porque obviamente, al importar múltiples componentes / módulos, debe encerrarlos en llaves, lo que sé.
Editar:
La publicación SO aquí no responde a mi pregunta, en cambio estoy preguntando cuándo debería o no usar llaves para importar un solo módulo, o nunca debería usar llaves para importar un solo módulo en ES6 (aparentemente este no es el caso, como he visto importación única con llaves necesarias)
fuente
Respuestas:
Esta es una importación predeterminada :
Solo funciona si
A
tiene la exportación predeterminada :En este caso, no importa qué nombre le asignes al importar:
Porque siempre se resolverá a lo que sea la exportación predeterminada de
A
.Esta es una importación con nombre llamada
A
:Solo funciona si
A
contiene una exportación con nombre llamadaA
:En este caso, el nombre importa porque está importando algo específico por su nombre de exportación :
Para que esto funcione, debe agregar una exportación con nombre correspondiente a
A
:Un módulo solo puede tener una exportación predeterminada , pero tantas exportaciones con nombre como desee (cero, uno, dos o muchos). Puedes importarlos todos juntos:
Aquí, importamos la exportación predeterminada como
A
, y las exportaciones con nombre llamadasmyA
ySomething
, respectivamente.También podemos asignarles nombres diferentes al importar:
Las exportaciones predeterminadas tienden a usarse para lo que normalmente espera obtener del módulo. Las exportaciones nombradas tienden a usarse para utilidades que pueden ser útiles, pero que no siempre son necesarias. Sin embargo, depende de usted elegir cómo exportar las cosas: por ejemplo, un módulo podría no tener una exportación predeterminada.
Esta es una excelente guía para los módulos ES, que explica la diferencia entre exportaciones predeterminadas y con nombre.
fuente
export const myA = 43; export const Something = 44;
, así como aexport default { myA, Something }
? Entonces, cuando importa puede hacerloimport A from './A';
para todo en el módulo, oimport { Something } from './A';
solo obtiene un poco del móduloimport * as AllTheThings
.import 'firebase/storage';
oimport 'rxjs/add/operator/map';
? ¿Qué está haciendo eso realmente?Diría que también hay una notación destacada para la
import
palabra clave ES6 que vale la pena mencionar.Si intenta consolar el registro de Mix:
Conseguirás:
Los corchetes son dorados cuando solo necesita componentes específicos del módulo, lo que crea huellas más pequeñas para los paquetes como webpack.
fuente
import * as Mix from "./A";
yimport A as Mix from "./A";
lo mismo?La respuesta anterior de Dan Abramov explica las exportaciones predeterminadas y las exportaciones con nombre .
¿Cuál usar?
Citando a David Herman : ECMAScript 6 favorece el estilo de exportación único / predeterminado y brinda la sintaxis más dulce para importar el valor predeterminado. Importar exportaciones con nombre puede e incluso debería ser un poco menos conciso.
Sin embargo, en TypeScript, la exportación con nombre se ve favorecida por la refactorización. Ejemplo, si exporta por defecto una clase y le cambia el nombre, el nombre de la clase cambiará solo en ese archivo y no en las otras referencias, con el nombre de clase de exportaciones con nombre se cambiará el nombre en todas las referencias. Las exportaciones con nombre también se prefieren para los servicios públicos.
En general, use lo que prefiera.
Adicional
La exportación predeterminada es en realidad una exportación con nombre con nombre predeterminado, por lo que la exportación predeterminada se puede importar como:
fuente
Additional
línea es buena información.import A from './A'
no tiene sentido si está exportando sin definir un nombre comoexport default 42
.Si piensa que
import
es solo el azúcar de sintaxis para módulos de nodo, objetos y desestructuración, creo que es bastante intuitivo.fuente
Para comprender el uso de llaves en las
import
declaraciones, primero debe comprender el concepto de destrucción introducido en ES6Desestructuración de objetos
Desestructuración de matrices
Usando la coincidencia de listas
Usando el operador de propagación
Ahora que lo hemos eliminado, en ES6 puede exportar múltiples módulos. Luego puede hacer uso de la desestructuración de objetos como a continuación
Supongamos que tiene un módulo llamado
module.js
Desea importar las funciones exportadas a
index.js
;También puede usar diferentes nombres de variables como así
fuente
import {printFirstname as pFname, printLastname as pLname} from './module.js'
es equivalente a:var foo = {printFirstname: 'p_f_n', printLastname: 'p_l_n'}; var { printFirstname:pFname, printLastname: pLname } = foo; pFname('Taylor'); pLname('Swift');
Resumen
ES6
Módulos de :exportaciones:
Tienes 2 tipos de exportaciones:
Sintaxis:
Importaciones:
El tipo de exportación (es decir, exportaciones con nombre o predeterminadas) afecta cómo importar algo:
Sintaxis:
Cosas de interes:
Alias
Siempre que desee cambiar el nombre de una importación con nombre, esto es posible mediante alias . La sintaxis para esto es la siguiente:
Ahora hemos importado
importantData_1
pero el identificador es enmyData
lugar deimportantData_1
.fuente
por lo general, cuando exporta una función, necesita usar {}
tu usas
import {x} from ''
necesita usar
import X from ''
aquí, puede cambiar X a la variable que deseefuente
Las llaves ({}) se usan para importar enlaces con nombre y el concepto detrás de esto es la asignación de desestructuración
Puede encontrar una demostración simple de cómo funciona la declaración de importación con un ejemplo en mi propia respuesta a una pregunta similar en ¿ Cuándo usamos '{}' en las importaciones de JavaScript?
fuente
Las llaves se usan solo para importar cuando se nombra la exportación. Si la exportación es predeterminada, las llaves no se utilizan para importar.
fuente
Para una exportación predeterminada, no usamos {} cuando importamos.
p.ej
player.js
index.js
index.js
player.js
Si queremos importar todo lo que exportamos, usamos *
fuente