Desde 2016 han pasado muchas cosas en el mundo de JavaScript, por lo que creo que es hora de ofrecer la información más actualizada sobre este tema. Actualmente, las importaciones dinámicas son una realidad tanto en Node como en los navegadores (de forma nativa si no le importa IE, o con @ babel / plugin-syntax-dynamic-import si le importa).
Por lo tanto, considere un módulo de muestra something.js
con dos exportaciones con nombre y una exportación predeterminada:
export const hi = (name) => console.log(`Hi, ${name}!`)
export const bye = (name) => console.log(`Bye, ${name}!`)
export default () => console.log('Hello World!')
Podemos usar la import()
sintaxis para cargarlo condicionalmente de manera fácil y limpia:
if (somethingIsTrue) {
import('./something.js').then((module) => {
module.hi('Erick')
module.bye('Erick')
module.default()
})
}
Pero como el retorno es a Promise
, el azúcar sintáctico async
/ await
también es posible:
async imAsyncFunction () {
if (somethingIsTrue) {
const module = await import('./something.js')
module.hi('Erick')
}
}
¡Ahora piense en las posibilidades junto con la asignación de destrucción de objetos ! Por ejemplo, podemos poner fácilmente solo una de esas exportaciones nombradas en la memoria para uso posterior:
const { bye } = await import('./something.js')
bye('Erick')
O tal vez tome una de esas exportaciones con nombre y cámbiele el nombre a cualquier otra cosa que deseemos:
const { hi: hello } = await import('./something.js')
hello('Erick')
O incluso cambie el nombre de la función exportada predeterminada a algo que tenga más sentido:
const { default: helloWorld } = await import('./something.js')
helloWorld()
Solo una última (pero no menos importante) nota: import()
puede parecer una llamada de función, pero no es una Function
. Es una sintaxis especial que simplemente usa paréntesis (similar a lo que sucede con super()
). Entonces no es posible asignar import
a una variable o usar cosas del Function
prototipo, como call
/ apply
.
super
para llamar específico.