Lassen Sie uns sagen, dass ich ein Bibliotheksmodul haben, der wie folgt aussieht:Pass-Funktionen in einem vm Skript Kontext
module.exports = {
increment: function() {
count++;
}
}
Und ich möchte es in einem dynamisch generierte Skript verwenden, die wie folgt aussieht:
(function() { lib.increment(); })();
, indem sie es in einer Sandbox vorbei:
var sandbox = {
count: 1
lib: require('./lib')
}
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
Das offensichtliche Problem, das ich in laufen, ist, dass ich auf der einen Seite kann nicht requ ire "lib" weil "count" nicht in lib.js definiert ist; Wenn ich andererseits var count
über den Exporten der Datei "lib.js" definiere, wird diese neue Variable count
anstelle der in der Sandbox enthaltenen Variable betroffen sein.
Hier sind die Einschränkungen, die ich respektieren möchte:
- Verwenden vm und kein eval() noch eine require() auf einer generierten Datei
- in einer externen Datei definiert haben „lib“
- keine Änderung der automatisch generierte Skript, so dass keine Verwendung von
lib.increment.apply(context)
oder ähnliche
die einzigen Lösungen, die ich bisher gefunden habe ist die lib
Spaß prepend ctions im generierten Skript als String, oder um sie direkt auf dem sandbox
Objekt zu definieren, was ich für eine weniger wünschenswerte Option halte.
Es scheint keine Möglichkeit zu geben, einen Kontext von Variablen über den Aufruf require
zu übergeben.
Warum nicht einfach 'haben exports' eine Funktion sein, die ein Objekt zurückgibt w/get/set & Inkrementmethoden? –
Oder Sie können die Exporte eine Funktion haben, die einen Kontext nimmt. Dann können Sie 'require ('./ lib') ({count: 1})' 'tun und es wird ein Objekt mit der Funktion 'increment' zurückgeben. –
@MikeC Sehen Sie, deshalb sollten Sie nie Angst haben zu fragen, das ist eigentlich ein ziemlich guter Vorschlag! –