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:

  1. Falls noch nicht vorhanden, im Projektordner die Datei package.json mit dem Terminalbefehl npm init erstellen.
  2. Die Datei package.json öffnen.
  3. In package.json folgendes eintragen (z.B. nach dem Eintrag für version):
// 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 imports automatisch hinzugefügt werden:

node --experimental-specifier-resolution=node index

Mehr dazu in der Dokumentation zu Node.js.