2016-07-11 4 views
1

のは、私はこのようになりますライブラリモジュールがあるとしましょう:パス機能

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

そして、私はこのようになり、動的に生成されたスクリプトでそれを使用したい:

サンドボックス内でそれを渡すこと
(function() { lib.increment(); })(); 

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

私はに実行する明白な問題は、私は一方ではのrequことができないということです"count"はlib.jsで定義されていないため、 "lib"をireしてください。一方、 "lib.js"ファイルのエクスポートよりも上にvar countを定義すると、この新しいcount変数はサンドボックス内の変数の代わりに影響を受けます。生成されたファイル

    • )(evalのVMと使用していないにも必要()「LIB」は、外部ファイルで定義した:ここで

      は、私が尊敬したい制約があります

    • 自動的に生成されたスクリプトの修正は、そうlib.increment.apply(context)または類似

    のない使用私がこれまでに見つけた唯一の解決策はlib楽しさを付加することではありません生成されたスクリプト内の文字列を文字列として返すか、または​​オブジェクトに直接定義することができます。これはあまり望ましくないオプションです。

    require呼び出しでは、変数のコンテキストを渡す方法はないようです。

  • +0

    はなぜちょうど '取得/設定&インクリメント方式/ wのオブジェクトを返す関数であるexports'持っていませんか? –

    +0

    また、エクスポートをコンテキストをとる関数にすることもできます。次に 'require( './lib')({count:1})'を実行すると、 'increment'関数を使ってオブジェクトを返します。 –

    +1

    @MikeCそれでは、あなたが尋ねることを恐れるべきではないという理由から、それは実際には非常に良い提案です! –

    答えて

    2

    これを達成する方法の1つは、libモジュールをコンテキストに取り込んで正しいインターフェイスを返す関数にすることです。

    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); 
    
    関連する問題