2012-01-22 12 views
23

मैंने अभी नोडज के साथ काम करना शुरू कर दिया है। मुझे आश्चर्य है कि एक ऐप में केवल एक बार फाइल की "आवश्यकता" है। मैं अपने जेएस प्रोजेक्ट में क्लासिक ओओपीएस प्राप्त करने के लिए क्लास फ्रेमवर्क का उपयोग कर रहा हूं। प्रत्येक "कक्षा" अपनी स्वयं की जेएस फ़ाइल में निहित है। मैं प्रत्येक फ़ाइल में कक्षा ढांचे की "आवश्यकता" करना चाहता हूं ताकि वे स्वतंत्र रूप से कार्य कर सकें लेकिन फ्रेमवर्क के इनिट कोड को केवल एक बार निष्पादित करना चाहते हैं।क्या नोडजेज़ में केवल एक बार एक जेएस फ़ाइल "आवश्यकता" करने का कोई तरीका है?

मैं इसे स्वयं लागू करने के लिए ध्वज का उपयोग कर सकता हूं लेकिन एक अंतर्निहित तरीका अच्छा होगा। "एक बार की आवश्यकता है" के लिए खोजें मुझे सभी PHP संबंधित प्रश्नों की ओर ले जाता है।

उत्तर

59

require हमेशा "एक बार आवश्यकता है" है। require पर पहली बार कॉल करने के बाद, require कैश का उपयोग करता है और हमेशा उसी ऑब्जेक्ट को वापस कर देगा।

मॉड्यूल में चारों ओर तैरने वाला कोई निष्पादन योग्य कोड केवल एक बार चलाया जाएगा।

दूसरी ओर, यदि आप चाहते हैं कि यह प्रारंभिक कोड कई बार चलाए, तो बस उस कोड को निर्यात की गई विधि में फेंक दें।

संपादित करें: 'कैशिंग' http://nodejs.org/docs/latest/api/modules.html#modules

+1

बढ़िया! जल्दी जवाब देने का शुक्रिया। – atlantis

+0

जब आप कहते हैं कि 'शुरुआती प्रारंभ कोड को कई बार चलाएं, तो बस उस कोड को निर्यातित विधि में फेंक दें।' –

+1

@sudo मॉड्यूल के शरीर में कोड छोड़ने के बजाय, इसे एक फ़ंक्शन में डाल दें जिसे आप निर्यात करते हैं । आपके मॉड्यूल की आवश्यकता वाले मॉड्यूल प्रारंभिक कोड को पुन: चालू करने के लिए इस फ़ंक्शन को निष्पादित कर सकते हैं। उदा। '' जेएस var डीबी = कनेक्ट(); module.exports = db '' ' बनाम ' '' js module.exports = कनेक्ट '' ' एक और तरीका यह है के बारे में सोच रहे हैं: नोड मॉड्यूल हमेशा एकमात्र कर रहे हैं। उदाहरण बनाने के लिए आपका सिंगलटन एक कन्स्ट्रक्टर/फैक्ट्री का पर्दाफाश कर सकता है। – timoxley

1

की धारा पढ़ें क्या तुम सच में आप कर सकते हैं एक से अधिक बार निष्पादित करने के लिए (कोड है कि अपने मॉड्यूल में तरीकों या कार्यों के भीतर निहित नहीं है) अपने मॉड्यूल में शीर्ष स्तर कोड चाहते हैं हटाना यह मॉड्यूल उद्देश्य यह है कि इस तरह require.cache वस्तु पर कैश किया गया है है:

delete require.cache[require.resolve('./mymodule.js')]; 

ऐसा करें इससे पहले कि आप दूसरी बार के लिए मॉड्यूल की आवश्यकता है।

अधिकांश समय हालांकि आप शायद मॉड्यूल के शीर्ष स्तर कोड को एक बार चलाने के लिए चाहते हैं और किसी अन्य समय आपको मॉड्यूल की आवश्यकता होती है, तो आप केवल उस मॉड्यूल के निर्यात को एक्सेस करना चाहते हैं।

var myMod = require("./mymodule.js"); //the first time you require the 
             //mymodule.js module the top level code gets 
             //run and you get the module value returned. 


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js 
             //module you will only get the module value 
             //returned. Obviously the second time you 
             //require the module it will be in another 
             //file than the first one you did it in. 
संबंधित मुद्दे

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