2017-07-13 37 views
1

Ich bevorzuge es, Abhängigkeiten ohne viele relative Dateisystemnavigation wie ../../../foo/bar zu importieren.Vermeidung relativer Require-Pfade in Node.js

Im Front-End habe ich RequireJS traditionell verwendet, um einen Standard-Basispfad zu konfigurieren, der eine "absolute" Pfadangabe ermöglicht, z. myapp/foo/bar.

Wie kann ich dies in Node.js erreichen?

+0

Wäre es nicht funktionieren, erstellen Sie Ihren eigenen Wrapper in der Indexdatei? Require? –

+0

Ja, das könnte funktionieren - gute Idee! Aber ich frage mich, ob es etwas eingebaut ist (eine Konfigurationsoption zum Beispiel). – Ben

+0

Soweit ich weiß - nein. Ich habe es nirgendwo gesehen. –

Antwort

1

Was Sie tun können, ist require.main.require, die immer der Modulpfad der Startdatei wäre. Siehe https://nodejs.org/api/modules.html#modules_accessing_the_main_module

Das bedeutet, dass, wenn Sie

const x = require.main.require('some/file/path/y')

laufen Es wäre es Datei auf der Grundlage der Basispfad des Ausgangs erfordern (das wurde aufgerufen, node app.js die app.js Datei Bedeutung).

Andere Optionen umfassen die Verwendung von , um den Startpfad Ihrer App abzurufen. Dies hängt jedoch davon ab, wo Sie den Knotenprozess aufrufen, nicht vom Speicherort der Datei. Bedeutung, node app.js wäre anders als von Ihnen würde es eine Ebene höher starten, node src/app.js.

+0

Vielen Dank. Ich habe festgestellt, dass die relative Pfadangabe fehleranfällig ist und am Front-End schwierig zu verwalten ist (ich finde es schwierig, viele "../" zu analysieren. Wie vermeidet man diese Art von Problemen im Backend? Oder ist das a Kein Problem für Sie – Ben

+0

Niemals wirklich ein Problem damit, wenn Sie sich nicht um Dateien bewegen, sind die relativen Pfade in node.js statisch, da sie immer relativ zu der Datei sind, die das 'require' aufruft Sicher, wie erforderlich Dateien im Webkontext laden, aber ein Skript-Tag ist immer relativ zum aktuellen HTML-Dokument, wenn Sie also ein Skript-Tag zum Laden einer js-Datei injizieren, ist es nicht relativ zu der js-Datei, die die Injektion durchführt von – jishi

+0

Ich hatte zwar Anwendungsfälle für das require.main.require, aber das war eigentlich von einem Knoten-Modul, das nach einer Konfiguration aus dem App-Stammordner suchen wollte, was sehr spezifisch ist Anwendungsfall (und wahrscheinlich die meiste Zeit entmutigt). – jishi

1

einfach auf die andere Antwort hinzufügen möchten, können Sie diese Zeilen in Ihrer Hauptdatei setzen:

(function (module) { 
    let path = require('path') 
    let __require = module.constructor.prototype.require 
    let __cpath = __dirname 

    module.constructor.prototype.require = function (str) { 
    if (str.startsWith('package:')) { 
     let package = str.substr(8) 
     let p = path.resolve(__dirname, package) 

     return __require(p) 
    } else { 
     return __require(str) 
    } 
    } 
})(module) 

Es erweitert Ihren require in einer solchen Art und Weise:

  • wenn Pfad beginnt mit package: (dh package:src/foo/bar) übersetzt es in require('/absolute/path/to/your/app/src/foo/bar'),
  • wenn es nicht mit package: beginnt, dann verhält es sich wie eine normale require würde.