2012-02-03 19 views
13

मैं सोच रहा था कि require() का उपयोग node.js में आलसी लोडिंग के बराबर था?node.js में आलसी लोडिंग

उदाहरण के लिए यदि मेरे पास एक ऐसा फ़ंक्शन था जिसके लिए एक विशिष्ट node.js पैकेज की आवश्यकता होती है जिसे मेरे कोड में कहीं और की आवश्यकता नहीं है, तो मैं उस फ़ंक्शन के अंदर require() का उपयोग करना चाहता हूं, केवल उस पैकेज को आवश्यक पैकेज को शामिल करने के लिए ।

मुझे यह भी अनिश्चितता है कि यह नोड.जेएस आर्किटेक्चर के आसपास समझ की कमी के कारण कोई प्रदर्शन सुधार प्रदान करेगा? मुझे लगता है कि यह मेरे सर्वर से प्रति कनेक्शन कम स्मृति का उपयोग करेगा। हालांकि यह डिस्क को I/O में बढ़ाएगा जब इसे पैकेज को पढ़ना होगा, या यह स्मृति में इसे पाने के लिए एक बंद होगा?

यदि यह मामला है कि मुझे यह कितना दूर लेना चाहिए, तो क्या मुझे जितना संभव हो उतना कोड के लिए node.js पैकेज लिखने की कोशिश करनी चाहिए?

उत्तर

21

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

नोड एकल थ्रेडेड है इसलिए मॉड्यूल लोड करने की स्मृति पदचिह्न प्रति कनेक्शन नहीं है, यह प्रति-प्रक्रिया है। मॉड्यूल लोड करना इसे स्मृति में लाने के लिए एक-ऑफ है।

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

+0

धन्यवाद पीटर, यह सब एक बहुत अधिक समझ बनाने के बनाया है। –

+6

प्रारंभिक लोडिंग सीएलआई उपकरणों के लिए समझ में नहीं आता है (परीक्षण के अलावा, जहां आप इसे अस्थायी रूप से अक्षम कर सकते हैं)। – sheerun

+1

@ पीटर लियोन आप मुझे लाइन को समझा सकते हैं "नोड एकल थ्रेडेड है इसलिए मॉड्यूल लोड करने की स्मृति पदचिह्न प्रति कनेक्शन नहीं है, यह प्रति-प्रक्रिया है। मॉड्यूल लोड करना इसे स्मृति में लाने के लिए एक-एक है"। मैं समझता हूं कि एक धागा क्या है, क्या आप यह कहना चाहते हैं कि सर्वर से कनेक्शन की संख्या जो भी हो, एक विशेष मॉड्यूल पूरे एप्लिकेशन में केवल एक बार लोड हो जाएगा? – Deepak

2

आप आलसी लोड मॉड्यूल चाहते हैं, अब ES6 (नोड v6)

संपादित के साथ संभव है अपने: यह आप (जैसे require.cache) की आवश्यकता होती है के गुणों का उपयोग करने की जरूरत है काम नहीं करेगा।

module.js

console.log('Module was loaded') 
exports.d=3 

main.js

var _require = require; 
var require = function (moduleName) { 
    var module; 
    return new Proxy(function() { 
     if (!module) { 
      module = _require(moduleName) 
     } 
     return module.apply(this, arguments) 
    }, { 
     get: function (target, name) { 
      if (!module) { 
       module = _require(moduleName) 
      } 
      return module[name]; 
     } 
    }) 
}; 

console.log('Before require'); 
var a = require('./module') 
console.log('After require'); 
console.log(a.d) 
console.log('After log module'); 

उत्पादन

Before require 
After require 
Module was loaded 
3 
After log module 
संबंधित मुद्दे