2017-05-19 11 views
0

Bear mit mir, wie ich Sie durch den Prozess führen, die meine Frage ausgelöst.Sind JavaScript-Klassen akzeptabel? Knotenmodule?

ich auf einer CLI-Anwendung in Knoten gerade arbeite und ich bin mit Objekten meiner Business-Logik mit diesem Muster kapseln:

// my-project/lib/widget/myobject.js 

var MyObject = function(x) { 
    this.x = x; 
}; 

MyObject.prototype.getX = function() { 
    return this.x; 
}; 

module.exports = MyObject; 

Ich teste auch diese Objekte:

// my-project/test/lib/widget/myobject.spec.js 

var MyObject = require('../../../lib/widget/myobject.js'); 

describe('MyObject', function() { 
    ... 
}); 

An einer Stelle war ich mit der Namens- und Verzeichnisstruktur, die ich gewählt hatte, unzufrieden. Ich fand mich mühsam diese Elternverzeichnis Referenzen (..) in mehreren Spec-Dateien beim Umschreiben der relativen Pfade. Ich dachte, dass es einen einfacheren Weg geben muss, auf ein Wurzelverzeichnis zu verweisen, das diese Objektdefinitionen enthält.

Eine der Empfehlungen, die ich fand, here schlug vor, "anwendungsspezifische Module in node_module" zu setzen.

Nun, wie ich Module verstehe, sind sie die Pakete, die ich von Npm herunterladen und in meinem Projekt verwenden. Sie enthalten Bibliotheken von nützlichen Dingen mit einer einzigen API, die zu mir exportiert wird, wenn ich require anrufe. So sehe ich nicht die einfachen Einzweckklassen, die speziell für die interne Verwendung meiner Anwendung erstellt wurden.

Wenn Sie so weit bei mir stecken geblieben sind, danke! Hier ist meine Frage:

Wie mache ich die Interna meiner Anwendung "modularer", so dass es richtig die Absicht des Node-Modulsystems folgt, während objektorientiert bleibt?

+0

Im Knoten beim Arbeiten mit Objekten werde ich sie normalerweise nur aus einem Asset-Ordner speichern und importieren. Vieles davon hängt von der Präferenz, den Build-Tools und der Bereitstellung ab, die außerhalb meines Fachwissens liegen. Die node_modules-Methode oder mehr oder weniger nur ein Asset-Ordner, in dem Sie statische Assets importieren können, und würde gut funktionieren (aber ich würde nicht empfehlen, npm Assets mit Ihren eigenen persönlich gebauten zu mischen). –

+0

Sie haben Recht, es ist wie ein statischer Asset-Ordner, aber es hat den zusätzlichen Vorteil, dass es ein Standard-Ort ist, an dem Node nach Modulen sucht. Das ist der Ausschlag für mich. Ich würde require ('myobject') anstelle von require ('../../../ lib/widget/myobject.js') verwenden. Meine Befürchtung ist genau das, was Sie als nächstes erwähnt haben: öffentliche Module mit privaten zu mischen. Das hat meine Frage ausgelöst. Ich frage im Grunde: "Mache ich das richtig? Oder gibt es eine andere Konvention, die mit diesen Objekten sinnvoller ist?" Mischen fühlt sich wirklich klatschig an. – jkeeler

Antwort

0

Ich bin mir nicht sicher, wie geeignet diese für die Produktion oder für Module, die Sie auf der Verteilung, sondern in der Hauptdatei planen könnten Sie hinzufügen:

process.env.NODE_PATH = __dirname; 
require('module').Module._initPaths(); 

, die Sie immer Module benötigen relativ zu dem Ordner lassen würde enthält Ihre Hauptdatei. I.e. Wenn Sie eine Datei in haben:

library/some_file.js 

dann in tests/some_other_file.js könnten Sie einfach tun:

require('library/some_file'); 

Oder als Alternative Sie dies in Ihrer Hauptdatei hinzufügen könnten:

global.__base = __dirname + '/'; 

und dann in Ihren anderen Modulen benötigen Sie:

var MyObject = require(__base + 'my-project/lib/widget/myobject'); 
+0

Ja! Ich habe diese Lösungen auch gefunden.Ich habe sofort die Lösung NODE_PATH aufgrund einer Aussage in der Verbindung, die ich zur Verfügung gestellt habe, abgezinst: "Knoten und browserisieren beide, unterstützen aber die Verwendung von $ NODE_PATH." – jkeeler

+0

(Korrigieren Sie mich, wenn ich falsch liege.) Ich denke auch nicht, dass diese Lösung mit meinem Testläufer funktioniert. Da die Spezifikationsdatei nur die js-Datei mit der Klassendefinition benötigt, bekomme ich den Pfad, der von main.js endet, nicht. – jkeeler

Verwandte Themen