é possível importar algo para o módulo fornecendo o nome da variável ao usar a importação ES6?
Ou seja, quero importar algum módulo em um tempo de execução, dependendo dos valores fornecidos em uma configuração:
import something from './utils/' + variableName;
javascript
node.js
ecmascript-6
Vytautas Butkus
fonte
fonte
Respostas:
Não com a
import
declaração.import
eexport
são definidos de forma que sejam estaticamente analisáveis, de forma que não possam depender de informações de tempo de execução.Você está procurando a API do carregador (polyfill) , mas não estou certo sobre o status da especificação:
fonte
Além da resposta de Felix , observarei explicitamente que isso não é permitido atualmente pela gramática ECMAScript 6 :
Um ModuleSpecifier pode ser apenas um StringLiteral , não qualquer outro tipo de expressão como uma AdditiveExpression .
fonte
const
string literal
s. Eles são estaticamente analisáveis, não são? Isso tornaria possível reutilizar a localização de uma dependência. (por exemplo, importe um modelo e tenha o modelo e a localização do modelo disponíveis).Embora esta não seja realmente uma importação dinâmica (por exemplo, no meu caso, todos os arquivos que estou importando abaixo serão importados e agrupados pelo webpack, não selecionados em tempo de execução), um padrão que tenho usado que pode ajudar em algumas circunstâncias é :
ou alternativamente:
Não acho que posso voltar a um padrão tão facilmente com o
require()
, o que gera um erro se eu tentar importar um caminho de modelo construído que não existe.Bons exemplos e comparações entre exigir e importar podem ser encontrados aqui: http://www.2ality.com/2014/09/es6-modules-final.html
Excelente documentação sobre reexportação de @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Estou interessado em ouvir feedback sobre essa abordagem :)
fonte
Object.values(templates)
.Há uma nova especificação chamada importação dinâmica para módulos ES. Basicamente, você apenas liga
import('./path/file.js')
e está pronto para continuar. A função retorna uma promessa, que resolve com o módulo se a importação foi bem-sucedida.Casos de uso
Os casos de uso incluem a importação de componentes com base em rota para React, Vue etc. e a capacidade de carregar módulos lentamente , uma vez que são necessários durante o tempo de execução.
Outras informações
Aqui está uma explicação sobre o Google Developers .
Compatibilidade do navegador (abril de 2020)
De acordo com o MDN, ele é compatível com todos os principais navegadores atuais (exceto o IE) e caniuse.com mostra 87% de suporte em toda a participação de mercado global. Novamente sem suporte no IE ou Edge sem cromo.
fonte
Eu entendo a pergunta feita especificamente para ES6
import
em Node.js, mas o seguinte pode ajudar outras pessoas que procuram uma solução mais genérica:Observe que se você estiver importando um módulo ES6 e precisar acessar a
default
exportação, precisará usar um dos seguintes:Você também pode usar a desestruturação com essa abordagem, o que pode adicionar mais familiaridade de sintaxe com suas outras importações:
Infelizmente, se você deseja acessar
default
e também desestruturar, precisará realizar isso em várias etapas:fonte
você pode usar a notação não ES6 para fazer isso. Isto é o que funcionou para mim:
fonte
Gosto menos dessa sintaxe, mas funciona: em
vez de escrever
use esta sintaxe:
fonte
require()
é um método Node.JS para carregar arquivos, que é a versão anterior.import
declaração é a versão mais recente, que agora faz parte da sintaxe do idioma oficial. Porém, em muitos casos, o navegador usará o anterior (por trás da ciência). A declaração de requerimento também descontará seus arquivos, portanto, se um arquivo for carregado pela segunda vez, ele será carregado da memória (melhor desempenho). A forma de importação tem seus próprios benefícios - se você estiver usando o WebPack. então o webpack pode remover referências mortas (esses scripts não serão baixados para o cliente).A importação dinâmica () (disponível no Chrome 63+) fará o seu trabalho. Veja como:
fonte
Eu faria assim
fonte
./utils/test.js
chamada do arquivo
fonte