Mit ES6 kann ich mehrere Exporte aus einer Datei wie dieser importieren:
import {ThingA, ThingB, ThingC} from 'lib/things';
Ich mag jedoch die Organisation, ein Modul pro Datei zu haben. Am Ende habe ich folgende Importe:
import ThingA from 'lib/things/ThingA';
import ThingB from 'lib/things/ThingB';
import ThingC from 'lib/things/ThingC';
Ich würde gerne dazu in der Lage sein:
import {ThingA, ThingB, ThingC} from 'lib/things/*';
oder etwas Ähnliches, mit der verstandenen Konvention, dass jede Datei einen Standardexport enthält und jedes Modul den gleichen Namen wie seine Datei hat.
Ist das möglich?
javascript
ecmascript-6
es6-modules
Frambot
quelle
quelle
lib/math
befindet sich eine Datei, die mehrere Exporte enthält. In meiner Fragelib/math/
ist ein Verzeichnis mit mehreren Dateien, die jeweils einen Export enthalten.Antworten:
Ich denke nicht, dass dies möglich ist, aber afaik die Auflösung von Modulnamen hängt von den Modulladern ab, so dass es möglicherweise eine Loader-Implementierung gibt, die dies unterstützt.
Bis dahin könnten Sie eine Zwischen- "Moduldatei" verwenden
lib/things/index.js
, die nur enthältund es würde dir erlauben zu tun
quelle
index.js
indem ich aussah wie :import ThingA from 'things/ThingA'; export {ThingA as ThingA}; import ThingB from 'things/ThingB'; export {ThingB as ThingB};
. Andere Beschwörungsformelnindex.js
würden sich nicht rühren.export * from
sollte funktionieren. Hast du es versucht…from './ThingA'
oderexport ThingA from …
? Welchen Modullader verwenden Sie?Nur eine Variation des Themas, das bereits in der Antwort enthalten ist, aber wie wäre es damit:
In a
Thing
,In
things/index.js
,Dann, um alle Dinge woanders zu konsumieren,
Oder um nur einige Dinge zu konsumieren,
quelle
index.js
für mich nicht auf. Ich benutze SystemJs + Babelexport ThingA from './ThingA'
stattexport {default as ThingA} from './ThingA'
Die aktuellen Antworten deuten auf eine Problemumgehung hin, aber es nervt mich, warum dies nicht existiert. Deshalb habe ich ein
babel
Plugin erstellt, das dies tut.Installieren Sie es mit:
dann füge es deinem hinzu
.babelrc
mit:Ausführliche Informationen zur Installation finden Sie im Repo
Dies ermöglicht Ihnen Folgendes:
Auch hier enthält das Repo weitere Informationen darüber, was genau es tut. Auf diese Weise wird jedoch das Erstellen von
index.js
Dateien vermieden, und dies geschieht auch zur Kompilierungszeit, um zu vermeiden, dassreaddir
s zur Laufzeit ausgeführt wird.Auch mit einer neueren Version können Sie genau wie in Ihrem Beispiel vorgehen:
funktioniert genauso wie oben.
quelle
./lib/things;
und diese nicht erfasst wird. Die Probleme, die es verursacht, sind lächerlich. Ich habe gerade eine Situation erlebt, in der das Ändern der Datei mitimport *
make babel die aufgenommene Datei aufnimmt, aber das Zurücksetzen bringt das Problem zurück, als würde der Cache vor der Änderung wiederverwendet. Mit Vorsicht verwenden.~/.babel.json
der dieses seltsame Verhalten verursacht. Auch wenn Sie wie ein Watcher oder ein Hot Reloader verwenden, müssen Sie die neue Datei speichern, damit sie mit der neuen Verzeichnisliste neu kompiliert wirdbpwc clear-cache
Sie hinzu, da Webpack und andere Build-Prozesse immer noch stillschweigend zwischengespeichert werdenGroßartige Gugly Muglys! Das war schwieriger als es sein musste.
Exportieren Sie eine flache Standardeinstellung
Dies ist eine großartige Gelegenheit, Spread zu verwenden (
...
siehe{ ...Matters, ...Contacts }
unten:So führen Sie babel kompilierten Code über die Befehlszeile aus (vom Projekt root /):
Exportieren Sie einen baumartigen Standard
Wenn Sie Eigenschaften lieber nicht überschreiben möchten, ändern Sie:
Und die Ausgabe wird sein:
Exportieren Sie mehrere benannte Exporte ohne Standard
Wenn Sie sich DRY widmen, ändert sich auch die Syntax der Importe:
Dadurch werden 2 benannte Exporte ohne Standardexport erstellt. Dann ändern Sie:
Und die Ausgabe:
Importieren Sie alle benannten Exporte
Beachten Sie die Destrukturierung
import { Matters, Contacts } from './collections';
im vorherigen Beispiel.In der Praxis
Angesichts dieser Quelldateien:
Das Erstellen eines
/myLib/index.js
zum Bündeln aller Dateien hat keinen Zweck zum Importieren / Exportieren. Es wäre einfacher, alles global zu machen, als alles global durch Import / Export über index.js "Wrapper-Dateien" zu machen.Wenn Sie eine bestimmte Datei möchten,
import thingA from './myLib/thingA';
in Ihren eigenen Projekten.Das Erstellen einer "Wrapper-Datei" mit Exporten für das Modul ist nur dann sinnvoll, wenn Sie für npm oder in einem mehrjährigen Multi-Team-Projekt packen.
Bis hierher geschafft? Weitere Informationen finden Sie in den Dokumenten .
Außerdem unterstützt Stackoverflow endlich drei als Code-Zaun-Markup.
quelle
Sie können async import () verwenden:
und dann:
quelle
Ähnlich wie bei der akzeptierten Frage, aber Sie können skalieren, ohne jedes Mal, wenn Sie eines erstellen, ein neues Modul zur Indexdatei hinzufügen zu müssen:
./modules/moduleA.js
./modules/index.js
./example.js
quelle
./example.js
Ich habe sie einige Male verwendet (insbesondere zum Erstellen massiver Objekte, die die Daten auf viele Dateien aufteilen (z. B. AST-Knoten)). Um sie zu erstellen, habe ich ein winziges Skript erstellt (das ich gerade zu npm hinzugefügt habe, damit alle anderen kann es benutzen).
Verwendung (derzeit müssen Sie babel verwenden, um die Exportdatei zu verwenden):
Erzeugt eine Datei mit:
Dann können Sie einfach die Datei verbrauchen:
quelle
\` instead of
/) also as an improvment you may want to allow two options like
--Dateiname` &&--dest
, um das Anpassen zu ermöglichen, wo die erstellte Datei gespeichert werden soll und unter welchem Namen. Funktioniert auch nicht mit Dateinamen, die.
(wieuser.model.js
) enthaltenNur eine andere Herangehensweise an @ Bergis Antwort
Verwendet
quelle
export '...' was not found in '....
.Sie können auch erfordern:
Verwenden Sie dann Ihren moduleHolder mit dynamisch geladenen Controllern:
quelle
Dies ist nicht genau das, wonach Sie gefragt haben, aber mit dieser Methode kann ich
componentsList
meine anderen Dateien durchlaufen und Funktionen verwenden, wiecomponentsList.map(...)
ich sie ziemlich nützlich finde!quelle
Wenn Sie ein Webpack verwenden. Dadurch werden Dateien automatisch importiert und als API- Namespace exportiert .
Sie müssen also nicht bei jedem Hinzufügen von Dateien aktualisieren.
Für Typescript-Benutzer;
quelle
Ich konnte den Ansatz von Benutzer atilkan übernehmen und ein wenig ändern:
Für Typescript-Benutzer;
quelle
Wenn Sie nicht standardmäßig in A, B, C exportieren, sondern nur {} exportieren, ist dies möglich
quelle
./thing
) und selbst wenn es vorhanden wäre, würde es nicht funktionieren. (Ich habe es versucht, und es hat nicht funktioniert.)