Parece óbvio, mas fiquei um pouco confuso sobre quando usar chaves para importar um único módulo no ES6. Por exemplo, no projeto React-Native em que estou trabalhando, tenho o seguinte arquivo e seu conteúdo:
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;
No TodoReducer.js, tenho que importá-lo sem chaves:
import initialState from './todoInitialState';
Se eu colocar o initialState
colchete, recebo o seguinte erro para a seguinte linha de código:
TodoReducer.js:Não é possível ler toda a propriedade de undefined
export default function todos(state = initialState.todo, action) {
// ...
}
Erros semelhantes também acontecem aos meus componentes com as chaves. Eu queria saber quando eu deveria usar chaves para uma única importação, porque, obviamente, ao importar vários componentes / módulos, você deve colocá-los em chaves, o que eu sei.
Editar:
A publicação do SO aqui não responde à minha pergunta. Em vez disso, pergunto quando devo ou não usar chaves para importar um único módulo ou nunca devo usar chaves para importar um único módulo no ES6 (aparentemente isso não é o caso, como eu vi a importação única com chaves)
fonte
Respostas:
Esta é uma importação padrão :
Funciona apenas se
A
tiver a exportação padrão :Nesse caso, não importa qual nome você atribui ao importar:
Porque ele sempre vai estar ligado a qualquer que seja o padrão de exportação de
A
.Esta é uma importação nomeada chamada
A
:Funciona apenas se
A
contiver uma exportação nomeada chamadaA
:Nesse caso, o nome importa porque você está importando uma coisa específica pelo nome de exportação :
Para fazer isso funcionar, adicione uma exportação nomeada correspondente a
A
:Um módulo pode ter apenas uma exportação padrão , mas quantas exportações nomeadas você desejar (zero, um, dois ou muitos). Você pode importá-los todos juntos:
Aqui, importamos a exportação padrão como
A
, e exportações nomeadas chamadasmyA
eSomething
, respectivamente.Também podemos atribuir a eles todos os nomes diferentes ao importar:
As exportações padrão tendem a ser usadas para o que você normalmente espera obter do módulo. As exportações nomeadas tendem a ser usadas para utilitários que podem ser úteis, mas nem sempre são necessários. No entanto, cabe a você escolher como exportar coisas: por exemplo, um módulo pode não ter nenhuma exportação padrão.
Este é um ótimo guia para módulos ES, explicando a diferença entre exportações padrão e nomeadas.
fonte
export const myA = 43; export const Something = 44;
e também comexport default { myA, Something }
? Então, quando você importa você podeimport A from './A';
por tudo no módulo, ouimport { Something } from './A';
então você só tem um pouco do móduloimport * as AllTheThings
.import 'firebase/storage';
ouimport 'rxjs/add/operator/map';
. O que isso está realmente fazendo?Eu diria que também há uma notação estrelada para a
import
palavra-chave ES6 que vale a pena mencionar.Se você tentar consolar o Mix do log:
Você vai ter:
Os colchetes ficam dourados quando você precisa apenas de componentes específicos do módulo, o que diminui a pegada de empacotadores, como o webpack.
fonte
import * as Mix from "./A";
eimport A as Mix from "./A";
iguais?A resposta de Dan Abramov acima explica sobre as exportações padrão e as exportações nomeadas .
Qual usar?
Citando David Herman : O ECMAScript 6 favorece o estilo de exportação único / padrão e fornece a sintaxe mais agradável para a importação do padrão. A importação de exportações nomeadas pode e até deve ser um pouco menos concisa.
No entanto, no TypeScript, a exportação nomeada é favorecida devido à refatoração. Por exemplo, se você exportar uma classe por padrão e renomeá-la, o nome da classe será alterado apenas nesse arquivo e não nas outras referências, com o nome da classe de exportações com nome renomeado em todas as referências. As exportações nomeadas também são preferidas para utilitários.
Uso geral o que você preferir.
Adicional
A exportação padrão é na verdade uma exportação nomeada com o nome padrão, portanto, a exportação padrão pode ser importada como:
fonte
Additional
linha é uma boa informação.import A from './A'
não faz sentido se você estiver exportando sem definir um nome comoexport default 42
.Se você pensa
import
apenas como açúcar de sintaxe para módulos, objetos e destruição de nó, acho que é bastante intuitivo.fonte
Para entender o uso de chaves em
import
declarações, primeiro você precisa entender o conceito de destruição introduzido no ES6Destruição de objetos
Destruição de matriz
Usando correspondência de lista
Usando o operador spread
Agora que resolvemos isso, no ES6 você pode exportar vários módulos. Você pode então usar a destruição de objetos, como abaixo
Vamos supor que você tenha um módulo chamado
module.js
Você gostaria de importar as funções exportadas para
index.js
;Você também pode usar diferentes nomes de variáveis como
fonte
import {printFirstname as pFname, printLastname as pLname} from './module.js'
é equivalente a:var foo = {printFirstname: 'p_f_n', printLastname: 'p_l_n'}; var { printFirstname:pFname, printLastname: pLname } = foo; pFname('Taylor'); pLname('Swift');
ES6
Módulos de resumo :exportações:
Você tem 2 tipos de exportação:
Sintaxe:
Importações:
O tipo de exportação (isto é, exportações nomeadas ou padrão) afeta como importar algo:
Sintaxe:
Coisas de interesse:
Apelido:
Sempre que você deseja renomear uma importação nomeada, isso é possível por meio de aliases . A sintaxe para isso é a seguinte:
Agora importamos,
importantData_1
mas o identificador é emmyData
vez deimportantData_1
.fonte
normalmente, quando você exporta uma função, precisa usar o {}
você usa
import {x} from ''
você precisa usar
import X from ''
aqui, você pode mudar X para qualquer variável que você quiserfonte
Os chavetas ({}) são usadas para importar ligações nomeadas e o conceito por trás disso é a destruição da atribuição
Uma demonstração simples de como a instrução de importação funciona com um exemplo pode ser encontrada em minha própria resposta a uma pergunta semelhante em Quando usamos '{}' nas importações de javascript?
fonte
Os chavetas são usadas apenas para importação quando a exportação é nomeada. Se a exportação for o padrão, os chavetas não serão usadas para importação.
fonte
Para uma exportação padrão, não usamos {} quando importamos.
por exemplo
player.js
index.js
index.js
player.js
Se queremos importar tudo o que exportamos, usamos *
fonte