2012-08-21 17 views
6

मैं NodeJS में अपने प्रोजेक्ट के निर्माण के लिए शुरू कर और एक ही मॉड्यूल की आवश्यकता होती है मॉड्यूल के लिएक्या नोडजेएस पहले ही मॉड्यूल लोड कर चुका है और इसके मूल्यों को साझा करता है?

  • करता NodeJS पहले से ही भरी हुई पुनः उपयोग मॉड्यूल सोच रहा था?
  • क्या मॉड्यूल एक ही "राज्य" मॉड्यूल में रखता है जिसके लिए उन्हें आवश्यकता होती है?
  • यदि कोई या दोनों होता है तो कैच कैसा होता है? मैं चेहरे में घूम रहा हूं लूप और setTimeout और async कोड जैसा कोई समस्या है?

वर्तमान में मैं 4 फ़ाइलों

  • common.js

    var i = 0; 
    
    function add(v){i += v;} 
    function view(){console.log(i);} 
    
    module.exports = { 
        add : add, 
        view : view 
    } 
    
  • a.js और b.js

    exports.common = require('./common.js'); 
    
  • 0 के साथ परीक्षण किया है
  • server.js

    var a = require('./a.js'), 
        b = require('./b.js'); 
    
    function start(){ 
        http.createServer(function (req, res) { 
    
         a.common.add(2); 
         a.common.view(); 
    
         b.common.add(4); 
         b.common.view(); 
    
         a.common.view(); 
    
    
         res.writeHead(200, {'Content-Type': 'text/plain'}); 
         res.end('Hello World\n'); 
        }).listen(config.port, config.address || '127.0.0.1'); 
        console.log('Server running'); 
    } 
    

परिणाम मुझे एक विचारोत्तेजक नतीजा यह है कि यह करता है देता है:

2 - view() via a.js on favicon request 
6 - view() via b.js on favicon request 
6 - view() via a.js on favicon request 
8 - view() via a.js 
12 - view() via b.js 
12 - view() via a.js 

ऐसा लगता है कि यह मॉड्यूल यह दो अलग-अलग के लिए आवश्यक है, भले ही साझा करने के लिए प्रतीत होता है मॉड्यूल, और यहां तक ​​कि मॉड्यूल और पूरे अनुरोधों में राज्य रखता है

+0

'foo' और' bar 'कहां से आते हैं? – Amberlamps

+0

@Amberlamps संपादित। मैंने अपने कोड में 'foo' और' bar' का उपयोग किया। – Joseph

+0

हां, भारित मॉड्यूल आर कैश किए गए, उनके राज्य को। –

उत्तर

5

स्पष्ट प्रदर्शन कारणों से नोड.जेएस कैश मॉड्यूल। the Node.js website से

कथन:

मॉड्यूल पहली बार वे लोड किए गए हैं के बाद कैश नहीं किया जाता। इसका मतलब है (अन्य चीजों के साथ) कि require('foo') पर प्रत्येक कॉल ठीक उसी वस्तु को वापस कर देगा, अगर यह उसी फ़ाइल को हल करेगी।

require('foo') पर एकाधिक कॉल मॉड्यूल कोड को कई बार निष्पादित नहीं कर सकता है। यह एक महत्वपूर्ण विशेषता है। इसके साथ, "आंशिक रूप से किया गया" ऑब्जेक्ट वापस किया जा सकता है, इस प्रकार संक्रमणशील निर्भरताओं को तब भी लोड किया जा सकता है जब वे चक्र पैदा करेंगे। यदि आप मॉड्यूल निष्पादित कोड को कई बार निष्पादित करना चाहते हैं, तो फ़ंक्शन निर्यात करें, और उस फ़ंक्शन को कॉल करें।

2

हां, सभी मॉड्यूल पहली बार कैश किए जाते हैं लोड हो गए हैं आप official node.js docs में मॉड्यूल कैशिंग के बारे में अधिक पढ़ सकते हैं।

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