Ich kenne was, was Du nicht kennst: require-dir

Verzeichnisse sind ein probates Mittel, um Code in Namensräumen zu strukturieren. Doch was, wenn man ein komplettes Verzeichnis auf einmal laden möchte? Jede Datei einzeln zu laden ist aufwendig und mühsam. Das Modul require-dir schafft Abhilfe.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 3 Min.
Von
  • Golo Roden

Verzeichnisse sind ein probates Mittel, um Code in Namensräumen zu strukturieren. Doch was, wenn man ein komplettes Verzeichnis auf einmal laden möchte? Jede Datei einzeln zu laden ist aufwendig und mühsam. Das Modul require-dir schafft Abhilfe.

Um in einer in Node.js geschriebenen Anwendung eine Quellcodedatei zu laden, dient die require-Funktion: Ihr übergibt man den Namen der zu ladenden Datei und erhält im Anschluss das von der Datei exportierte Objekt zurück. Auf die Angabe der Dateiendung .js lässt sich dabei verzichten:

const calculator = require('./calculator');

Zerlegt man die Funktionalität in eigenständige Dateien, empfiehlt sich der Einsatz eines Verzeichnisses als gemeinsamer Namensraum. Ohne weiteres Zutun müssen dann natürlich an Stelle der ursprünglichen einzelnen Datei mehrere Dateien geladen werden:

const add = require('./calculator/add'),
divide = require('./calculator/divide'),
multiply = require('./calculator/multiply'),
subtract = require('./calculator/subtract');

Dabei verliert man allerdings die Möglichkeit, auf die verschiedenen Funktionen mihilfe eines gemeinsamen Objekts zugreifen zu können. Das lässt sich aber auf einfachem Weg nachbauen:

const calculator = {
add: require(.'/calculator/add'),
divide: require(.'/calculator/divide'),
multiply: require(.'/calculator/multiply'),
subtract: require(.'/calculator/subtract')
};
Mehr Infos

"Ich kenne was, was Du nicht kennst"

... ist eine gemeinsame Serie von Golo Roden und Philip Ackermann, in der die beiden regelmäßig Module für JavaScript und Node.js vorstellen.

Unschön an dem Vorgehen ist nicht nur, dass der Verzeichnisname wiederholt angegeben werden muss, sondern auch, dass es nicht auf einfache Art möglich ist, das komplette calculator-Objekt zu laden. Das wird besonders dann lästig, wenn das Objekt von mehreren verschiedenen Dateien geladen werden soll, da dann bei Änderungen stets mehrere Stellen im Code anzupassen sind.

Abhilfe schafft die Möglichkeit, dem Verzeichnis ./calculator eine index.js-Datei hinzuzufügen, die das Laden der einzelnen Dateien übernimmt und das Ergebnis als ein Objekt exportiert:

'use strict';

const calculator = {
add: require('./add'),
add: require('./divide'),
add: require('./multiply'),
add: require('./subtract'),
};

module.exports = calculator;

Von außerhalb lässt sich der komplette Namensraum nun laden, indem man die Datei index.js referenziert:

const calculator = require('./calculator/index');

Praktischerweise wertet Node.js den Dateinamen index.js als Spezialfall, sodass er entfallen kann. Enthält ein Verzeichnis also eine Datei index.js, lässt sich das Verzeichnis direkt laden – ganz so, als ob es eine Datei wäre:

const calculator = require('./calculator');

Der Zugriff von Außen erfolgt nun auf dem gewünschten Weg, doch das Aufzählen aller zu ladenden Dateien Innerhalb der Datei index.js ist aufwendig und mühsam. Praktisch wäre, alle Dateien eines Verzeichnisses auf einmal laden und als Objekt exportieren zu können.

Dabei gilt es allerdings, die Datei index.js auszuschließen, schließlich soll das exportierte calculator-Objekt keine index-Eigenschaft enthalten.

Genau das erledigt das Modul require-dir, das sich in der Datei index.js leicht einbinden lässt:

'use strict';

const requireDir = require('require-dir');

const calculator = requireDir();

module.exports = calculator;

Eliminiert man die verschiedenen Zwischenvariablen, erhält man eine kompakte index.js, die sich ohne Anpassungen in jedem Verzeichnis wiederverwenden lässt:

'use strict';

module.exports = require('require-dir')();

tl;dr: Um alle Dateien aus einem Verzeichnis zu laden, empfiehlt sich der Einsatz einer index.js-Datei in Verbindung mit dem Modul require-dir, um nicht alle untergeordneten Dateien von Hand integrieren zu müssen. ()