Com o ES6, posso importar várias exportações de um arquivo como este:
import {ThingA, ThingB, ThingC} from 'lib/things';
No entanto, gosto da organização de ter um módulo por arquivo. Acabo com importações como esta:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
Eu adoraria poder fazer isso:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
ou algo semelhante, com a convenção entendida de que cada arquivo contém uma exportação padrão e que cada módulo tem o mesmo nome que seu arquivo.
Isso é possível?
javascript
ecmascript-6
es6-modules
Frambot
fonte
fonte
lib/math
é um arquivo que contém várias exportações. Na minha pergunta,lib/math/
é um diretório que contém vários arquivos, cada um contendo uma exportação.Respostas:
Eu não acho que isso seja possível, mas após a resolução dos nomes dos módulos depende dos carregadores de módulos, pode haver uma implementação do carregador que suporte isso.
Até então, você poderia usar um "arquivo de módulo" intermediário
lib/things/index.js
que continha apenase isso permitiria que você fizesse
fonte
index.js
olhar como:import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. Outros encantamentosindex.js
não mudariam.export * from
deve funcionar. Você já tentou…from './ThingA'
ouexport ThingA from …
? Qual carregador de módulo você está usando?Apenas uma variação do tema já fornecida na resposta, mas e quanto a isso:
Em um
Thing
,In
things/index.js
,Então, para consumir todas as coisas em outro lugar,
Ou para consumir apenas algumas coisas,
fonte
index.js
para mim. Estou usando SystemJs + Babelexport ThingA from './ThingA'
em vez deexport {default as ThingA} from './ThingA'
As respostas atuais sugerem uma solução alternativa, mas me incomodou por que isso não existe, então eu criei um
babel
plugin que faz isso.Instale-o usando:
adicione-o ao seu
.babelrc
com:consulte o repositório para obter informações detalhadas sobre a instalação
Isso permite que você faça isso:
novamente, o repositório contém mais informações sobre o que exatamente ele faz, mas evita a criação de
index.js
arquivos e também acontece no tempo de compilação para evitar fazerreaddir
s em tempo de execução.Também com uma versão mais recente, você pode fazer exatamente como no seu exemplo:
funciona da mesma maneira que acima.
fonte
./lib/things;
e não está sendo escolhido. Os problemas que causa são ridículos. Acabei de testemunhar a situação, ao alterar o arquivo com oimport *
make babel para pegar o arquivo adicionado, mas alterá-lo de volta traz o problema de volta, como se reutilizasse o cache antes da alteração. Use com cuidado.~/.babel.json
qual causa esse comportamento estranho. Além disso, se você estiver usando como um observador ou um reloader quente você tem que salvar o novo arquivo por isso vai ser recompilados com a nova listagem de diretóriobpwc clear-cache
porque o cache Webpack e outros processos de compilação será ainda silenciosamenteGreat gugly muglys! Isso foi mais difícil do que precisava ser.
Exportar um padrão simples
Esta é uma grande oportunidade de usar propagação (
...
em{ ...Matters, ...Contacts }
abaixo:Em seguida, para executar o código compilado babel na linha de comando (na raiz do projeto /):
Exportar um padrão semelhante a uma árvore
Se você preferir não substituir as propriedades, altere:
E a saída será:
Exportar várias exportações nomeadas sem padrão
Se você é dedicado ao DRY , a sintaxe das importações também muda:
Isso cria 2 exportações nomeadas sem exportação padrão. Então mude:
E a saída:
Importar todas as exportações nomeadas
Observe a desestruturação
import { Matters, Contacts } from './collections';
no exemplo anterior.Na prática
Dados esses arquivos de origem:
Criar um
/myLib/index.js
para agrupar todos os arquivos anula o propósito de importação / exportação. Seria mais fácil tornar tudo global em primeiro lugar do que tornar tudo global via importação / exportação via "arquivos de wrapper" index.js.Se você deseja um arquivo específico,
import thingA from './myLib/thingA';
em seus próprios projetos.Criar um "arquivo wrapper" com exportações para o módulo só faz sentido se você estiver empacotando para npm ou em um projeto de várias equipes com vários anos.
Chegou tão longe? Veja os documentos para mais detalhes.
Além disso, sim, para o Stackoverflow finalmente suportando três `s como marcação de cerca de código.
fonte
Você pode usar async import ():
e depois:
fonte
Semelhante à pergunta aceita, mas permite escalar sem a necessidade de adicionar um novo módulo ao arquivo de índice cada vez que você cria um:
./modules/moduleA.js
./modules/index.js
./example.js
fonte
./example.js
Eu os usei algumas vezes (em particular para criar objetos maciços que dividem os dados em muitos arquivos (por exemplo, nós AST)). Para construí-los, criei um pequeno script (que acabei de adicionar ao npm para que todos os outros pode usá-lo).
Uso (atualmente você precisará usar o babel para usar o arquivo de exportação):
Gera um arquivo contendo:
Então você pode apenas consumir o arquivo:
fonte
\` instead of
/) also as an improvment you may want to allow two options like
--filename` &&--dest
para permitir a personalização de onde o arquivo criado deve ser armazenado e com o nome. Também não funciona com nomes de arquivos contendo.
(comouser.model.js
)Apenas uma outra abordagem para a resposta de @ Bergi
Usos
fonte
export '...' was not found in '....
.Você também pode usar o exigir:
Em seguida, use o moduleHolder com controladores carregados dinamicamente:
fonte
Não é exatamente isso que você pediu, mas, com esse método, eu posso iterar
componentsList
nos meus outros arquivos e usar funções como ascomponentsList.map(...)
que eu acho bastante úteis!fonte
Se você estiver usando o webpack. Isso importa arquivos automaticamente e exporta como API namespace da .
Portanto, não é necessário atualizar a cada adição de arquivo.
Para usuários do Typecript;
fonte
Consegui tirar da abordagem do usuário atilkan e modificá-la um pouco:
Para usuários do Typecript;
fonte
se você não exportar o padrão em A, B, C, mas apenas exportar {}, é possível fazer isso
fonte
./thing
) e, mesmo que houvesse, não funcionaria. (Eu tentei, e não funcionou.)