2016-02-04 42 views
14

出於測試目的,我需要更改Node.js Module包裝。如何更改Node.js模塊包裝?

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

Module周圍玩過,我發現

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。在main.js中,每次需要模塊時,都會覆蓋Module.wrap函數,以便console.log('debug');。然後你需要module.js,其中包含hello world消息。

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

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

node main.js執行結果:

debug 
Hello world from module.js! 

這也適用於嵌套require()調用,例如,如果你require("./module2.js")module.js

module.js

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

require("./module2.js"); 

module2.js

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

在這種情況下node main.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可能存在此目錄,父目錄,或兒童directery的node_modules,它甚至可以只是一個JS文件名)

我敢肯定,你需要相同的黑客,但最終,它應該工作。

+0

謝謝,但不幸的是eval不是一個選項。 –

0

您不能更改節點應用程序內的包裝器,而不覆蓋require功能。 但是您可以將節點源分叉(複製)到您的計算機,更改一行&編譯(構建)它。

這爲什麼他喜歡開源:)

所有你需要做的是改變一行代碼,如果的src/node.js的文件

這裏: https://github.com/nodejs/node/blob/master/src/node.js#L990

NativeModule.wrapper = [ 
    '(function (exports, require, module, __filename, __dirname) { ', 
    '\n});' 
    ];