2013-03-20 4 views
7

Ich bin neu bei Node, aber ich genieße es bisher. Ich habe versucht, mein node_modules (Bibliotheken) Verzeichnis außerhalb der öffentlichen "Webroot" zu verschieben und brauche Beratung und Anleitung.Kann ich das npm node_modules-Verzeichnis außerhalb meines "Webroot" setzen?

Ich habe mein Setup einfach expressJS basierte Knoten Projekt wie folgt:

/my_project 
    /config 
    /public   
    /node_modules 
    server.js 

ich mich gefragt, ob es irgendeine Art und Weise war ich die /node_modules dir außerhalb meines Webroot haben könnte und nicht meine Anwendung brechen. Ich bin nur so daran gewöhnt, das Nötigste in meiner öffentlich zugänglichen Webroot zu halten und fühle mich nicht richtig mit den libs da drin. Nenn mich altmodisch, aber so bin ich es gewohnt, Sachen in der PHP- und C# -Welt zu machen.

Wenn ich ein Setup das Projekt wie folgt:

/my_project 
    /config 
    /node_modules 
    /public   
    server.js 

dann geht alles wackelig und require() Magie bricht der Knoten.

Ich habe folgendes versucht:

var express=require('../express');, die nicht entweder die ‚Find-Modul kann nicht‘ Typen Fehler gibt mir nicht funktioniert.

  1. Ist das, was ich fragen, auch möglich, wenn ja, wie?
  2. Gibt es irgendwelche größeren Risiken, wenn ich meine libs in einem Webroot habe, oder habe ich hier etwas Grundlegendes mit der Funktionsweise von Node verpasst?
  3. Was machen Sie, was ist die beste Praxis für Produktions-Apps? Darf ich einige Beispiele Ihrer Produktionspraktiken und warum.
+0

'var express = require ('../ node_modules/express');' scheint zu funktionieren. Es scheint jedoch ein wenig klobig. Ich bin immer noch sehr daran interessiert, was Sie als Best Practice bezeichnen. –

+2

erfordern ('Express') sollte immer noch funktionieren. Siehe [diese handliche Post] (http://www.bennadel.com/blog/2169-Where-Does-Node-js-And-Require-Look-For-Modules-.htm). Vor allem dieser Teil: "Wenn das angegebene Modul kein Kernmodul ist, sucht Node.js nach einem Verzeichnis namens 'node_modules'. Es wird im aktuellen Verzeichnis (relativ zur aktuell ausgeführten Javascript-Datei in Node) gestartet) und dann in der Ordnerhierarchie nach oben arbeiten und jede Ebene für einen Ordner node_modules überprüfen. " Es scheint also, dein Problem ist woanders. –

+2

Nebenbei bemerkt, ist es im Knoten üblich, Dateien zu platzieren, auf die von Clients in/public zugegriffen werden kann. server.js sollte wahrscheinlich nicht sein. –

Antwort

4

1. Ist es möglich, Module außerhalb des Projekts in einem Ordner zu haben

Ja.

2. Gibt es große Risiken bei Modulen in einer Webroot?

Angenommen, Sie durch "Webroot" bedeuten im Stammverzeichnis des Servers oder eines anderen Ordners außerhalb Ihres Projekts: ja. Es ist möglich, Module global mit npm unter Verwendung des g-Flags zu installieren: npm install -g express. Dies wird allgemein als schlechte Praxis angesehen, da verschiedene Projekte von verschiedenen Versionen desselben Moduls abhängen können. Durch die lokale Installation können verschiedene Projekte unterschiedliche Versionen haben.

Wenn Sie die Versionskontrolle verwenden und die externen Module nicht einchecken möchten, ignorieren Sie ein gemeinsames Muster (und Standard in npm) ./node_modules und geben Abhängigkeiten in einer Datei an.

3. "Was ist Best Practice für Produktion apps?"

Nicht so gut für SO, aber da ich schon dabei bin werde ich es trotzdem versuchen.Wenn Sie grunt (ein sehr beliebtes Aufgabe Automatisierungs-Tool) verwenden, werden Sie in der Regel mit einer Struktur am Ende wie folgt:

/my_project 
    /node_modules 
    /lib 
    # actual project files 
    /public 
     # files that are meant to be sent to clients 
    /test 
    package.json # specifies dependencies, main script, version etc 
    README.md # optional 

Diese Struktur hat die Vorteile klar zu trennen Core-Dateien, Abhängigkeiten und alle Tests, während sie alle halten im selben Ordner.

+0

Danke Andreas, ich werde mal grunzen. –

+1

Einige Punkte zu beachten. Wenn Sie Module neben einem einzelnen Projekt speichern, können die Dateipfade möglicherweise das 255-Zeichen-Limit von Windows überschreiten. Dies war der Hauptgrund, sie auf einer höheren Verzeichnisebene zu speichern, siehe hier: http://stackoverflow.com/questions/13318364/how-to-deploy-node-js-application-with-deep-node-modules-structure -on-Windows. Darüber hinaus gibt es Nachteile, wenn du deine Module nicht eincheckst, ein Update auf 'imagemin' hat meinen Buildprozess einmal unterbrochen. http://stackoverflow.com/questions/11459475/should-i-check-in-node-modules-to-git-when-creating-a-node-js-app-on-heroku –

+1

@AdamMarshall Ja, ich nehme an, mit 'npm shrinkwrap' ist eine gute Übung neben nicht einchecken node_modules –

Verwandte Themen