2015-02-01 9 views
5

Wrapping erfordern

3 Node.js Da Projekte Haupt - Rahmen - Repositorys

Haupt hat die beiden anderen Projekten verbunden über npm Link.

In einem Test habe ich die Anforderung in einer Methode verpackt. Ich habe einige Probleme bekam Lösung verknüpfte Projekte (Details siehe unten)

Simplified Code sieht wie folgt aus:

module.export.resolve = function(file){ 
[...]//Some more logik to handle relative pathes 
return require(file) 
} 

Dies funktioniert in den meisten Szenarien. Ich arbeitete auch raus behandelt mit Verwandten pathes (Suche nach Anrufer und pathes gilt auf diesem Weg basiert)

Nun ist dies in Projektrahmen der (NPM Link) verbunden ist, um Projekt Haupt. Project main hat auch Project Repositories verknüpft.

Jetzt in Projekt Haupt ich habe:

require('ProjectRepositories/foo') // Works as expected 
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo' 

Ich nehme an, das Problem ist, dass Repositorys Projekt ist nicht in dem Projekt Rahmen verknüpft. Aber gibt es einen anderen Weg als sie zu verbinden?

Ich hätte lieber weniger Abhängigkeiten. Irgendwelche Hinweise darauf?

+0

Es ist mir nicht ganz klar, wie Ihre Struktur aussieht. Könnten Sie das klären? Wusstest du inzwischen, dass du einen ['NODE_PATH'] (https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders) env var haben kannst? – gustavohenke

+0

Sie sagen "funktioniert wie erwartet", aber Sie sagen nicht, was es zurückgibt. Es könnte also dasselbe zurückkehren. Von dem, was Sie gepostet haben, tut es genau das gleiche, außer dass Sie zusätzliche Logik geschrieben haben, die möglicherweise etwas durcheinander bringen könnte, was importiert werden muss. Wenn Sie eine resolve2-Funktion erstellen, die 'require (file)' direkt zurückgibt, sollte es genauso gut funktionieren wie Ihr direkter 'require ('ProjectRepos/foo')' Aufruf. Dann würden Sie wahrscheinlich zu dem Schluss kommen, dass Ihre benutzerdefinierte Logik tatsächlich darin besteht, wo der Fehler liegt, nehme ich an. – EricG

Antwort

1

Sie sind absolut richtig, dass der Grund, warum der Projektrahmenresolve funktioniert nicht, weil die requireFn aus diesem Projekt verwendete nur die in diesem Rahmen installierte Module kennt. Dies liegt daran, wenn Sie eine JavaScript-Datei require eine Node wertet das Skript innerhalb der context des Moduls, und nicht den Kontext des aktuellen Projekts (so funktioniert Abhängigkeitsmodule 'require s, wenn von Ihrem Top-Level-Skript).

Was Sie können tun, bieten jedoch ist eine Möglichkeit für den Rahmen Resolver verwenden ein vom Benutzer angegebenen Funktion erfordern seine Arbeit zu tun, sobald sie die Pfade verändert hat. wird also jetzt Ihr Projekt Haupt erfordert verwendet

module.exports.resolve = function(file, resolver) { 
    //Some more logik to handle relative pathes 
    resolver = typeof resolver == 'function' ? resolver : require; 
    return resolver(file) 
} 

Jetzt in Ihrem Code, könnten Sie

myRequire.resolve('ProjectRepositories/foo', require); 

tun, um die Datei zu lösen.

Sie können auch einen Schritt weiter gehen, wenn Sie möchten, und das Modul muss Stateful sein und sich an den Resolver erinnern, den es verwenden soll.

var _requireFn = require; 

module.exports = { 
    resolve: resolve, 
    setRequireFn: setRequireFn 
}; 

function resolve(path) { 
    return _requireFn(path); 
} 

function setRequireFn(requireFn) { 
    _requireFn = requireFn; 
} 

Auf einer anderen Anmerkung, würde ich mich über die Verwendung des Begriffs resolve weil in Knoten vorsichtig sein, die für Nachschlagen des richtigen Dateipfad semantisch verwendet werden erforderlich sein, a la require.resolve.

Schließlich, in Bezug auf die Minimierung der Abhängigkeiten, würde ich empfehlen, Ihre Teilprojekte in Npm mit Github Repos. Das hat in der Vergangenheit ziemlich gut funktioniert, es sei denn, Ihre beiden Subrepos befinden sich in einem ständigen Wandel. Weitere Informationen finden Sie unter install docs.