Desde 2016 muito se passou no mundo do JavaScript, então acredito que é hora de oferecer as informações mais atualizadas sobre esse assunto. Atualmente, as importações dinâmicas são uma realidade tanto no Node quanto nos navegadores (nativamente, se você não se importa com o IE, ou com @ babel / plugin-syntax-dynamic-import se você se importa).
Portanto, considere um módulo de amostra something.js
com duas exportações nomeadas e uma exportação padrão:
export const hi = (name) => console.log(`Hi, ${name}!`)
export const bye = (name) => console.log(`Bye, ${name}!`)
export default () => console.log('Hello World!')
Podemos usar a import()
sintaxe para carregá-lo de forma fácil e limpa condicionalmente:
if (somethingIsTrue) {
import('./something.js').then((module) => {
module.hi('Erick')
module.bye('Erick')
module.default()
})
}
Mas como o retorno é um Promise
, o açúcar sintático async
/ await
também é possível:
async imAsyncFunction () {
if (somethingIsTrue) {
const module = await import('./something.js')
module.hi('Erick')
}
}
Agora pense nas possibilidades junto com a Atribuição de Destruturação de Objetos ! Por exemplo, podemos facilmente colocar apenas uma dessas exportações nomeadas na memória para uso posterior:
const { bye } = await import('./something.js')
bye('Erick')
Ou talvez pegue uma das exportações nomeadas e renomeie para qualquer outra coisa que quisermos:
const { hi: hello } = await import('./something.js')
hello('Erick')
Ou até mesmo renomeie a função exportada padrão para algo que faça mais sentido:
const { default: helloWorld } = await import('./something.js')
helloWorld()
Apenas uma última (mas não menos importante) observação: import()
pode parecer uma chamada de função, mas não é um Function
. É uma sintaxe especial que usa parênteses (semelhante ao que acontece com super()
). Portanto, não é possível atribuir import
a uma variável ou usar coisas do Function
protótipo, como call
/ apply
.
super
para chamar específico.