exports und imports in JavaScript
Dauer: 30 Minuten
Ziel: import und export für Code-Organisation
JavaScript hat seit ECMAScript 2015 eine offizielle Syntax 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 Node.js gibt es mit CommonJS und require/exports
einen eigenen Ansatz für die modulare Aufteilung von
JavaScript-Code.
Jedoch ist import
/export
der
Standard-Modulmechanismus von JavaScript, der sich
inzwischen weitläufig gegenüber require
durchgesetzt hat.
Mehr Infos zum Modulsystem in Node.js sind in der Dokumentation zu Node JS zu finden.
Vorbereitungen in Node.js
Um import
/export
in Node.js verwenden
zu können, muss diese Funktionalität folgendermaßen
aktiviert werden:
- Falls noch nicht vorhanden, im Projektordner die
Datei
package.json
mit dem Terminalbefehlnpm init
erstellen. - 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'; };
export const myConstant = 1234;
Mit export
wird angezeigt, dass z.B. eine Funktion
oder Konstante exportiert werden soll. Pro Datei (bzw.
Modul) kann es höchstens eine export default
-Anweisung geben.
Im obigen Beispiel werden drei Funktionen und eine Konstante exportiert. Die Funktion test
ist der
„Default-Export“.
Importieren (von Funktionen o.a.)
Importiert werden die „normalen“ Exports durch
Angabe der Namen in geschweiften Klammen (hier
test2
, test3
und myConstant
).
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 zu 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 (außer dem „Default-Export“!) allesamt
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 Node.js hingegen müssen diese
normalerweise angegeben werden.
Mit dem Zusatz
--experimental-specifier-resolution=node
kann
Node.js so gestartet werden, dass Dateiendungen bei
import
s automatisch hinzugefügt werden:
node --experimental-specifier-resolution=node index
Mehr dazu in der Dokumentation zu Node.js.
Vertiefendes Material