ES6 Exportieren / Importieren in Indexdatei

201

Ich verwende derzeit ES6 in einer React-App über Webpack / Babel. Ich verwende Indexdateien, um alle Komponenten eines Moduls zu sammeln und zu exportieren. Das sieht leider so aus:

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

So kann ich es schön von anderen Orten wie diesem importieren:

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

Offensichtlich ist das keine sehr schöne Lösung, also habe ich mich gefragt, ob es einen anderen Weg gibt. Ich kann die importierte Komponente anscheinend nicht direkt exportieren.

MoeSattler
quelle
Mögliches Duplikat von Importmodulen aus Dateien im Verzeichnis
Inanc Gumus

Antworten:

369

Sie können den Standardimport problemlos erneut exportieren:

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

Es gibt auch einen Vorschlag für ES7 ES8 , mit dem Sie schreiben können export Comp1 from '…';.

Bergi
quelle
2
Siehe auch ähnliche Muster hier und hier
Bergi
6
Zusätzlich zum ES8-Vorschlag können Sie die Codegenerierung verwenden, um Indexdateien zu verwalten. Schauen Sie sich github.com/gajus/create-index und github.com/ryardley/indexr an .
Gajus
@Bergi Also machen diese 3 Zeilen sowohl den Import als auch den Export? Oder wird nur exportiert, aber Sie müssen nicht mehr mit dem Namen Comp1_ usw. herumspielen?
Musikformellons
@musicformellons Sie exportieren direkt aus dem Modul, auf das verwiesen wird, ja.
Bergi
2
@amann Ein Zirkelverweis an sich ist nicht schlecht, kann aber je nach Funktionsweise des Moduls zu Problemen führen. Unabhängig davon denke ich, dass Sie dieses Muster nur in der Indexdatei Ihrer Bibliothek verwenden sollten, um alle Komponenten zu exportieren. Wenn Sie Abhängigkeiten zwischen Modulen haben, sollten Sie diese direkt importieren, anstatt das Teil aus dem großen zu importieren. Damit werden durch dieses Muster keine Zirkelverweise eingeführt.
Bergi
56

Denken Sie auch daran, dass Sie mehrere Funktionen gleichzeitig exportieren müssen, z. B. Aktionen, die Sie verwenden können

export * from './XThingActions';
GM
quelle
14
Ja. Leider werden hier nur benannte Exporte ausgeführt, dh der Standardexport wird nicht berücksichtigt.
ArneHugo
SyntaxError: Unexpected reserved wordHol mir ein (ziemlich irreführend ... hat einen Moment gedauert ) , @ Bergis akzeptierte Antwort funktioniert.
Frank Nocke
Sie können auch Ihren Standardexport benennen, um dieses Problem zu umgehen. Und Ihre Aktionen sollten eigentlich keinen Standardexport haben, damit diese Lösung gut funktioniert.
Barry Michael Doyle
2
Es wird empfohlen, keine Standardexporte in Javascript zu verwenden, da keine zusätzliche Syntax erforderlich ist. @ GM hat die beste Antwort auf diesen Thread für modernes Javascript.
Mibbit
39

Zu spät, aber ich möchte mitteilen, wie ich es löse.

Eine modelDatei mit zwei benannten Exporten haben:

export { Schema, Model };

und mit einer controllerDatei, die den Standardexport hat:

export default Controller;

Ich habe die indexDatei folgendermaßen belichtet :

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

export { Schema, Model, Controller };

und unter der Annahme, dass ich alle importieren möchte:

import { Schema, Model, Controller } from '../../path/';
Javier Aguila
quelle
Funktioniert dies, wenn Sie eine Funktion importieren und dann wieder exportieren? Ich habe es versucht, aber es war nicht so.
Aftab Naveed
Entschuldigung, es hat tatsächlich funktioniert, ich fehlte / auf meinem Weg.
Aftab Naveed
14

Einfach:

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

Oder nach Funktionsnamen:

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

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

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

pirs
quelle
1

Installation @babel/plugin-proposal-export-default-fromüber:

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

In Ihrem .babelrc.jsonoder einem der Konfigurationsdateitypen

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

Jetzt können Sie exportdirekt von einem file-path:

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

Viel Glück...

Akash
quelle
Wie mache ich das für Create-React-App ohne auszuwerfen?
Negin Basiri