Es gibt verschiedene Möglichkeiten, dies zu erreichen, jede mit ihren eigenen Vor- und Nachteilen:
require.main.filename
Von http://nodejs.org/api/modules.html :
Wenn eine Datei direkt vom Knoten ausgeführt wird, require.main
wird sie auf ihre gesetzt module
. Das heißt, Sie können durch Testen feststellen, ob eine Datei direkt ausgeführt wurderequire.main === module
Da module
eine filename
Eigenschaft bereitgestellt wird (normalerweise äquivalent zu __filename
), kann der Einstiegspunkt der aktuellen Anwendung durch Überprüfen erhalten werden require.main.filename
.
Wenn Sie also das Basisverzeichnis für Ihre App möchten, können Sie Folgendes tun:
var path = require('path');
var appDir = path.dirname(require.main.filename);
Für und Wider
Dies funktioniert die meiste Zeit hervorragend, aber wenn Sie Ihre App mit einem Launcher wie pm2 ausführen oder Mokka- Tests ausführen, schlägt diese Methode fehl.
global.X
Der Knoten hat ein globales Namespace-Objekt namens global
- alles, was Sie an dieses Objekt anhängen, ist überall in Ihrer App verfügbar. Sie können also in Ihrer index.js
(oder wie auch app.js
immer Ihre Haupt-App-Datei benannt ist) einfach eine globale Variable definieren:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
Für und Wider
Funktioniert konsistent, aber Sie müssen sich auf eine globale Variable verlassen, was bedeutet, dass Sie Komponenten / etc. Nicht einfach wiederverwenden können.
process.cwd ()
Dies gibt das aktuelle Arbeitsverzeichnis zurück. Nicht zuverlässig überhaupt, da es völlig abhängig ist, was Verzeichnis der Prozess gestartet wurde aus :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
App-Root-Pfad
Um dieses Problem zu beheben, habe ich ein Knotenmodul namens app-root-path erstellt . Die Verwendung ist einfach:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
Das App-Root-Path- Modul verwendet verschiedene Techniken, um den Root-Pfad der App zu bestimmen, wobei global installierte Module berücksichtigt werden (z. B. wenn Ihre App ausgeführt wird /var/www/
, das Modul jedoch installiert ist ~/.nvm/v0.x.x/lib/node/
). Es wird nicht 100% der Zeit funktionieren, aber es wird in den meisten gängigen Szenarien funktionieren.
Für und Wider
Funktioniert in den meisten Fällen ohne Konfiguration. Bietet auch einige nette zusätzliche Komfortmethoden (siehe Projektseite). Der größte Nachteil ist, dass es nicht funktioniert, wenn:
- Sie verwenden einen Launcher wie pm2
- UND , das Modul ist nicht im
node_modules
Verzeichnis Ihrer App installiert (z. B. wenn Sie es global installiert haben).
Sie können dies umgehen, indem Sie entweder eine APP_ROOT_PATH
Umgebungsvariable festlegen oder .setPath()
das Modul aufrufen. In diesem Fall ist es jedoch wahrscheinlich besser, die global
Methode zu verwenden.
Umgebungsvariable NODE_PATH
Wenn Sie nach einer Möglichkeit suchen , den Stammpfad der aktuellen App zu ermitteln , funktioniert eine der oben genannten Lösungen wahrscheinlich am besten für Sie. Wenn Sie andererseits versuchen, das Problem des zuverlässigen Ladens von App-Modulen zu lösen, empfehle ich dringend, die NODE_PATH
Umgebungsvariable zu untersuchen.
Das Modulsystem von Node sucht an verschiedenen Orten nach Modulen. Einer dieser Orte ist überall dort, wo process.env.NODE_PATH
Punkte liegen . Wenn Sie diese Umgebungsvariable festlegen, können Sie require
Module mit dem Standardmodullader ohne weitere Änderungen erstellen.
Zum Beispiel, wenn Sie setzen NODE_PATH
auf /var/www/lib
, die folgende würde gut funktionieren:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
Eine gute Möglichkeit, dies zu tun, ist die Verwendung von npm
:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
Jetzt können Sie Ihre App mit starten npm start
und Sie sind golden. Ich kombiniere dies mit meinem Enforce-Node-Path- Modul, das verhindert, dass die App versehentlich ohne NODE_PATH
Set geladen wird . Weitere Informationen zur Durchsetzung von Umgebungsvariablen finden Sie unter checkenv .
Ein Gotcha: NODE_PATH
muss seinen Satz außerhalb des Knotens App. Sie können so etwas nicht tun, process.env.NODE_PATH = path.resolve(__dirname)
da der Modullader die Liste der Verzeichnisse zwischenspeichert, die durchsucht werden, bevor Ihre App ausgeführt wird.
[hinzugefügt am 06.04.16] Ein weiteres wirklich vielversprechendes Modul, das versucht, dieses Problem zu lösen, ist wellig .