Avec ES6, je peux importer plusieurs exportations à partir d'un fichier comme celui-ci:
import {ThingA, ThingB, ThingC} from 'lib/things';
Cependant, j'aime l'organisation d'avoir un module par fichier. Je me retrouve avec des importations comme celle-ci:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
J'adorerais pouvoir faire ça:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
ou quelque chose de similaire, avec la convention bien connue que chaque fichier contient une exportation par défaut et que chaque module est nommé de la même manière que son fichier.
Est-ce possible?
javascript
ecmascript-6
es6-modules
Frambot
la source
la source
lib/math
trouve un fichier contenant plusieurs exportations. Dans ma question,lib/math/
est un répertoire contenant plusieurs fichiers, chacun contenant une exportation.Réponses:
Je ne pense pas que cela soit possible, mais afaik la résolution des noms de modules dépend des chargeurs de modules, il pourrait donc y avoir une implémentation de chargeur qui prend en charge cela.
Jusque-là, vous pouvez utiliser un "fichier module" intermédiaire
lib/things/index.js
qui contient justeet cela vous permettrait de faire
la source
index.js
recherche comme:import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. D'autres incantationsindex.js
ne bougeraient pas.export * from
devrait marcher. Avez-vous essayé…from './ThingA'
ouexport ThingA from …
? Quel chargeur de module utilisez-vous?Juste une variation sur le thème déjà fourni dans la réponse, mais qu'en est-il:
Dans un
Thing
,Dans
things/index.js
,Ensuite, pour consommer toutes les choses ailleurs,
Ou pour consommer juste certaines choses,
la source
index.js
pour moi. J'utilise SystemJs + Babelexport ThingA from './ThingA'
au lieu deexport {default as ThingA} from './ThingA'
Les réponses actuelles suggèrent une solution de contournement, mais cela me dérange pourquoi cela n'existe pas, j'ai donc créé un
babel
plugin qui fait cela.Installez-le en utilisant:
puis ajoutez-le à votre
.babelrc
avec:voir le repo pour des informations d'installation détaillées
Cela vous permet de faire ceci:
encore une fois, le dépôt contient des informations supplémentaires sur ce qu'il fait exactement, mais le faire de cette façon évite de créer des
index.js
fichiers et se produit également au moment de la compilation pour éviter de faire desreaddir
s au moment de l'exécution.De plus, avec une version plus récente, vous pouvez faire exactement comme votre exemple:
fonctionne de la même manière que ci-dessus.
la source
./lib/things;
et il n'est pas récupéré. Les problèmes qu'elle provoque sont ridicules. Je viens d'être témoin d'une situation, lorsque le changement de fichier avecimport *
fait babel pour récupérer le fichier ajouté, mais le changer en arrière, ramène le problème, comme s'il réutilise le cache d'avant le changement. Utiliser avec précaution.~/.babel.json
ce comportement étrange. De plus, si vous utilisez comme un observateur ou un rechargeur à chaud, vous devez enregistrer le nouveau fichier afin qu'il soit recompilé avec la nouvelle liste de répertoiresbpwc clear-cache
car le webpack et les autres processus de construction seront toujours mis en cache silencieusementGrands gugly muglys! C'était plus difficile que nécessaire.
Exporter un plat par défaut
Ceci est une excellente occasion d'utiliser la propagation (
...
en -{ ...Matters, ...Contacts }
dessous:Ensuite, pour exécuter le code compilé babel à partir de la ligne de commande (à partir de la racine du projet /):
Exporter une arborescence par défaut
Si vous préférez ne pas écraser les propriétés, modifiez:
Et la sortie sera:
Exporter plusieurs exportations nommées sans défaut
Si vous êtes dédié à DRY , la syntaxe des importations change également:
Cela crée 2 exportations nommées sans exportation par défaut. Puis changez:
Et la sortie:
Importer toutes les exportations nommées
Remarquez la déstructuration
import { Matters, Contacts } from './collections';
dans l'exemple précédent.En pratique
Compte tenu de ces fichiers source:
Créer un
/myLib/index.js
pour regrouper tous les fichiers va à l'encontre du but de l'importation / exportation. Il serait plus facile de tout rendre global en premier lieu, que de tout rendre global via l'importation / exportation via les "fichiers wrapper" index.js.Si vous voulez un fichier particulier,
import thingA from './myLib/thingA';
dans vos propres projets.La création d'un "fichier wrapper" avec des exportations pour le module n'a de sens que si vous empaquetez pour npm ou sur un projet pluriannuel pluriannuel.
Tu es arrivé jusqu'ici? Voir les documents pour plus de détails.
Aussi, oui pour Stackoverflow supportant finalement trois `comme code de clôture.
la source
Vous pouvez utiliser async import ():
puis:
la source
Similaire à la question acceptée, mais elle vous permet de vous adapter sans avoir à ajouter un nouveau module au fichier d'index chaque fois que vous en créez un:
./modules/moduleA.js
./modules/index.js
./example.js
la source
./example.js
Je les ai utilisées plusieurs fois (en particulier pour construire des objets massifs en divisant les données sur de nombreux fichiers (par exemple les nœuds AST)), afin de les construire, j'ai fait un petit script (que je viens d'ajouter à npm pour tout le monde) peut l'utiliser).
Utilisation (actuellement, vous devrez utiliser babel pour utiliser le fichier d'exportation):
Génère un fichier contenant:
Ensuite, vous pouvez simplement consommer le fichier:
la source
\` instead of
/) also as an improvment you may want to allow two options like
--filename` &&--dest
pour permettre de personnaliser où le fichier créé doit être stocké et sous quel nom. Ne fonctionne pas non plus avec les noms de fichiers contenant.
(commeuser.model.js
)Juste une autre approche de la réponse de @ Bergi
Les usages
la source
export '...' was not found in '....
.Vous pouvez également utiliser require:
Utilisez ensuite votre moduleHolder avec des contrôleurs chargés dynamiquement:
la source
Ce n'est pas exactement ce que vous avez demandé mais, avec cette méthode, je peux parcourir
componentsList
mes autres fichiers et utiliser des fonctions comme cellescomponentsList.map(...)
que je trouve assez utiles!la source
Si vous utilisez webpack. Cela importe automatiquement les fichiers et les exporte en tant qu'espace de noms api .
Donc, pas besoin de mettre à jour chaque ajout de fichier.
Pour les utilisateurs de Typographie;
la source
J'ai pu reprendre l'approche de l'utilisateur atilkan et la modifier un peu:
Pour les utilisateurs de Typographie;
la source
si vous n'exportez pas par défaut en A, B, C mais exportez simplement {} alors il est possible de le faire
la source
./thing
) et même s'il y en avait, cela ne fonctionnerait pas. (Je l'ai essayé, et cela n'a pas fonctionné.)