react modules exports example ecmascript javascript module ecmascript-6

modules - module.exports javascript



¿Cómo puedo importar condicionalmente un módulo ES6? (9)

Necesito hacer algo como:

if (condition) { import something from ''something''; } // ... if (something) { something.doStuff(); }

El código anterior no se compila; arroja SyntaxError: ... ''import'' and ''export'' may only appear at the top level .

Intenté usar System.import como se muestra here , pero no sé de dónde viene el System . ¿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 .


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


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

import mockAPI from ''./mockAPI'' import realAPI from ''./realAPI'' const exportedAPI = shouldUseMock ? mockAPI : realAPI export default exportedAPI

apiConsumer.js

import API from ''./api'' ...

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.


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 rompen eso. También vale la pena mencionar: estoy usando Babel , y supongo que Babel no admite el System porque la API del cargador de módulos no se convirtió en un estándar ES6.


Pude lograr esto usando una función invocada de inmediato y requiero una declaración.

const something = (() => ( condition ? require(''something'') : null ))(); if(something) { something.doStuff(); }


Si lo desea, puede usar require. Esta es una manera de tener una declaración de requerimiento condicional.

let something = null; let other = null; if (condition) { something = require(''something''); other = require(''something'').other; } if (something && other) { something.doStuff(); other.doOtherStuff(); }


Tenemos una propuesta dinámica de importaciones ahora con ECMA. Esto está en la etapa 3. Esto también está disponible como babel-preset .

A continuación se muestra una forma de hacer una representación condicional según su caso.

if (condition) { import(''something'') .then((something) => { console.log(something.something); }); }

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í .


oscurecerlo en una evaluación funcionó para mí, ocultándolo del analizador estático ...

if (typeof __CLI__ !== ''undefined'') { eval("require(''fs'');") }


require() es una forma de importar algún módulo en el tiempo de ejecución e igualmente califica para análisis estático como import si se usa con rutas literales de cadena. El paquete lo requiere para seleccionar las dependencias para el paquete.

const defaultOne = require(''path/to/component'').default; const NamedOne = require(''path/to/component'').theName;

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 importador de índice en el módulo host.

// index.js export { default as ModuleOne } from ''path/to/module/one''; export { default as ModuleTwo } from ''path/to/module/two''; export { SomeNamedModule } from ''path/to/named/module''; // host.js import * as indexer from ''index''; const moduleName = ''ModuleOne''; const Module = require(indexer[moduleName]);