2013-05-24 10 views
12

Ich schaue Nodejs/expressjs und habe verschiedene Tutorials verwendet entweder __diranme + "/my_folder", "./my_folder" oder nur "my_folder".Knoten js/Express js relative Pfade (Punkt oder __dirname oder ohne Präfix)?

Beispiele:

app.use("/static", express.static(__dirname + "/my_folder")); 
app.use("/static", express.static("./my_folder")); 
app.use("/static", express.static("my_folder")); 

Ich habe versucht, sie alle und sie alle zu funktionieren scheint; Welches sollte ich für relative Pfade verwenden?

Ich habe auch require('./my_file.js') und require('my_file') gesehen. Ist da ein Unterschied? Was soll ich verwenden?

+0

Ich glaube, dass die letzte Art der Definition von Standorten auf Windows brechen wird. Ich bin 90% mit '__dirname + '/ Ordner' ist der sicherste Ansatz (ohne konkrete Beweise, nur zufällige Erfahrung mit Knoten in Windows herumspielen). –

Antwort

15

Fast jede Funktion (außer require), die Dateipfade als Argument verwendet, wird an einem Punkt Funktionen aus dem fs-Modul verwenden, um von ihnen zu lesen oder zu schreiben.

Node.js documentation for fs module sagt:

Relativer Pfad zum Dateinamen verwendet werden kann, aber denken Sie daran, dass dieser Weg relativ sein process.cwd().

Wenn Sie darüber nachdenken, würde es große Tricks erfordern, dass sich diese Funktionen anders verhalten. Immerhin sind die fs-Funktionen normales Javascript und sie haben keinen speziellen Zugang zu Informationen über den Anrufer. Die einzigen __dirname, auf die sie zugreifen könnten, wären die __dirname ihres eigenen Moduls (das Kern-FS-Modul).

Die Tatsache, dass die require Funktion können resolve Pfade relativ zum aktuellen __dirname, ohne dass dies explizit spezifiziert, ist, weil require eine einzigartige Funktion für jede einzelne Datei ist es angezeigt wird. Auf diese Weise hat es Zugriff auf den aktuellen Modul Besonderheiten, und insbesondere seinen Weg.

Der Grund dafür, dass Ihr Code passiert, ist, dass zur Zeit der app.js (oder ähnlich) der obige Code zufällig in demselben Verzeichnis ist wie das, was process.cwd() derzeit ist. I.e. Starten der App mit node app.js würde funktionieren, beim Starten der App mit node myappdir/app.js (lief aus dem übergeordneten Verzeichnis) nicht. process.cwd() wäre anders.

Solange Sie bedenken, dass relative Pfade über aufgelöst werden, könnten Sie die kürzere Syntax verwenden. In manchen Fällen kann dies von Vorteil sein. Es macht Ihren Code abhängig davon, wie es heißt. Ich persönlich bevorzuge die Verwendung __dirname, weil es etwas transparenter ist, was passiert, und die relativen Pfade konsistent mit den Pfaden, die Sie in einer Anweisung für die gleiche Datei verwenden.

+0

Danke, sehr informativ. Also, wenn ich verstehe: 'require' wird immer relativ zur aktuellen Datei sein (mit' dot' oder '__dirname'). Alle anderen Pfade, die wahrscheinlich 'fs' durchlaufen, können relativ zum Prozess mit einem' dot' und relativ zur rufenden Datei sein, wenn sie mit '__dirname' übergeben werden. – Raekye

+1

Exactly. Aber '__dirname +" irgendein Pfad "ist nur normale String-Verkettung. Es ist eine besondere Art, eine Funktion oder so aufzurufen. Es ergibt sich ein absoluter Pfad, der keinen Raum für Interpretationen lässt. –

0

Ich benutze app.use(express.static(path.join(__dirname, 'public')));, die ich habe dann drei Ordner in meinen öffentlichen, Stylesheets, Javascripts und Bilder, die mir die statischen Dateien von

<link rel="stylesheet" href="/stylesheets/jquery-ui.css" /> 
    <script type="text/javascript" src="/javascripts/jquery-1.9.1.js"></script> 

den ./myfolder Ansatz, den ich glaube, im Wesentlichen für den Zugriff erlaubt ist das gleiche. Ich habe es nie benutzt.
die /myfolder Ansatz habe ich noch nie gesehen.

require('./my_file.js') I use as 
    require('./routes/my_file.js') aand is where I store all my express routes. 

Die require('myfile') ist ein Aufruf an Paketen, die Sie mit Express installieren oder kommen zu installieren.

4

Die __dirname Version die stabilste ist seit __dirname immer das Verzeichnis sein wird, die aktuell ausgeführten .js Datei enthält, die ein besserer Anker als "my_folder" oder "./my_folder" die beiden relativen Pfade und schlägt fehl, wenn der aktuelle Arbeitsverzeichnis des Prozesses (process.cwd()) ist etwas Unerwartetes, was durchaus möglich ist.

Beachten Sie, dass es für Pfade, die an require übergeben werden, eine andere Geschichte ist, da relative Pfade dort relativ zum Speicherort des aufrufenden Moduls aufgelöst werden, ohne Berücksichtigung des aktuellen Arbeitsverzeichnisses des Prozesses (das wiederum macht sie weniger anfällig).

+0

Für erforderlich, sollte ich die Erweiterung einschließen? Wie ich oft sehe 'require (__ dirname +"/etwas ")' aber warum nicht '(erfordern diandom +" /something.js ") (was scheint auch zu funktionieren)? – Raekye

+0

Bearbeiten: Gefunden 'Wenn der genaue Dateiname nicht gefunden wird, wird Knoten versuchen, den erforderlichen Dateinamen mit der hinzugefügten Erweiterung von .js, .json und dann .node zu laden.Auf den Dokumenten (verpasst es zuvor, fand es suchen für etwas anderes). So, jetzt weiß ich, wie es funktioniert, aber denken Sie, es ist eine gute Angewohnheit, explizit oder ... implizit zu sein (erinnert mich an Python xD) – Raekye

+0

Die Konvention ist kein Dateiname (implizit) und ich denke, das ist gut. Sie können auch von "module.js" zu "module/index.js" wechseln und Programme, die Ihre Bibliothek verwenden, müssen sich nicht darum kümmern oder aktualisiert werden. –