2016-07-11 9 views
1

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.

+0

Warum nicht einfach 'haben exports' eine Funktion sein, die ein Objekt zurückgibt w/get/set & Inkrementmethoden? –

+0

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. –

+1

@MikeC Sehen Sie, deshalb sollten Sie nie Angst haben zu fragen, das ist eigentlich ein ziemlich guter Vorschlag! –

Antwort

2

Eine Möglichkeit, dies zu erreichen, ist, dass Ihr Modul lib eine Funktion ist, die einen Kontext akzeptiert und dann die richtige Schnittstelle zurückgibt.

lib.js

module.exports = function(context) { 
    var count = context.count; 
    return { 
    increment: function() { 
     count++; 
    } 
    }; 
}; 

main.js

var sandbox = { 
    count: 1 
}; 
sandbox.lib = require('./lib')(sandbox); 
var script = new vm.Script('(function() { lib.increment() })();'); 
script.runInNewContext(sandbox);