exports und imports in JavaScript
Dauer: 30 Minuten
Ziel: import und export für Code-Organisation
JavaScript hat seit ECMAScript 2015 eine offizielle für import- und export-Anweisungen. Damit lassen sich JavaScript-Projekte auf mehrere Dateien aufteilen um eine übersichtliche Code-Struktur zu erhalten und z.B. Funktionen in anderen Dateien im Code zu verwenden. Somit können Funktionen oder Klassen in einer bestimmtem Datei deklariert und exportiert werden, um sie in einer anderen Datei zu importieren und dort zu verwenden.
In NodeJS gibt es mit CommonJS und exports/require
einen eigenen Ansatz für Import/Export von JavaScript-Code.
Mehr Infos zum Modulsystem in NodeJS sind in der Dokumentation zu Node JS beschrieben.
Vorbereitungen in replit und NodeJS
Um import
/export
in replit oder NodeJS verwenden
zu können, muss diese Funktionalität folgendermaßen
aktiviert werden:
- Falls noch nicht vorhanden, im Projektordner die Datei
package.json
erstellen:
- In replit.com sollte diese schon vorhanden sein.
- In NodeJS kann diese mit
npm init
erstellt werden.
- Die Datei
package.json
öffnen. - In
package.json
folgendes eintragen (z.B. nach dem Eintrag fürversion
):
// in package.json hinzufügen:
"type": "module",
Die Datei package.json
sollte dann z.B. so aussehenn:
{
"name": "myproject",
"version": "1.0.0",
"type": "module",
"description": "",
"main": "index.js",
// usw.
}
Das Komma am Ende der Zeile darf nicht fehlen!
"type": "module",
Exportieren (von Funktionen o.a.)
Nun kann z.B. in einer Datei util/computations.js
etwas exportiert werden:
// in util/computations.js
export function test1() { return 'TEST1'; };
export function test2() { return 'TEST2'; };
export default function test() { return 'TEST'; };
const myConstant = 1234;
export { myConstant };
Bei Funktionen kann also direkt vor function
mit export
angezeigt werden, dass diese Funktion
exportiert werden soll. Pro Datei (bzw. Modul) kann
es höchstens eine export default
-Anweisung geben.
Im obigen Beispiel werden drei Funktionen exportiert. Dies ist auch mit Klassen oder Konstanten möglich, wobei die Konstanten zunächst initialisiert und dann exportiert werden müssen, wie oben in den letzten zwei Zeilen zu sehen.
Importieren (von Funktionen o.a.)
Importiert werden die „normalen“ Exports durch
Angabe der Namen in geschweiften Klammen (hier
test2
und test3
). Der „Default“-Export kann
ohne geschweifte Klammern angegeben werden
(hier ist dies test
):
// z.B in index.js importieren:
import test, { test1, test2, myConstant } from './util/computations.js';
console.log(test());
console.log(test1());
console.log(test2());
console.log(myConstant);
Anstatt die importierenden Artefakte (Funktionen, Konstanten, usw.)
einzeln in geschweiften Klammern aufzulisten, ist es mit * as Name
möglich,
alle exportieren Artefakte unter einem qualifizierenden Namen (Name
)
zu importieren:
// z.B in index.js importieren:
import test, * as Comp from './util/computations.js';
console.log(test());
console.log(Comp.test1());
console.log(Comp.test2());
console.log(Comp.myConstant);
⟶ Hier stehen die „normalen“ Exports (ohne default
) alle
unter dem Namen Comp
zur Verfügung.
In React mit NextJS und in React Native werden
bei import
-Anweisungen die Dateiendungen .js
häufig weggelassen. In NodeJS hingegen müssen diese
normalerweise angegeben werden.
Mit dem Zusatz
--experimental-specifier-resolution=node
kann
NodeJS so gestartet werden, dass Dateiendungen bei
import
s automatisch hinzugefügt werden:
node --experimental-specifier-resolution=node index
Mehr dazu in der Dokumentation zu NodeJS.
Vertiefendes Material