Exportation / importation ES6 dans un fichier d'index

202

J'utilise actuellement ES6 dans une application React via webpack / babel. J'utilise des fichiers d'index pour rassembler tous les composants d'un module et les exporter. Malheureusement, cela ressemble à ceci:

import Comp1_ from './Comp1.jsx';
import Comp2_ from './Comp2.jsx';
import Comp3_ from './Comp3.jsx';

export const Comp1 = Comp1_;
export const Comp2 = Comp2_;
export const Comp3 = Comp3_;

Je peux donc bien l'importer depuis d'autres endroits comme celui-ci:

import { Comp1, Comp2, Comp3 } from './components';

Évidemment, ce n'est pas une très bonne solution, alors je me demandais s'il y avait une autre façon. Je ne semble pas en mesure d'exporter directement le composant importé.

MoeSattler
la source

Réponses:

369

Vous pouvez facilement réexporter l'importation par défaut:

export {default as Comp1} from './Comp1.jsx';
export {default as Comp2} from './Comp2.jsx';
export {default as Comp3} from './Comp3.jsx';

Il existe également une proposition pour ES7 ES8 qui vous permettra d'écrire export Comp1 from '…';.

Bergi
la source
2
Voir aussi des modèles similaires ici et ici
Bergi
6
En plus de la proposition ES8, vous pouvez utiliser la génération de code pour gérer les fichiers d'index. Jetez un œil à github.com/gajus/create-index et github.com/ryardley/indexr .
Gajus
@Bergi Donc ces 3 lignes font à la fois l'importation et l'exportation? Ou est-ce juste une exportation mais vous n'avez plus besoin de jouer avec le nom Comp1_, etc.?
musicformellons
@musicformellons Ils exportent directement depuis le module référencé, oui.
Bergi
2
@amann Une référence circulaire en elle-même n'est pas mauvaise, mais peut entraîner des problèmes en fonction de ce que fait le module. Quoi qu'il en soit, je pense que vous ne devriez utiliser ce modèle que dans le fichier d'index de votre bibliothèque pour exporter tous les composants, et si vous avez des dépendances entre modules, vous devez les importer directement au lieu d'importer la partie à partir de la grande. Avec cela, aucune référence circulaire n'est introduite par ce modèle.
Bergi
56

Gardez également à l'esprit que si vous devez exporter plusieurs fonctions à la fois, comme les actions que vous pouvez utiliser

export * from './XThingActions';
GM
la source
14
Oui. Malheureusement, cela ne prend que les exportations nommées, c'est-à-dire qu'il n'inclut pas l'exportation par défaut.
ArneHugo
get's me a (assez trompeur ... m'a pris un moment) SyntaxError: Unexpected reserved word, la réponse acceptée de @ Bergi fonctionne.
Frank Nocke
Vous pouvez également nommer votre exportation par défaut pour contourner ce problème. Et vos actions ne devraient pas vraiment avoir d'export par défaut, donc cette solution fonctionne bien.
Barry Michael Doyle
2
la meilleure pratique consiste à ne pas utiliser les exportations par défaut en javascript, syntaxe supplémentaire inutile. @GM a la meilleure réponse sur ce fil pour le javascript moderne.
mibbit
39

Trop tard mais je veux partager la façon dont je le résous.

Ayant un modelfichier qui a deux exportations nommées:

export { Schema, Model };

et ayant un controllerfichier qui a l'exportation par défaut:

export default Controller;

J'ai exposé dans le indexfichier de cette façon:

import { Schema, Model } from './model';
import Controller from './controller';

export { Schema, Model, Controller };

et en supposant que je veux tous les importer:

import { Schema, Model, Controller } from '../../path/';
Javier Aguila
la source
Est-ce que cela fonctionne lorsque vous importez une fonction, puis la réexportez? J'ai essayé mais ça n'a pas marché.
Aftab Naveed du
Désolé, cela a vraiment fonctionné, je manquais / sur mon chemin.
Aftab Naveed
14

Simplement:

// Default export (recommended)
export {default} from './MyClass' 

// Default export with alias
export {default as d1} from './MyClass' 

// In >ES7, it could be
export * from './MyClass'

// In >ES7, with alias
export * as d1 from './MyClass'

Ou par nom de fonction:

// export by function names
export { funcName1, funcName2, …} from './MyClass'

// export by aliases
export { funcName1 as f1, funcName2 as f2, …} from './MyClass'

Plus d'infos: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export

pirs
la source
1

Installer @babel/plugin-proposal-export-default-fromvia:

yarn add -D @babel/plugin-proposal-export-default-from

Dans votre .babelrc.jsonou l'un des types de fichiers de configuration

module.exports = {
  //...
  plugins: [
     '@babel/plugin-proposal-export-default-from'
  ]
  //...
}

Vous pouvez désormais exportdirectement depuis file-path:

export Foo from './components/Foo'
export Bar from './components/Bar'

Bonne chance...

Akash
la source
Comment le faire pour Create-React-App sans éjecter?
Negin Basiri