¿Es posible importar algo en el módulo que proporciona el nombre de la variable mientras se usa la importación de ES6?
Es decir, quiero importar algún módulo en un tiempo de ejecución dependiendo de los valores proporcionados en una configuración:
import something from './utils/' + variableName;
javascript
node.js
ecmascript-6
Vytautas Butkus
fuente
fuente
Respuestas:
No con la
import
declaración.import
yexport
están definidos de tal manera que se pueden analizar estáticamente, por lo que no pueden depender de la información en tiempo de ejecución.Está buscando la API del cargador (polyfill) , pero no tengo claro el estado de la especificación:
fuente
Además de la respuesta de Felix , señalaré explícitamente que esto no está permitido actualmente por la gramática ECMAScript 6 :
Un ModuleSpecifier solo puede ser un StringLiteral , no cualquier otro tipo de expresión como AdditiveExpression .
fuente
const
string literal
s. Son analizables estáticamente, ¿no? Haría posible la reutilización de la ubicación de una dependencia. (por ejemplo, importe una plantilla y tenga disponible tanto la plantilla como la ubicación de la plantilla).Si bien esto no es realmente una importación dinámica (por ejemplo, en mi circunstancia, todos los archivos que estoy importando a continuación serán importados y empaquetados por paquete web, no seleccionados en tiempo de ejecución), un patrón que he estado usando y que puede ayudar en algunas circunstancias es :
o alternativamente:
No creo que pueda volver a un valor predeterminado tan fácilmente con
require()
, lo que arroja un error si intento importar una ruta de plantilla construida que no existe.Se pueden encontrar buenos ejemplos y comparaciones entre requerir e importar aquí: http://www.2ality.com/2014/09/es6-modules-final.html
Excelente documentación sobre la reexportación desde @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Me interesa escuchar comentarios sobre este enfoque :)
fuente
Object.values(templates)
.Hay una nueva especificación que se denomina importación dinámica para módulos ES. Básicamente, solo llamas
import('./path/file.js')
y listo. La función devuelve una promesa, que se resuelve con el módulo si la importación se realizó correctamente.Casos de uso
Los casos de uso incluyen la importación de componentes basados en rutas para React, Vue, etc. y la capacidad de cargar módulos de forma diferida , una vez que se requieren durante el tiempo de ejecución.
Más información
Aquí hay una explicación sobre los desarrolladores de Google .
Compatibilidad del navegador (abril de 2020)
Según MDN , es compatible con todos los principales navegadores actuales (excepto IE) y caniuse.com muestra un 87% de soporte en toda la cuota de mercado global. Nuevamente, no hay soporte en IE o Edge sin cromo.
fuente
Entiendo que la pregunta se hizo específicamente para ES6
import
en Node.js, pero lo siguiente podría ayudar a otros que buscan una solución más genérica:Tenga en cuenta que si está importando un módulo ES6 y necesita acceder a la
default
exportación, deberá utilizar uno de los siguientes:También puede usar la desestructuración con este enfoque que puede agregar más familiaridad de sintaxis con sus otras importaciones:
Desafortunadamente, si desea acceder
default
además de desestructurar, deberá realizar esto en varios pasos:fuente
puede utilizar la notación que no es ES6 para hacer eso. esto es lo que funcionó para mí:
fuente
Me gusta menos esta sintaxis, pero funciona: en
lugar de escribir
usa esta sintaxis:
fuente
require()
es un método Node.JS para cargar archivos, que es la versión inicial.import
declaración es la versión más reciente, que ahora forma parte de la sintaxis del idioma oficial. Sin embargo, en muchos casos el navegador utilizará el anterior (detrás de la ciencia). La declaración require también cobrará sus archivos, por lo que si un archivo se carga la segunda vez, se cargará desde la memoria (mejor rendimiento). La forma de importación tiene sus propios beneficios, si está utilizando WebPack. luego, el paquete web puede eliminar las referencias muertas (estos scripts no se descargarán en el cliente).La importación dinámica () (disponible en Chrome 63+) hará su trabajo. Así es cómo:
fuente
Lo haría así
fuente
./utils/test.js
llamar desde archivo
fuente