Esportazione / importazione ES6 nel file indice


202

Attualmente sto usando ES6 in un'app React tramite webpack / babel. Sto usando i file indice per raccogliere tutti i componenti di un modulo ed esportarli. Sfortunatamente, sembra così:

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_;

Quindi posso ben importarlo da altri posti come questo:

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

Ovviamente non è una soluzione molto bella, quindi mi chiedevo se ci fosse un altro modo. Non riesco a esportare direttamente il componente importato.


Possibile duplicato dei moduli
Inanc Gumus,

Risposte:


369

Puoi riesportare facilmente l'importazione predefinita:

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

C'è anche una proposta per ES7 ES8 che ti permetterà di scrivere export Comp1 from '…';.


2
Vedi anche schemi simili qui e qui
Bergi,

6
Oltre alla proposta ES8, è possibile utilizzare la generazione di codice per gestire i file di indice. Dai un'occhiata a github.com/gajus/create-index e github.com/ryardley/indexr .
Gajus

@Bergi Quindi queste 3 righe fanno sia l'importazione che l'esportazione? O è solo esportazione ma non è più necessario giocherellare con il nome Comp1_ ecc.?
musicformellons,

@musicformellons Esportano direttamente dal modulo di riferimento, sì.
Bergi,

2
@amann Un riferimento circolare di se stesso non è male, ma può portare a problemi a seconda di ciò che fa il modulo. Indipendentemente da ciò, penso che dovresti usare questo modello solo nel file indice della tua libreria per esportare tutti i componenti, e se hai dipendenze tra i moduli dovresti importarli direttamente invece di importare la parte da quella grande. Con ciò, questo modello non introduce riferimenti circolari.
Bergi,

56

Inoltre, tenere presente che se è necessario esportare più funzioni contemporaneamente, come le azioni che è possibile utilizzare

export * from './XThingActions';

14
Sì. Sfortunatamente ciò richiede solo esportazioni con nome, ovvero non include l'esportazione predefinita.
ArneHugo,

prendimi un (abbastanza fuorviante ... mi ha preso un momento) SyntaxError: Unexpected reserved word, la risposta accettata da @ Bergi funziona.
Frank Nocke,

Puoi anche nominare l'esportazione predefinita per aggirare quel problema. E le tue azioni non dovrebbero davvero avere un'esportazione predefinita, quindi questa soluzione funziona bene.
Barry Michael Doyle,

2
la migliore pratica è non utilizzare le esportazioni predefinite in javascript, sintassi extra non necessaria. @GM ha la migliore risposta su questo thread per il javascript moderno.
mibbit il

39

Troppo tardi, ma voglio condividere il modo in cui lo risolvo.

Avere modelfile che ha due denominati export:

export { Schema, Model };

e avendo controllerfile che ha l'esportazione predefinita:

export default Controller;

Ho esposto nel indexfile in questo modo:

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

export { Schema, Model, Controller };

e supponendo che io voglia importarli tutti:

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

Funziona quando importi una funzione e poi la esporti? Ci ho provato ma non l'ha fatto.
Aftab Naveed,

Mi dispiace che in realtà ha funzionato, mi mancava / nel mio percorso.
Aftab Naveed,

14

Semplicemente:

// 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'

O dai nomi delle funzioni:

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

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

Ulteriori informazioni: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.