Con ES6, puedo importar varias exportaciones de un archivo como este:
import {ThingA, ThingB, ThingC} from 'lib/things';
Sin embargo, me gusta la organización de tener un módulo por archivo. Termino con importaciones como esta:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
Me encantaría poder hacer esto:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
o algo similar, con la convención entendida de que cada archivo contiene una exportación predeterminada, y que cada módulo recibe el mismo nombre que su archivo.
es posible?
javascript
ecmascript-6
es6-modules
Frambot
fuente
fuente
lib/math
es un archivo que contiene múltiples exportaciones. En mi pregunta,lib/math/
es un directorio que contiene varios archivos, cada uno con una exportación.Respuestas:
No creo que esto sea posible, pero afaik la resolución de los nombres de los módulos depende de los cargadores de módulos, por lo que podría haber una implementación de cargador que sí lo soporte.
Hasta entonces, podría usar un "archivo de módulo" intermedio
lib/things/index.js
que solo contieney te permitiría hacer
fuente
index.js
el aspecto de:import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. Otros encantamientosindex.js
no se moverían.export * from
debería funcionar. ¿Has probado…from './ThingA'
oexport ThingA from …
? ¿Qué cargador de módulo estás usando?Solo una variación del tema ya proporcionado en la respuesta, pero ¿qué tal esto:
En una
Thing
,en
things/index.js
,Luego de consumir todas las cosas en otra parte,
O para consumir solo algunas cosas,
fuente
index.js
para mí. Estoy usando SystemJs + Babelexport ThingA from './ThingA'
lugar deexport {default as ThingA} from './ThingA'
Las respuestas actuales sugieren una solución alternativa, pero me molesta por qué esto no existe, así que he creado un
babel
complemento que hace esto.Instálelo usando:
luego agréguelo a su
.babelrc
con:vea el repositorio para obtener información detallada sobre la instalación
Esto le permite hacer esto:
Una vez más, el repositorio contiene más información sobre lo que hace exactamente, pero hacerlo de esta manera evita crear
index.js
archivos y también sucede en tiempo de compilación para evitar hacerreaddir
s en tiempo de ejecución.También con una versión más nueva puede hacer exactamente como su ejemplo:
funciona igual que el anterior.
fuente
./lib/things;
y no se está recogiendo. Los problemas que causa son ridículos. Acabo de presenciar la situación, cuando cambiar el archivo conimport *
Babel hace que recoja el archivo agregado, pero cambiarlo de nuevo, devuelve el problema, como si reutilizara el caché antes del cambio. Usar con precaución.~/.babel.json
que causa este comportamiento extraño. Además, si está utilizando como un observador o un recargador en caliente, debe guardar el nuevo archivo para que se vuelva a compilar con la nueva lista del directoriobpwc clear-cache
porque el paquete web y otros procesos de compilación seguirán almacenando en caché en silencioGrandes muglys gugly! Esto fue más difícil de lo necesario.
Exportar un valor predeterminado plano
Esta es una gran oportunidad para usar spread (
...
a{ ...Matters, ...Contacts }
continuación:Luego, para ejecutar el código compilado de babel desde la línea de comandos (desde la raíz del proyecto /):
Exportar un valor predeterminado similar a un árbol
Si prefiere no sobrescribir las propiedades, cambie:
Y la salida será:
Exportar múltiples exportaciones con nombre sin valor predeterminado
Si está dedicado a DRY , la sintaxis de las importaciones también cambia:
Esto crea 2 exportaciones con nombre sin exportación predeterminada. Luego cambia:
Y la salida:
Importar todas las exportaciones nombradas
Observe la desestructuración
import { Matters, Contacts } from './collections';
en el ejemplo anterior.En la práctica
Dados estos archivos fuente:
La creación de un
/myLib/index.js
paquete para agrupar todos los archivos anula el propósito de importar / exportar. Sería más fácil hacer que todo sea global en primer lugar, que hacerlo todo global mediante la importación / exportación a través de index.js "wrapper files".Si desea un archivo
import thingA from './myLib/thingA';
en particular, en sus propios proyectos.Crear un "archivo contenedor" con exportaciones para el módulo solo tiene sentido si está empaquetando para npm o en un proyecto multianual de varios equipos.
¿Llegó tan lejos? Vea los documentos para más detalles.
Además, sí, Stackoverflow finalmente admite tres s como marcado de valla de código.
fuente
Puede usar la importación asincrónica ():
y entonces:
fuente
Similar a la pregunta aceptada, pero le permite escalar sin la necesidad de agregar un nuevo módulo al archivo de índice cada vez que crea uno:
./modules/moduleA.js
./modules/index.js
./example.js
fuente
./example.js
Los he usado varias veces (en particular para construir objetos masivos que dividen los datos en muchos archivos (por ejemplo, nodos AST)), para construirlos hice un pequeño script (que acabo de agregar a npm para que todos los demás puede usarlo).
Uso (actualmente necesitará usar babel para usar el archivo de exportación):
Genera un archivo que contiene:
Entonces puedes consumir el archivo:
fuente
\` instead of
/) also as an improvment you may want to allow two options like
--filename` &&--dest
para permitir la personalización de dónde se debe almacenar el archivo creado y bajo qué nombre. Tampoco funciona con nombres de archivo que contienen.
(comouser.model.js
)Solo otro enfoque para la respuesta de @ Bergi
Usos
fuente
export '...' was not found in '....
.Puede usar require también:
Luego use su moduleHolder con controladores cargados dinámicamente:
fuente
Esto no es exactamente lo que pediste, pero con este método puedo iterar
componentsList
en mis otros archivos y usar funciones como lascomponentsList.map(...)
que encuentro bastante útiles.fuente
Si estás usando webpack. Esto importa archivos automáticamente y exporta como espacio de nombres api .
Por lo tanto, no es necesario actualizar cada vez que se agrega un archivo.
Para usuarios de Typecript;
fuente
Pude tomar el enfoque del usuario atilkan y modificarlo un poco:
Para usuarios de Typecript;
fuente
si no exporta valores predeterminados en A, B, C pero solo exporta {}, entonces es posible hacerlo
fuente
./thing
) e incluso si lo hubiera, no funcionaría. (Lo probé y no funcionó).