Necesito hacer algo como:
if (condition) {
import something from 'something';
}
// ...
if (something) {
something.doStuff();
}
El código anterior no se compila; lanza SyntaxError: ... 'import' and 'export' may only appear at the top level
.
Intenté usar System.import
como se muestra aquí , pero no sé de dónde System
viene. ¿Es una propuesta de ES6 que no terminó siendo aceptada? El enlace a la "API programática" de ese artículo me devuelve a una página de documentos en desuso .
javascript
module
ecmascript-6
ericsoco
fuente
fuente
package.json
; mygulpfile
luego comprueba si esa dependencia existe antes de realizar algunos pasos de compilación.webpack
ybabel
para transpilar es6 a es5. Proyectos comowebpack-rewire
y similares no son de ayuda aquí: github.com/jhnns/rewire-webpack/issues/12 . Una forma de establecer que la prueba se duplique O para eliminar dependencias problemáticas podría ser la importación condicional.webpack
se usa para convertir hojas de estilo en módulos que insertan los estilos relevantes en el DOM cuando se importan), pero el módulo también debe ejecutarse fuera del navegador (por ejemplo, para pruebas unitarias).Respuestas:
Tenemos una propuesta dinámica de importaciones ahora con ECMA. Esto está en la etapa 3. Esto también está disponible como preajuste de babel .
A continuación se muestra una forma de hacer una representación condicional según su caso.
Esto básicamente devuelve una promesa. Se espera que la resolución de promesa tenga el módulo. La propuesta también tiene otras características como importaciones dinámicas múltiples, importaciones predeterminadas, importación de archivos js, etc. Puede encontrar más información sobre importaciones dinámicas aquí .
fuente
if (condition) { import('something') .then(({ somethingExported }) => { console.log(somethingExported); }); }
npm run build
sigo recibiendo el error:SyntaxError: ... 'import' and 'export' may only appear at the top level
Si lo desea, puede usar require. Esta es una manera de tener una declaración de requerimiento condicional.
fuente
require()
no es parte del JavaScript estándar: es una función incorporada en Node.js, por lo que solo es útil en ese entorno. El OP no indica que trabaje con Node.js.No puede importar condicionalmente, pero puede hacer lo contrario: exportar algo condicionalmente. Depende de su caso de uso, por lo que esta solución podría no ser adecuada para usted.
Tu puedes hacer:
api.js
apiConsumer.js
Lo uso para burlarme de bibliotecas analíticas como mixpanel, etc., porque no puedo tener varias compilaciones o nuestra interfaz actualmente. No es el más elegante, pero funciona. Solo tengo algunos 'si' aquí y allá dependiendo del entorno porque en el caso de mixpanel, necesita inicialización.
fuente
Parece que la respuesta es que, a partir de ahora, no puedes.
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
Creo que la intención es permitir el análisis estático tanto como sea posible, y los módulos importados condicionalmente lo rompen. También vale la pena mencionar: estoy usando Babel , y supongo que
System
Babel no es compatible porque la API del cargador de módulos no se convirtió en un estándar ES6.fuente
require()
es una forma de importar algún módulo en el tiempo de ejecución y califica igualmente para el análisis estático comoimport
si se usara con rutas literales de cadena. El paquete lo requiere para seleccionar dependencias para el paquete.Para la resolución de módulos dinámicos con soporte completo de análisis estático, primeros módulos de índice en un indexador (index.js) e importar el indexador en el módulo host.
fuente
require()
no es parte del JavaScript estándar: es una función incorporada en Node.js, por lo que solo es útil en ese entorno. El OP no indica que trabaje con Node.js.Diferencia importante si usa el modo dinámico de Webpack de importación
eager
:fuente
import
devuelve una promesa.oscurecerlo en una evaluación funcionó para mí, ocultándolo del analizador estático ...
fuente
eval
aquí, @TormodHaugene?eval
no deben usarse . En general: si encuentra la necesidad de usareval
, probablemente lo esté haciendo mal y debería dar un paso atrás para considerar sus alternativas. Probablemente hay algunos escenarios donde el usoeval
es correcto, pero lo más probable es que no haya encontrado una de esas situaciones.require()
no es parte del JavaScript estándar: es una función incorporada en Node.js, por lo que solo es útil en ese entorno. El OP no indica que trabaje con Node.js.Pude lograr esto usando una función invocada de inmediato y requiero una declaración.
fuente
require()
no es parte del JavaScript estándar: es una función incorporada en Node.js, por lo que solo es útil en ese entorno. El OP no indica que trabaje con Node.js.Las importaciones condicionales también podrían lograrse con un ternario y
require()
s:const logger = DEBUG ? require('dev-logger') : require('logger');
Este ejemplo fue tomado de ES Lint global-require docs: https://eslint.org/docs/rules/global-require
fuente
require()
no es parte del JavaScript estándar: es una función incorporada en Node.js, por lo que solo es útil en ese entorno. El OP no indica que trabaje con Node.js.Mire este ejemplo para comprender claramente cómo funciona la importación dinámica.
Ejemplo de importaciones de módulos dinámicos
Tener conocimientos básicos de importación y exportación de módulos.
Módulos de JavaScript Github
Javascript Módulos MDN
fuente
No, no puedes!
Sin embargo, haber topado con ese problema debería hacerte repensar cómo organizas tu código.
Supongo que una de las razones por las que dejaron de admitir ES6 en adelante es el hecho de que compilarlo sería muy difícil o imposible.
fuente