2016-02-04 6 views
14

テストのために、Node.js Moduleラッパーを変更する必要があります。 Moduleで遊んNode.jsモジュールラッパーの変更方法は?

(function (exports, require, module, __filename, __dirname, process, global) { 
    debugger; 
}); 

私は

var Module = require("module") 
Module.wrapper 
-> ["(function (exports, require, module, __filename, __dirname, process, global) { ", " 
});"] 

Module.wrap 
-> function(script) { 
    return NativeModule.wrapper[0] + script + NativeModule.wrapper[1]; 
} 

は、スクリプトの折り返しを変更するModule.wraperまたはプロパティにフックすることが可能です見つかりましたか?

答えて

12

あなたはModule.wrapの機能を見つけることによって素晴らしい仕事をしました。単にそれを上書きするのはどうですか?

main.jsmodule.jsという2つのファイルがあるとします。 main.jsでは、モジュールが必要になるたびに、Module.wrap関数をconsole.log('debug');に上書きします。次に、あなたはmodule.jsが必要です。これには、世界のメッセージが含まれています。

main.js

var Module = require("module"); 

(function(moduleWrapCopy) { 
    Module.wrap = function(script) { 
    script = "console.log('debug');" + script 
    return moduleWrapCopy(script); // Call original wrapper function 
    }; 
}(Module.wrap)); // Pass original function to IIFE 

require("./module.js"); 

module.js

debug 
Hello world from module.js! 

console.log("Hello world from module.js!"); 

はでnode main.js結果を実行します

あなたrequire("./module2.js")module.jsであればこれはまた、例えば、ネストされたrequire()呼び出しで動作します:

module.js

console.log("Hello world from module.js!"); 

require("./module2.js"); 

module2.js:この場合node main.js

console.log("Hello world from module2.js!"); 

が生成する:

debug 
Hello world from module.js! 
debug 
Hello world from module2.js! 

Node.js 4.3.0および6.1.0でテスト済みです。

3

requireは、独自の方法で上書きできます。例

require = function(module_name) { 
    var js = openTheModuleIndexFile(module_name) 
    var wrapped = wrapTheModule(js) 
    eval(wrapped) 
} 

のためにあなたがしなければならないのはopenTheModuleIndexFile機能を実装することである、とwrapTheModuleあなたのラッピング機能。

module_nameが存在することができることを忘れないでください、それだけでもJSファイル名を指定できます、このディレクトリのnode_modules、親ディレクトリ、または子directeryある)

私は確信している、あなたは確認する必要があり同じハックですが、結局はうまくいくはずです。

+0

ありがとうございますが、残念ながらevalはオプションではありません。 –

0

ノードアプリケーション内でラッパーを変更することはできません。要求機能をオーバーライドすることはできません。 しかしノードのソースをコンピュータにフォーク(コピー)して、1行を変更して&をコンパイル(ビルド)することができます。

この彼は、オープンソース:)

を好きな理由あなたがしなければならないのは、のsrc /ここにファイル

をNode.jsの場合、コードの1行を変更します: https://github.com/nodejs/node/blob/master/src/node.js#L990

NativeModule.wrapper = [ 
    '(function (exports, require, module, __filename, __dirname) { ', 
    '\n});' 
    ]; 
関連する問題