2015-03-21 5 views
6

Wie kann ich alle Dateien in NodeJS wieWie kann ich Module mit Mustern im Pfad benötigen?

require('./packages/city/model/cities') 
require('./packages/state/model/states') 
require('./packages/country/model/countries') 

wie als

require('./packages/*/model/*') 

gleiche wie Grunzen Dateien geladen ist.

Antwort

4

Sie können nicht (oder zumindest sollte man nicht)

Um dies zu tun, würden Sie Knoten native require Funktion überladen müssen, was sehr nicht ratsam ist.

Das CommonJS-Muster mag Ihnen langweilig erscheinen, aber es ist ein sehr gutes und Sie sollten nicht versuchen, es zu brechen, nur weil Sie Verknüpfungen in anderen Sprachen/Frameworks gesehen haben.

Durch die Einführung einer Art von Magie in Ihrem Modul, ändern Sie plötzlich alles, was Programmierer können über das CommonJS-Muster selbst (und sollte in der Lage sein) sicher anzunehmen.

+0

Danke macek. – 9me

2

Aufgrund der Eins-zu-eins-Entsprechung im Ladesystem des Knotenmoduls ist dies nicht nativ möglich, würde aber nicht überrascht sein, wenn es ein Paket für diese Methode gibt.

Am besten erstellen Sie eine index.js, die im Verzeichnis vorhandene Module lädt und als eigene Datei exportiert.

module.exports = function() { 
    return { 
     city : require('./city/model/'), 
     state : require('./packages/state/model/'), 
     country : require('./packages/country/model/') 
    } 
} 

Sie müssten Modelle in ähnlicher Weise in allen drei Verzeichnissen auch laden.

Ich weiß, dass diese Lösung nicht das ist, was Sie suchen, aber in meiner Erfahrung ermöglicht diese Methode, benutzerdefinierte Pakete besser zu verwalten, da Sie Funktionen einfach hinzufügen/entfernen können.

1

Node.js des require können Sie

  1. Last nur ein Modul zu einer Zeit

  2. Lademodule nur in synchroner Weise.

So funktioniert das Modulsystem in Node.js. Aber wenn Sie minimatch Art passende Funktionalität haben wollen, können Sie eine auf Ihre eigene Rolle, wie diese

var path = require("path"), 
    glob = require("glob"); 

function requirer(pattern) { 
    var modules = {}, 
     files = glob.sync(pattern); 

    files.forEach(function(currentFile) { 
     var fileName = path.basename(currentFile); 
     fileName = fileName.substring(0, fileName.lastIndexOf(".js")); 
     modules[fileName] = require(currentFile); 
    }); 

    return modules; 
} 

Dies hängt von glob-Modul, das Sie minimatch Muster verwenden können Dateien suchen und dann benötigen wir die Gefundene Dateien, sie in einem Objekt speichern und das Objekt zurückgeben. Und dies kann wie dieser

var modules = requirer('./packages/*/model/*.js'); 
console.log(modules.cities); 

P. S verwendet werden: Ich arbeite diese bereits eine public module auf zu machen.

Verwandte Themen