2013-02-16 4 views
6

उद्देश्य: इस तरह एक Node.js मॉड्यूल या एक Requirejs एएमडी मॉड्यूल, एक सादे पुराने जावास्क्रिप्ट फ़ाइल से बनाने:ऐसी फ़ाइल को कैसे शामिल करें जो Node.js में मॉड्यूल नहीं है (इसका मॉड्यूल बनाने के लिए)?

var foo = function() {}; 

मैं कोई नियंत्रण नहीं है और मैंfoo.js संपादित नहीं कर सकते।

क्यों foo पहले if के अंदर एक सादा खाली वस्तु है? मैं अपने मॉड्यूल में एक सादा जावास्क्रिप्ट फ़ाइल "शामिल" कैसे कर सकता हूं? फ़ाइल mymodule.js: require के साथ भरी हुई

(function(root) { 
    if(typeof exports === 'object') { // Node.js 
     var foo = require('./foo'); 

     console.log(foo); // { } 
    } else if (typeof define === 'function' && define.amd) { // RequireJS AMD 
     define(['foo'], function() { 
      return foo; 
     }); 
    } 
}()); 
+0

मैं उलझन में हूं, आप अपने कोड के 'RequJS' भाग' के साथ क्या करने का प्रयास कर रहे हैं? – loganfsmyth

उत्तर

4

नोड मॉड्यूल सब कुछ है कि मॉड्यूल सार्वजनिक बनाना चाहता है के साथ एक exports वस्तु को पॉप्युलेट करना चाहिए। आपके मामले में, जब आपको फ़ाइल की आवश्यकता होती है तो exports में कुछ भी नहीं जोड़ा जाता है, इसलिए यह खाली के रूप में दिखाई देता है। तो संक्षिप्त जवाब यह है कि आपको किसी भी तरह foo.js की सामग्री को संशोधित करने की आवश्यकता है। यदि आप इसे मैन्युअल रूप से नहीं कर सकते हैं, तो आपको इसे प्रोग्रामेटिक रूप से करने की आवश्यकता है। आप पर इसका कोई नियंत्रण क्यों नहीं है?

सबसे आसान यह है कि यदि आप उचित मॉड्यूल बनाने के लिए आवश्यक कोड में foo.js सामग्री को प्रोग्रामेटिक रूप से लपेटें।

// Add an 'exports' line to the end of the module before loading it. 
var originalFoo = fs.readFileSync('./foo.js', 'utf8'); 
fs.writeFileSync('./foo-module.js', originalFoo + "\nexports.foo = foo;"); 
var foo = require('./foo-module.js'); 
+1

मैंने पढ़ने + eval का उपयोग कर हल किया। नो फाइल को वापस लिखने की जरूरत नहीं है। मैं foo.js संपादित नहीं कर सकता क्योंकि यह एक निर्भरता है (स्वचालित रूप से डाउनलोड)। – gremo

+0

इसने मुझे काम के घंटों से बचाया है - मेरा लक्ष्य सभी आवश्यक ग्लोबल्स लोड करके मोचा के साथ एक विशिष्ट परीक्षण को डीबग करना था, मैं इसे उस परीक्षण को कॉल करके हल कर सकता हूं जिसे मैं डीबग करना चाहता हूं, और फ़ंक्शन में आवश्यक फ़ाइल पथों की एक सरणी खिला रहा हूं उन सभी पर eval कहते हैं –

0

आप की कोशिश कर सकते:

var fs = require('fs'); 

var foo = fs.readFileSync('foo.js', 'utf8') // Or request it somehow, just get it as a string 

foo += "module.exports.foo = module.exports = foo;"; 

fs.writeFileSync('fooModule.js',foo); 

var foo = require('./fooModule'); 

// foo() and foo.foo() are both the same 

नोट: यह नोड की आवश्यकता है।

संबंधित मुद्दे