2016-02-04 9 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.js और module.jsmain.js में जब आप मॉड्यूल की आवश्यकता होती है तो console.log('debug'); पर Module.wrap फ़ंक्शन को ओवरराइट करें। फिर आपको 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() कॉल के साथ काम करता है अगर आप module.js में require("./module2.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! 

नोड.जेएस 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 है, तो यह और भी है सिर्फ एक जे एस फ़ाइल नाम हो सकता है)

मुझे यकीन है, तुम बनाने की जरूरत है एक ही हैक्स, लेकिन अंत में, यह काम करना चाहिए।

+0

धन्यवाद लेकिन दुर्भाग्य से eval एक विकल्प नहीं है। –

0

आप आवश्यकता फ़ंक्शन को ओवरराइड किए बिना, नोड ऐप के अंदर रैपर को नहीं बदल सकते हैं। लेकिन आप अपने कंप्यूटर पर फोर्क (प्रतिलिपि) नोड स्रोत कर सकते हैं, एक लाइन & संकलित करें (इसे बनाएं)।

यही कारण है कि वह प्यार खुला स्रोत :)

आपको बस इतना करना है कोड की एक पंक्ति को बदलने है अगर src/Node.js फ़ाइल

यहाँ

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

NativeModule.wrapper = [ 
    '(function (exports, require, module, __filename, __dirname) { ', 
    '\n});' 
    ]; 
संबंधित मुद्दे