it-swarm.com.de

Knoten js/Express js relative Pfade (Punkt oder __Verzeichnisname oder ohne Präfix)?

Ich schaue auf Nodejs/expressjs und habe verschiedene Tutorials gesehen, die entweder __diranme + "/my_folder", "./my_folder" oder nur "my_folder" verwenden.

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 sie alle ausprobiert und sie scheinen alle zu funktionieren. 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 benutzen?

13
Raekye

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

Node.js Dokumentation für das Modul fs sagt:

Relativer Pfad zu Dateiname kann verwendet werden. Denken Sie jedoch daran, dass dieser Pfad relativ zu process.cwd () ist.

Wenn Sie darüber nachdenken, ist ein großer Trick erforderlich, wenn sich diese Funktionen anders verhalten sollen. Schließlich sind die fs-Funktionen normales Javascript und sie haben keinen besonderen Zugriff auf Informationen über den Anrufer. Der einzige __dirname, auf den sie zugreifen könnten, wäre der __dirname ihres eigenen Moduls (des fs-Kernmoduls).

Die require-Funktion can kann Pfade relativ zum aktuellen __dirname auflösen, ohne dies explizit anzugeben, da require für jede einzelne Datei, in der sie erscheint, eine eindeutige Funktion ist. Auf diese Weise hat sie Zugriff auf die aktuelle Besonderheiten des Moduls und insbesondere dessen Pfad.

Der Grund dafür, dass Ihr Code funktioniert, ist, dass der app.js (oder ein ähnlicher Code), in dem der obige Code angezeigt wird, sich in demselben Verzeichnis befindet wie das, was derzeit process.cwd() ist. Das heißt Das Starten der App mit node app.js würde funktionieren, während das Starten der App mit node myappdir/app.js (aus dem übergeordneten Verzeichnis ausgeführt) nicht möglich wäre. process.cwd() wäre anders.

Solange Sie daran denken, dass relative Pfade über process.cwd() aufgelöst werden, können Sie die kürzere Syntax verwenden. In manchen Fällen kann dies von Vorteil sein. Es macht Ihren Code jedoch davon abhängig, wie er aufgerufen wird. Ich persönlich bevorzuge die Verwendung von __dirname, da dies etwas transparenter ist und die relativen Pfade konsistent mit den Pfaden sind, die Sie in einer require-Anweisung für dieselbe Datei verwenden.

15
Myrne Stol

Die __dirname-Version ist die robusteste, da __dirname immer das Verzeichnis ist, das die aktuell ausgeführte .js-Datei enthält. Dies ist ein besserer Anker als "my_folder" oder "./my_folder", die beide relative Pfade sind und fehlschlagen, wenn das aktuelle Arbeitsverzeichnis des Prozesses (process.cwd()) etwas Unerwartetes ist das ist durchaus möglich.

Beachten Sie, dass dies eine andere Geschichte für Pfade ist, die an require übergeben werden, da relative Pfade relativ zum Speicherort des aufrufenden Moduls ohne Rücksicht auf das aktuelle Arbeitsverzeichnis des Prozesses aufgelöst werden (dies wiederum macht sie weniger anfällig).

4
Peter Lyons

Ich benutze app.use(express.static(path.join(__dirname, 'public')));, die ich dann in meinem public drei Ordner habe, Stylesheets, Javascripts und Images, wodurch ich auf diese statischen Dateien zugreifen kann 

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

der ./myfolder-Ansatz ist meines Erachtens im Wesentlichen dasselbe. Ich habe es noch nie benutzt.
den /myfolder-Ansatz, den ich noch nie gesehen habe.

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

require('myfile') ist ein Aufruf von Paketen, die Sie mit express installieren oder installieren.

0
Four_lo