Node.js क्या है? [बन्द है]


506

मैं पूरी तरह से Node.js के बारे में क्या नहीं मिलता है। शायद यह इसलिए है क्योंकि मैं मुख्य रूप से एक वेब आधारित व्यवसाय अनुप्रयोग डेवलपर हूं। यह क्या है और इसका उपयोग क्या है?

अब तक मेरी समझ यह है कि:

  1. प्रोग्रामिंग मॉडल ईवेंट संचालित है, विशेष रूप से जिस तरह से यह I / O संभालता है ।
  2. यह जावास्क्रिप्ट का उपयोग करता है और पार्सर V8 है
  3. यह समवर्ती सर्वर अनुप्रयोगों को बनाने के लिए आसानी से उपयोग किया जा सकता है।

क्या मेरी समझ सही है? यदि हाँ, तो आई / ओ के आयोजन के क्या लाभ हैं, क्या यह सिर्फ संगामिति सामग्री के लिए है? इसके अलावा, Node.js की दिशा क्या एक रूपरेखा बनने के लिए है, जैसे जावास्क्रिप्ट आधारित (V8 आधारित) प्रोग्रामिंग मॉडल?

जवाबों:


213

मुझे लगता है कि लाभ हैं:

  1. एक वीएम पर एक गतिशील भाषा (जावास्क्रिप्ट) में वेब विकास जो अविश्वसनीय रूप से तेज (वी 8) है। यह रूबी, पायथन या पर्ल से बहुत तेज है।

  2. एक प्रक्रिया पर न्यूनतम ओवरहेड के साथ हजारों समवर्ती कनेक्शन को संभालने की क्षमता।

  3. जावास्क्रिप्ट फर्स्ट क्लास फंक्शन ऑब्जेक्ट्स और क्लोजर के साथ इवेंट लूप्स के लिए परफेक्ट है। लोग पहले से ही जानते हैं कि इसे इस तरह से कैसे उपयोग किया जाए कि इसका उपयोग ब्राउज़र में उपयोगकर्ता द्वारा शुरू की गई घटनाओं पर प्रतिक्रिया करने के लिए किया जाए।

  4. बहुत से लोग पहले से ही जावास्क्रिप्ट को जानते हैं, यहां तक ​​कि ऐसे लोग भी जो प्रोग्रामर होने का दावा नहीं करते हैं। यकीनन यह सबसे लोकप्रिय प्रोग्रामिंग भाषा है।

  5. एक वेब सर्वर पर जावास्क्रिप्ट के साथ-साथ ब्राउज़र का उपयोग करना दो प्रोग्रामिंग वातावरणों के बीच प्रतिबाधा बेमेल को कम करता है जो JSON के माध्यम से डेटा संरचनाओं को संवाद कर सकता है जो समीकरण के दोनों तरफ समान काम करते हैं। डुप्लिकेट फॉर्म सत्यापन कोड सर्वर और क्लाइंट, आदि के बीच साझा किया जा सकता है।


1
@ पॉस्टफुटुरिस्ट: यह वास्तव में बहुत सारे विकल्पों के खिलाफ अच्छा प्रदर्शन करता है। यह बहुत सारे मामलों में जावा 6 को बहुत सुंदर रूप से हरा देता है। साफ!
एडम क्रॉसलैंड

1
@postfuturist मुझे लगता है कि आपने java 6 -Xint के खिलाफ तुलना की है। Java 6 -server
fedesilva

@iJK yammer.com नोड का एक काम करने वाला अनुप्रयोग है। जेएस
जेरार्ड बनसाइग

1
मज़ेदार, मैं 10 साल पहले ASP में JScript लिख रहा था, इसलिए मैं (a) VBScript की भयावहता से बच सकता था, (b) क्लाइंट और सर्वर पर एक ही भाषा का उपयोग करता हूँ, और (c) अपने और दूसरों के JS पुस्तकालयों का फिर से उपयोग करता हूँ स्ट्रिंग हैंडलिंग के लिए ... आदि।
एंटनी क्विन

4
@ आपने "विरासत बुलिश" के लिए ही इस पोस्ट को संपादित किया? मुझे नहीं लगता कि अगर आपने शुरुआत से यह लिखा है तो 212 लोगों ने इस पद के लिए वोट किया होगा।
जूलियन फोइले

619

मैं काम पर Node.js का उपयोग करता हूं, और इसे बहुत शक्तिशाली मानता हूं। Node.js का वर्णन करने के लिए एक शब्द चुनने के लिए मजबूर, मैं "दिलचस्प" (जो एक शुद्ध सकारात्मक विशेषण नहीं है) कहूंगा। समुदाय जीवंत और विकसित हो रहा है। जावास्क्रिप्ट, इसकी विषमताओं के बावजूद कोड करने के लिए एक महान भाषा हो सकती है और आप "सर्वोत्तम अभ्यास" और अच्छी तरह से संरचित कोड के पैटर्न के बारे में अपनी खुद की समझ को फिर से पढ़ेंगे। इस समय Node.js में विचारों की भारी ऊर्जा बह रही है, और इसमें काम करना आपको इस सभी सोच - महान मानसिक भारोत्तोलन में उजागर करता है।

उत्पादन में Node.js निश्चित रूप से संभव है, लेकिन "टर्न-की" तैनाती से दूर प्रलेखन द्वारा उचित रूप से वादा किया गया है। Node.js v0.6.x के साथ, "क्लस्टर" को आवश्यक बिल्डिंग ब्लॉक्स में से एक प्रदान करते हुए, प्लेटफ़ॉर्म में एकीकृत किया गया है, लेकिन मेरी "प्रोडक्शन.जेएस" स्क्रिप्ट अभी भी है ~ लॉजिक को संभालने के लिए सामान को संभालने के लिए लॉजिक की 150 लाइनें निर्देशिका, मृत श्रमिकों को पुनर्चक्रण करना, आदि "गंभीर" उत्पादन सेवा के लिए, आपको आने वाले कनेक्शनों को थ्रॉटल करने के लिए भी तैयार रहना होगा और अपाचे पीएचपी के लिए वह सभी सामान करना होगा । निष्पक्ष होने के लिए, रूबी ऑन रेल्स में यह सटीक समस्या है। इसे दो पूरक तंत्रों के माध्यम से हल किया गया है: 1) रूबी को पटरियों / नोड पर रखना।अपाचे / लाइटड )। वेबसर्वर कुशलतापूर्वक स्थिर सामग्री, पहुँच लॉगिंग, URL को फिर से लिखना, SSL को समाप्त करना, पहुँच नियमों को लागू करना और कई उप-सेवाओं का प्रबंधन कर सकता है। वास्तविक नोड सेवा को हिट करने वाले अनुरोधों के लिए, वेबसर्वर अनुरोध के माध्यम से प्रॉक्सी करता है। 2) यूनिकॉर्न की तरह एक फ्रेमवर्क का उपयोग करना जो श्रमिक प्रक्रियाओं का प्रबंधन करेगा, उन्हें समय-समय पर रीसायकल करेगा, आदि मुझे अभी तक एक नोड.जेएस सेवारत ढांचे की तलाश करना है जो पूरी तरह से पके हुए लगते हैं; यह मौजूद हो सकता है, लेकिन मुझे यह अभी तक नहीं मिला है और अभी भी मेरे हाथ से लुढ़के "प्रोडक्शन.जेएस" में ~ 150 लाइनों का उपयोग करते हैं।

एक्सप्रेस जैसे फ्रेमवर्क पढ़ना ऐसा लगता है कि मानक अभ्यास केवल एक जैक-ऑफ-ऑल-ट्रेड्स Node.js सेवा के माध्यम से सब कुछ परोसना है ... "app.use (express.static (__ dirname + '/ public'))" । कम-लोड सेवाओं और विकास के लिए, यह शायद ठीक है। लेकिन जैसे ही आप अपनी सेवा पर बड़े समय का भार डालने की कोशिश करते हैं और इसे 24/7 चलाते हैं, आप जल्दी से उन प्रेरणाओं की खोज करेंगे जो बड़ी साइटों को अच्छी तरह से बेक करने के लिए प्रेरित करती हैं, कठोर सी कोड जैसे नग्नेक्स ने अपनी साइट का मोर्चा संभाला और सभी को संभाला स्थिर सामग्री अनुरोधों (... जब तक आप CDN सेट नहीं करते , जैसे Amazon CloudFront ))। कुछ हद तक हास्य और अनभिज्ञता से नकारात्मक इस पर ले, इस आदमी को देखें ।

Node.js भी अधिक से अधिक गैर-सेवा उपयोग ढूंढ रहा है। आप कुछ और प्रयोग कर रहे हैं यहां तक कि अगर वेब सामग्री की सेवा के लिए, आप अभी भी Node.js निर्माण उपकरण के रूप में, का उपयोग कर सकते का उपयोग कर NPM मॉड्यूल अपने कोड को व्यवस्थित करने, Browserify एक भी परिसंपत्ति में यह सिलाई, और करने के लिए सूरत बिगाड़ना-js तैनाती के लिए यह कम करें करने के लिए । वेब से निपटने के लिए, जावास्क्रिप्ट एक पूर्ण प्रतिबाधा मैच है और अक्सर यह हमले का सबसे आसान मार्ग बनाता है। उदाहरण के लिए, यदि आप JSON रिस्पॉन्स पेलोड के एक समूह के माध्यम से बजना चाहते हैं, तो आपको मेरे अंडरस्कोर-सीएलआई मॉड्यूल, संरचित डेटा की उपयोगिता-बेल्ट का उपयोग करना चाहिए ।

फायदे नुकसान:

  • प्रो: एक सर्वर आदमी के लिए, बैकएंड पर जावास्क्रिप्ट लिखना आधुनिक यूआई पैटर्न सीखने के लिए "गेटवे ड्रग" रहा है। मैं अब क्लाइंट कोड लिखने से नहीं डरता।
  • प्रो: उचित त्रुटि जाँच को प्रोत्साहित करने के लिए जाता है (इरेट को लगभग सभी कॉलबैक द्वारा वापस कर दिया जाता है, प्रोग्रामर को इसे संभालने के लिए सताते हैं; साथ ही, async.js और अन्य लाइब्रेरीज़ "इन सब में से कोई भी सबस्टिट्यूट विफल होने पर संभालती हैं" को बेहतर तरीके से समकालिक कोड की तुलना में बेहतर बनाता है। )
  • प्रो: कुछ दिलचस्प और सामान्य रूप से कठिन कार्य तुच्छ हो जाते हैं - जैसे उड़ान में कार्यों पर स्थिति प्राप्त करना, श्रमिकों के बीच संवाद करना या कैश स्टेट साझा करना
  • प्रो: एक ठोस पैकेज प्रबंधक (npm) के आधार पर विशाल समुदाय और महान पुस्तकालयों के टन
  • Con: जावास्क्रिप्ट में कोई मानक पुस्तकालय नहीं है। आप कार्यक्षमता का आयात करने के लिए इतने अभ्यस्त हो जाते हैं कि जब आप JSON.parse या किसी अन्य विधि का उपयोग करते हैं तो यह अजीब लगता है जिसमें npm मॉड्यूल को जोड़ने की आवश्यकता नहीं होती है। इसका मतलब है कि सब कुछ के पांच संस्करण हैं। यहां तक ​​कि नोड.जेएस "कोर" में शामिल मॉड्यूल के पांच और संस्करण हैं, जिन्हें आपको डिफ़ॉल्ट कार्यान्वयन से नाखुश होना चाहिए। यह तेजी से विकास की ओर जाता है, लेकिन भ्रम के कुछ स्तर भी।

एक सरल एक-प्रक्रिया-प्रति-अनुरोध मॉडल ( LAMP ) बनाम :

  • प्रो: हजारों सक्रिय कनेक्शन के लिए स्केलेबल। बहुत तेज और बहुत कुशल। एक वेब बेड़े के लिए, इसका मतलब हो सकता है कि PHP या रूबी बनाम आवश्यक बक्से की संख्या में 10X की कमी हो
  • प्रो: समानांतर पैटर्न लिखना आसान है। कल्पना कीजिए कि आप से तीन (या एन) धब्बे लाने की जरूरत है Memcached । PHP में ऐसा करें ... क्या आपने अभी कोड लिखा है पहला ब्लॉब, फिर दूसरा, फिर तीसरा? वाह, यह धीमी है। Memcached के लिए उस विशिष्ट समस्या को ठीक करने के लिए एक विशेष PECL मॉड्यूल है, लेकिन क्या होगा यदि आप अपने डेटाबेस क्वेरी के साथ समानांतर में कुछ Memcached डेटा प्राप्त करना चाहते हैं? Node.js में, क्योंकि प्रतिमान अतुल्यकालिक है, एक वेब अनुरोध करते हुए समानांतर में कई चीजें करना बहुत स्वाभाविक है।
  • Con: एसिंक्रोनस कोड, सिंक्रोनस कोड की तुलना में मौलिक रूप से अधिक जटिल है, और अप-फ्रंट लर्निंग कर्व डेवलपर्स के लिए कठिन हो सकता है, जो कि समवर्ती निष्पादन का वास्तव में मतलब है की ठोस समझ के बिना। फिर भी, लॉकिंग के साथ किसी भी प्रकार के मल्टीथ्रेडेड कोड लिखने की तुलना में यह बहुत कम मुश्किल है।
  • Con: यदि एक कम्प्यूट-गहन अनुरोध, उदाहरण के लिए, 100 ms चलता है, तो यह अन्य अनुरोधों के प्रसंस्करण को रोक देगा, जिन्हें एक ही Node.js प्रक्रिया में संभाला जा रहा है ... AKA, सहकारी-मल्टीटास्किंग । यह वेब वर्कर्स पैटर्न (महंगे कार्य से निपटने के लिए एक उपप्रकार बंद करने) के साथ कम किया जा सकता है। वैकल्पिक रूप से, आप बड़ी संख्या में Node.js श्रमिकों का उपयोग कर सकते हैं और केवल प्रत्येक को एक ही अनुरोध को समवर्ती रूप से संभालने दें (अभी भी काफी कुशल है क्योंकि कोई प्रक्रिया रीसायकल नहीं है)।
  • Con: एक उत्पादन प्रणाली चलाना MUCH है जो Apache + PHP, Perl , Ruby , आदि जैसे CGI मॉडल की तुलना में अधिक जटिल है । अनचाहे अपवाद पूरी प्रक्रिया को नीचे लाएंगे, असफल श्रमिकों को पुनरारंभ करने के लिए तर्क की आवश्यकता होगी ( क्लस्टर देखें )। छोटी गाड़ी मूल कोड के साथ मॉड्यूल प्रक्रिया को हार्ड-क्रैश कर सकते हैं। जब भी किसी कार्यकर्ता की मृत्यु होती है, तो उसके द्वारा किए गए किसी भी अनुरोध को हटा दिया जाता है, इसलिए एक छोटी सी एपीआई आसानी से अन्य cohosted API के लिए सेवा को नीचा दिखा सकती है।

जावा / सी # / सी (सी? वास्तव में?) में "वास्तविक" सेवा लिखने वाला बनाम?

  • प्रो: Node.js में एसिंक्रोनस करना कहीं भी थ्रेड-सेफ्टी करने की तुलना में आसान है और यकीनन अधिक लाभ प्रदान करता है। Node.js अब तक सबसे कम दर्दनाक अतुल्यकालिक प्रतिमान है, जिसमें मैंने कभी काम किया है। अच्छे पुस्तकालयों के साथ, यह तुल्यकालिक कोड लिखने से थोड़ा कठिन है।
  • प्रो: कोई मल्टीथ्रेडिंग / लॉकिंग बग नहीं। सच है, आप अधिक वर्बोज़ कोड लिखने में सामने निवेश करते हैं जो एक उचित एसिंक्रोनस वर्कफ़्लो को व्यक्त करता है जिसमें कोई अवरोधक संचालन नहीं होता है। और आपको कुछ परीक्षण लिखने और काम करने की चीज़ प्राप्त करने की आवश्यकता है (यह एक स्क्रिप्टिंग भाषा है और वसा वाले चर नाम केवल इकाई-परीक्षण के समय पकड़े जाते हैं)। लेकिन, एक बार जब आप इसे काम करने के लिए प्राप्त करते हैं, तो हाइजेनबग्स के लिए सतह क्षेत्र - अजीब समस्याएं जो केवल एक लाख रन में एक बार प्रकट होती हैं - वह सतह क्षेत्र बस बहुत कम है। Node.js कोड लिखने वाले कर कोडिंग चरण में भारी रूप से सामने होते हैं। तब आप स्थिर कोड के साथ समाप्त होते हैं।
  • प्रो: कार्यक्षमता को व्यक्त करने के लिए जावास्क्रिप्ट बहुत अधिक हल्का है। इसे शब्दों के साथ साबित करना मुश्किल है, लेकिन JSON , डायनेमिक टाइपिंग, लंबोदर नोटेशन, प्रोटोटाइप इनहेरिटेंस, लाइटवेट मॉड्यूल, जो भी हो ... यह केवल समान विचारों को व्यक्त करने के लिए कम कोड लेने के लिए जाता है।
  • Con: शायद तुम सच में, वास्तव में जावा में कोडिंग सेवाओं की तरह?

जावास्क्रिप्ट और Node.js पर एक और परिप्रेक्ष्य के लिए, Java से Node.js तक की जाँच करें , जावा डेवलपर के इंप्रेशन पर एक ब्लॉग पोस्ट और Node.js. को सीखने का अनुभव।


मॉड्यूल नोड पर विचार करते समय, ध्यान रखें कि जावास्क्रिप्ट पुस्तकालयों की आपकी पसंद आपके अनुभव को परिभाषित करेगी । ज्यादातर लोग कम से कम दो, एक एसिंक्रोनस पैटर्न हेल्पर (स्टेप, फ्यूचर्स, एसक्यूएन), और एक जावास्क्रिप्ट चीनी मॉड्यूल ( अंडरस्कोर.जेएस ) का उपयोग करते हैं।

हेल्पर / जावास्क्रिप्ट चीनी:

  • Underscore.js - इसका उपयोग करें। बस कर दो। यह आपके कोड को _.isString (), और _.isArray () जैसे सामान के साथ अच्छा और पठनीय बनाता है। मुझे यकीन नहीं है कि आप सुरक्षित कोड कैसे लिख सकते हैं अन्यथा नहीं। इसके अलावा, बढ़ी हुई कमांड-लाइन-फू के लिए, मेरे अपने अंडरस्कोर-सीएलआई की जांच करें ।

अतुल्यकालिक पैटर्न मॉड्यूल:

  • चरण - धारावाहिक और समानांतर कार्यों के संयोजन को व्यक्त करने का एक बहुत ही सुरुचिपूर्ण तरीका। मेरी व्यक्तिगत प्रतिपूर्ति। स्टेप कोड कैसा दिखता है, इस पर मेरी पोस्ट देखें ।
  • वायदा - आवश्यकताओं के माध्यम से आदेश व्यक्त करने का तरीका बहुत अधिक लचीला (क्या यह वास्तव में एक अच्छी बात है?)। समानांतर "ए, बी, सी, और बी फिनिश, एबी शुरू करें। ए, और सी खत्म, एसी शुरू करें।" जैसी चीजों को व्यक्त कर सकते हैं। इस तरह के लचीलेपन के लिए आपके वर्कफ़्लो में बग्स से बचने के लिए अधिक देखभाल की आवश्यकता होती है (जैसे कॉलबैक को कभी कॉल न करना, या कई बार कॉल करना)। वायदा का उपयोग करने के बारे में रेन्नोस की पोस्ट देखें (यह वह पोस्ट है जिसने मुझे "वायदा" मिल गया)।
  • Async - प्रत्येक पैटर्न के लिए एक विधि के साथ अधिक पारंपरिक पुस्तकालय। मैंने अपने धार्मिक रूपांतरण से पहले कदम और बाद में यह महसूस किया कि Async में सभी पैटर्न एक और अधिक पठनीय प्रतिमान के साथ चरण में व्यक्त किए जा सकते हैं।
  • TameJS - OKCupid द्वारा लिखित, यह एक प्री - कंपाइलर है , जो सुरुचिपूर्ण ढंग से धारावाहिक और समानांतर वर्कफ़्लोज़ लिखने के लिए एक नई भाषा "प्रतीक्षा" जोड़ता है। पैटर्न आश्चर्यजनक दिखता है, लेकिन इसके लिए पूर्व-संकलन की आवश्यकता होती है। मैं अभी भी इस पर अपना मन बना रहा हूं।
  • StreamlineJS - TameJS के प्रतियोगी। मैं टेम की ओर झुक रहा हूं, लेकिन आप अपना मन बना सकते हैं।

या अतुल्यकालिक पुस्तकालयों के बारे में सब पढ़ने के लिए, लेखकों के साथ इस पैनल-साक्षात्कार को देखें ।

वेब फ्रेमवर्क:

  • वेब साइटों के आयोजन के लिए रेल-एसके ढांचे पर ग्रेट रूबी को व्यक्त करें । यह एक XML / HTML टेम्प्लेटिंग इंजन के रूप में JADE का उपयोग करता है , जो HTML को बहुत कम दर्दनाक बनाता है, लगभग सुरुचिपूर्ण भी।
  • jQuery तकनीकी रूप से नोड मॉड्यूल नहीं है, लेकिन jQuery क्लाइंट-साइड उपयोगकर्ता इंटरफ़ेस के लिए जल्दी से एक वास्तविक मानक बन रहा है। jQuery, DOM तत्वों के सेट के लिए 'क्वेरी' करने के लिए CSS-जैसे चयनकर्ताओं को प्रदान करता है जिन्हें तब (सेट हैंडलर, प्रॉपर्टीज, स्टाइल आदि) पर संचालित किया जा सकता है। उसी नस के साथ, ट्विटर के बूटस्ट्रैप सीएसएस फ्रेमवर्क, एक MVC पैटर्न के लिए Backbone.js , और Browserify.js एक ही फाइल में अपने सभी जावास्क्रिप्ट फ़ाइलों को सिलाई करने के लिए। ये मॉड्यूल सभी वास्तविक मानक बन रहे हैं, इसलिए यदि आपने उनके बारे में नहीं सुना है, तो आपको कम से कम उनकी जाँच करनी चाहिए।

परिक्षण:

  • JSHint - उपयोग करना चाहिए; मैंने पहले इसका इस्तेमाल नहीं किया था जो अब समझ से बाहर है। JSLint आपको जावा जैसी संकलित भाषा के साथ मिलने वाले मूल सत्यापन का एक गुच्छा वापस जोड़ता है। बेमेल कोष्ठक, अघोषित चर, कई प्रकार और आकार के प्रकार। आप विभिन्न तरीकों से भी चालू कर सकते हैं जिन्हें मैं "गुदा मोड" कहता हूं, जहां आप व्हाट्सएप और व्हाट्सएप की शैली को सत्यापित करते हैं, जो कि ठीक है यदि आपकी चाय का कप है - लेकिन वास्तविक मूल्य सटीक लाइन नंबर पर तत्काल प्रतिक्रिया प्राप्त करने से आता है जहां आप एक बंद ") को भूल गए" ... अपने कोड को चलाने के बिना और अपमानजनक रेखा को मारा। "JSHint" डगलस क्रॉकफोर्ड के JSLint का अधिक विन्यास योग्य रूप है ।
  • मोचा प्रतियोगी जो कि मैं पसंद करने लगा हूँ। दोनों रूपरेखाएं मूल रूप से पर्याप्त रूप से संभालती हैं, लेकिन जटिल पैटर्न मोचा में व्यक्त करने में आसान होते हैं।
  • स्वर प्रतिज्ञा वास्तव में काफी सुरुचिपूर्ण है। और यह आपको बताती है कि एक प्यारी सी रिपोर्ट (-स्पेक) आपको दिखाती है कि कौन से टेस्ट केस पास हुए / फेल हुए। इसे सीखने में 30 मिनट खर्च करें, और आप न्यूनतम प्रयास के साथ अपने मॉड्यूल के लिए बुनियादी परीक्षण बना सकते हैं।
  • ज़ोंबी - एक आभासी "ब्राउज़र" के रूप में JSDom का उपयोग करके एचटीएमएल और जावास्क्रिप्ट के लिए प्रमुख परीक्षण । बहुत शक्तिशाली सामान। इन-ब्राउज़र कोड के लाइटनिंग निर्धारक परीक्षण प्राप्त करने के लिए इसे रीप्ले के साथ मिलाएं ।
  • परीक्षण के बारे में "सोचने के लिए" पर एक टिप्पणी:
    • परीक्षण गैर-वैकल्पिक है। जावास्क्रिप्ट की तरह एक गतिशील भाषा के साथ, बहुत कम स्थैतिक जाँच होती है। उदाहरण के लिए, दो मापदंडों को एक विधि से पारित करना जो 4 की अपेक्षा करता है जब तक कि कोड निष्पादित नहीं हो जाता है। जावास्क्रिप्ट में बग बनाने के लिए बहुत कम बार। संकलित भाषाओं के साथ सत्यापन अंतराल बनाने के लिए बुनियादी परीक्षण आवश्यक हैं।
    • सत्यापन को भूल जाओ, बस अपना कोड निष्पादित करें। हर विधि के लिए, मेरा पहला सत्यापन मामला "कुछ भी नहीं टूटता" है, और यह वह मामला है जो सबसे अधिक बार आग लगाता है। यह साबित करते हुए कि आपका कोड 80% बग्स को फेंक दिए बिना चलता है और आपके कोड विश्वास को बेहतर बनाने के लिए इतना कुछ करेगा कि आप खुद को पीछे छोड़ते हुए और आपके द्वारा छोड़ी गई बारीक मान्यता के मामलों को जोड़ते हुए पाएंगे।
    • छोटे से शुरू करें और जड़त्वीय अवरोध को तोड़ें। हम सभी आलसी हैं, और समय के लिए दबाया जाता है, और परीक्षण को "अतिरिक्त काम" के रूप में देखना आसान है। इसलिए छोटी शुरुआत करें। टेस्ट केस 0 लिखें - अपने मॉड्यूल को लोड करें और सफलता की रिपोर्ट करें। यदि आप अपने आप को सिर्फ इतना करने के लिए मजबूर करते हैं, तो परीक्षण के लिए जड़ता अवरोध टूट जाता है। प्रलेखन पढ़ने सहित यह पहली बार करने के लिए 30 मिनट है। अब टेस्ट केस 1 लिखें - अपने तरीकों में से एक को कॉल करें और "कुछ भी नहीं टूटता" को सत्यापित करें, अर्थात आपको एक त्रुटि वापस नहीं मिलती है। टेस्ट केस 1 को आपको एक मिनट से भी कम समय लेना चाहिए। जड़ता के चले जाने से, अपने परीक्षण कवरेज को बढ़ाना आसान हो जाता है।
    • अब अपने कोड के साथ अपने परीक्षणों को विकसित करें। "सही" अंत-से-अंत परीक्षण जो मॉक सर्वर और उस सब के साथ की तरह दिखेंगे, से डरा नहीं। कोड सरल शुरू होता है और नए मामलों को संभालने के लिए विकसित होता है; परीक्षण भी चाहिए। जैसे ही आप अपने कोड में नए केस और नई जटिलता जोड़ते हैं, नए कोड को एक्सरसाइज करने के लिए टेस्ट केस जोड़ें। जैसा कि आपको बग मिलते हैं, त्रुटिपूर्ण कोड को कवर करने के लिए सत्यापन और / या नए मामले जोड़ें। जब आप डिबग कर रहे हों और कोड के एक टुकड़े में आत्मविश्वास खो दें, तो वापस जाएं और यह साबित करने के लिए परीक्षण जोड़ें कि यह वही कर रहा है जो आप सोचते हैं कि यह क्या है। उदाहरण डेटा के स्ट्रिंग्स को कैप्चर करें (आपके द्वारा कॉल की जाने वाली अन्य सेवाओं से, आप जो भी वेबसाइटों को खंगालते हैं, जो भी हों) और उन्हें अपने पार्सिंग कोड में फीड करें। यहां कुछ मामलों में, वहां सत्यापन में सुधार हुआ है, और आप अत्यधिक विश्वसनीय कोड के साथ समाप्त हो जाएंगे।

इसके अलावा, अनुशंसित Node.js मॉड्यूल की आधिकारिक सूची देखें । हालांकि, GitHub का नोड मॉड्यूल्स विकी अधिक पूर्ण और एक अच्छा संसाधन है।


नोड को समझने के लिए, कुछ महत्वपूर्ण डिजाइन विकल्पों पर विचार करना उपयोगी है:

Node.js ईवेंट आधारित और ASYNCHRONOUS / NON-BLOCKING है। एक आने वाले HTTP कनेक्शन की तरह घटनाएँ एक जावास्क्रिप्ट फ़ंक्शन को बंद कर देंगी जो थोड़ा सा काम करता है और अन्य अतुल्यकालिक कार्यों को बंद कर देता है जैसे डेटाबेस से कनेक्ट करना या किसी अन्य सर्वर से सामग्री खींचना। एक बार जब इन कार्यों को बंद कर दिया जाता है, तो ईवेंट फ़ंक्शन समाप्त हो जाता है और Node.js सोने के लिए वापस चला जाता है। जैसे ही कुछ और होता है, जैसे डेटाबेस कनेक्शन स्थापित हो रहा है या बाहरी सर्वर सामग्री के साथ प्रतिक्रिया दे रहा है, कॉलबैक कार्य करता है, और अधिक जावास्क्रिप्ट कोड निष्पादित होता है, संभवतः अधिक अतुल्यकालिक कार्यों (जैसे डेटाबेस क्वेरी) को किक करना। इस तरह, Node.js खुशी के साथ कई समानांतर वर्कफ़्लोज़ के लिए गतिविधियों को हल करेगा, जो भी गतिविधियाँ किसी भी समय अनब्लॉक हो रही हैं। यही कारण है कि Node.js एक साथ हजारों कनेक्शनों को प्रबंधित करने के लिए इतना अच्छा काम करता है।

हर किसी की तरह सिर्फ एक प्रक्रिया / थ्रेड प्रति कनेक्शन का उपयोग क्यों नहीं किया जाता?Node.js में, एक नया कनेक्शन केवल एक बहुत ही छोटा ढेर आवंटन है। एक नई प्रक्रिया को स्पिन करने से कुछ प्लेटफॉर्म पर मेगाबाइट में काफी अधिक मेमोरी लगती है। लेकिन असली लागत संदर्भ-स्विचिंग के साथ जुड़े ओवरहेड है। जब आपके पास 10 ^ 6 कर्नेल थ्रेड्स होते हैं, तो कर्नेल को यह पता लगाने में बहुत काम करना पड़ता है कि आगे कौन निष्पादित करना चाहिए। काम का एक गुच्छा लिनक्स के लिए O (1) शेड्यूलर के निर्माण में चला गया है, लेकिन अंत में, यह एक तरह से सीपीयू समय के लिए प्रतिस्पर्धा करने वाली 10 ^ 6 प्रक्रियाओं की तुलना में एकल-संचालित प्रक्रिया के लिए अधिक कुशल है। इसके अलावा, अधिभार की शर्तों के तहत, मल्टी-प्रोसेस मॉडल बहुत खराब व्यवहार करता है, महत्वपूर्ण प्रशासन और प्रबंधन सेवाओं को भुनाता है, विशेष रूप से एसएसएचडी (जिसका अर्थ है कि आप यह पता लगाने के लिए बॉक्स में लॉग इन नहीं कर सकते कि यह वास्तव में कितना खराब है)।

Node.js सिंगल थ्रेडेड और लॉक फ्री है । Node.js, एक बहुत ही जानबूझकर डिजाइन विकल्प के रूप में केवल एक धागा प्रति प्रक्रिया है। इस वजह से, कई थ्रेड्स के लिए एक साथ डेटा एक्सेस करना मूलभूत रूप से असंभव है। इस प्रकार, कोई ताले की जरूरत नहीं है। धागे कठिन हैं। वास्तव में वास्तव में कठिन है। यदि आप ऐसा नहीं मानते हैं, तो आपने पर्याप्त थ्रेडेड प्रोग्रामिंग नहीं की है। सही लॉक करना कठिन है और उन बग्स में परिणाम होता है जो वास्तव में नीचे ट्रैक करने के लिए कठिन हैं। तालों को खत्म करने और मल्टी-थ्रेडिंग के कारण नस्टिएस्ट क्लास के कीड़े दूर हो जाते हैं। यह नोड का सबसे बड़ा लाभ हो सकता है।

लेकिन मैं अपने 16 कोर बॉक्स का लाभ कैसे उठाऊं?

दो तरीके:

  1. छवि एन्कोडिंग जैसे बड़े भारी गणना कार्यों के लिए, Node.js बच्चे की प्रक्रियाओं को आग लगा सकते हैं या अतिरिक्त कार्यकर्ता प्रक्रियाओं को संदेश भेज सकते हैं। इस डिजाइन में, आपके पास एक थ्रेड होगा जो घटनाओं और एन प्रक्रियाओं के प्रवाह को प्रबंधित करता है और भारी गणना कार्य करता है और अन्य 15 सीपीयू को चबाता है।
  2. एक webservice पर थ्रूपुट को स्केल करने के लिए, आपको एक बॉक्स पर एक, एक कोर पर, कई Node.js सर्वर चलाने चाहिए, क्लस्टर का उपयोग करके (Node.js v0.6.x के साथ, आधिकारिक "क्लस्टर" मॉड्यूल यहां से सीखे गए वर्जनस्टॉप वर्जन को बदल देता है। एक अलग एपीआई)। ये स्थानीय Node.js सर्वर तब नए कनेक्शन को स्वीकार करने के लिए एक सॉकेट पर प्रतिस्पर्धा कर सकते हैं, उन पर भार को संतुलित कर सकते हैं। एक बार कनेक्शन स्वीकार कर लेने के बाद, यह इन साझा प्रक्रियाओं में से किसी एक के लिए कसकर बाध्य हो जाता है। सिद्धांत रूप में, यह बुरा लगता है, लेकिन व्यवहार में यह काफी अच्छी तरह से काम करता है और आपको थ्रेड-सुरक्षित कोड लिखने के सिरदर्द से बचने की अनुमति देता है। इसके अलावा, इसका मतलब है कि Node.js को उत्कृष्ट सीपीयू कैश आत्मीयता मिलती है, स्मृति बैंडविड्थ का उपयोग करके अधिक प्रभावी ढंग से।

Node.js आपको पसीने को तोड़ने के बिना कुछ वास्तव में शक्तिशाली चीजें करने देता है। मान लीजिए कि आपके पास एक Node.js प्रोग्राम है जो विभिन्न प्रकार के कार्य करता है,कमांड के लिएएक टीसीपी पोर्टपर सुनता है, कुछ छवियों को एनकोड करता है, जो भी। कोड की पांच पंक्तियों के साथ, आप एक HTTP आधारित वेब प्रबंधन पोर्टल में जोड़ सकते हैं जो सक्रिय कार्यों की वर्तमान स्थिति को दर्शाता है। ऐसा करना आसान है:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

अब आप एक यूआरएल को हिट कर सकते हैं और अपनी चल रही प्रक्रिया की स्थिति की जांच कर सकते हैं। कुछ बटन जोड़ें, और आपके पास "प्रबंधन पोर्टल" है। यदि आपके पास एक रनिंग पर्ल / पायथन / रूबी स्क्रिप्ट है, तो बस "एक प्रबंधन पोर्टल में फेंकना" बिल्कुल सरल नहीं है।

लेकिन क्या जावास्क्रिप्ट धीमी / बुरी / बुरी / बुरी नहीं है? जावास्क्रिप्ट में कुछ अजीब विषमताएं हैं, लेकिन "अच्छे हिस्से" के साथ वहां एक बहुत शक्तिशाली भाषा है, और किसी भी मामले में, क्लाइंट (ब्राउज़र) पर जावास्क्रिप्ट भाषा है। जावास्क्रिप्ट यहाँ रहने के लिए है; अन्य भाषाएँ इसे IL के रूप में लक्षित कर रही हैं, और विश्व स्तर की प्रतिभा सबसे उन्नत जावास्क्रिप्ट इंजन का उत्पादन करने के लिए प्रतिस्पर्धा कर रही है। ब्राउज़र में जावास्क्रिप्ट की भूमिका के कारण, जावास्क्रिप्ट ब्लास्टिंग को तेज करने के लिए इंजीनियरिंग प्रयास का एक बड़ा हिस्सा फेंका जा रहा है। वी 8कम से कम इस महीने के लिए नवीनतम और सबसे बड़ा जावास्क्रिप्ट इंजन है। यह दक्षता और स्थिरता (आपको, रूबी) को देखते हुए अन्य स्क्रिप्टिंग भाषाओं को उड़ा देता है। और यह केवल Microsoft, Google और मोज़िला की समस्या पर काम करने वाली विशाल टीमों के साथ बेहतर होने जा रहा है, सबसे अच्छा जावास्क्रिप्ट इंजन बनाने के लिए प्रतिस्पर्धा कर रहा है (यह अब एक जावास्क्रिप्ट "दुभाषिया" नहीं है क्योंकि सभी आधुनिक इंजन JIT के टन हैंकेवल निष्पादन-एक बार कोड के लिए गिरावट के रूप में व्याख्या के साथ हुड के तहत संकलन। हाँ, हम सभी चाहते हैं कि हम odder जावास्क्रिप्ट भाषा विकल्पों में से कुछ को ठीक कर सकें, लेकिन यह वास्तव में उतना बुरा नहीं है। और भाषा इतनी कठोर लचीली है कि आप वास्तव में जावास्क्रिप्ट कोडिंग नहीं कर रहे हैं, आप स्टेप या jQuery कोडिंग कर रहे हैं - जावास्क्रिप्ट में किसी भी अन्य भाषा से अधिक, पुस्तकालयों ने अनुभव को परिभाषित किया है। वेब एप्लिकेशन बनाने के लिए, आपको बहुत कुछ भी जावास्क्रिप्ट को जानना होगा, इसलिए सर्वर पर इसके साथ कोडिंग करने से एक कौशल-कौशल तालमेल बनता है। इसने मुझे लेखन ग्राहक कोड नहीं बनाया है।

इसके अलावा, यदि आप जावास्क्रिप्ट से वास्तव में नफरत करते हैं, तो आप कॉफीस्क्रिप्ट जैसी सिंथेटिक चीनी का उपयोग कर सकते हैं । या कुछ और जो Google वेब टूलकिट (GWT) की तरह जावास्क्रिप्ट कोड बनाता है ।

जावास्क्रिप्ट की बात करते हुए, "बंद" क्या है? - बहुत सुंदर कहने का एक तरीका है कि आप कॉल चेन में लेक्सिकली स्कॉप्ड वैरिएबल को बनाए रखें। ;) ऐशे ही:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

देखें कि आप किसी वस्तु को किसी वस्तु में बांधने की तरह कुछ भी किए बिना केवल "myData" का उपयोग कैसे कर सकते हैं? और जावा के विपरीत, "myData" चर को केवल पढ़ने के लिए नहीं होना चाहिए। यह शक्तिशाली भाषा सुविधा अतुल्यकालिक-प्रोग्रामिंग को बहुत कम क्रिया और कम दर्दनाक बनाती है।

एसिंक्रोनस कोड लिखना हमेशा सरल सिंगल-थ्रेडेड स्क्रिप्ट लिखने की तुलना में अधिक जटिल होता है, लेकिन Node.js के साथ, यह उतना कठिन नहीं है और आपको हजारों समवर्ती कनेक्शनों के लिए दक्षता और स्केलेबिलिटी के अलावा बहुत सारे लाभ मिलते हैं। ..


"'myData' चर को केवल पढ़ने के लिए नहीं होना चाहिए" - ऐसा लगता है कि आप इसे समकालिक मुद्दों को रोकने के लिए अधिकांश समय अपरिवर्तनीय रखना चाहेंगे, है ना?
निक

1
@ निक - वह झूठा है। "समसामयिक मुद्दों" को इस तथ्य से कम किया जाता है कि नोड एकल थ्रेडेड है। केवल नोड में लॉक करना मौजूद नहीं है; एकल-पिरोया प्रतिमान में इसकी आवश्यकता नहीं है।
डेव डॉपसन

क्लस्टर नोड नोड में एकीकृत किया गया है 0.6 stackoverflow.com/a/8470986/212702 नोड js.org/docs/latest/api/cluster.html#cluster_cluster
लॉरेंट डेब्रिकॉन

1
पीएस, साइड नोट - मैंने वास्तव में इसे पर्याप्त बार संपादित किया कि पोस्ट "सामुदायिक विकि" बन गई (दहलीज 10 संपादन है)। मैंने गलती से सोचा था कि यह किसी प्रकार का सम्मान था, जब वास्तव में यह अपवित्रता से प्रतिष्ठा हासिल करता है। आखिरकार, पूर्व-सीडब्ल्यू-स्थिति मतदाताओं में से एक ने "unvote" पर क्लिक किया (उम्मीद है, दुर्घटना से :) और मैंने प्रतिष्ठा खो दी ... उलझन में मैंने meta.stackexchange.com/questions/129941/… दायर किया और क्या "समुदाय" में स्कूली था विकी ”का वास्तव में मतलब है। सीडब्ल्यू की स्थिति को हटाने के लिए मोड पर्याप्त थे। :)
डेव डॉपसन

1
@ जॉन - मेरी डिबगिंग टिप्पणी पूरी तरह से वैनिला asnyc पर भी लागू होती है। डिबगिंग को तोड़ने के लिए, मुझे बस इतना करना होगा कि "process.nextTick (...)" में कुछ फ़ंक्शन कॉल लपेटें। फिर जब यह फेंकता है, तो मेरा स्टैक ट्रेस प्रक्रिया के साथ शुरू होगा ।nextTick; इतना मददगार नहीं। मैं वास्तव में जानना चाहता हूं: "कौन सी प्रक्रिया अनुसूचित है ।nextTick?" मैं उस डेटा को "कारण श्रृंखला" कहता हूं, और यह मुझे जावा अपवाद अपवाद में 'कारण' की याद दिलाता है ... निम्न स्तर कोड फेंकता है, मिड लेवल कोड एलएल अपवाद को पकड़ता है और फ्रेमवर्कमेथोडफ़ेल्ड अपवाद - बिना 'कारण', एलएल से स्टैक कोड खो जाएगा।
डेव डॉपसन

85

V8 जावास्क्रिप्ट का एक कार्यान्वयन है। यह आपको स्टैंडअलोन जावास्क्रिप्ट एप्लिकेशन (अन्य चीजों के बीच) चलाने देता है।

Node.js बस V8 के लिए लिखी गई एक लाइब्रेरी है जो I / O को इवेंट करती है। इस अवधारणा को समझाने के लिए थोड़ा मुश्किल है, और मुझे यकीन है कि कोई मुझे बेहतर स्पष्टीकरण के साथ जवाब देगा ... यह है कि कुछ इनपुट या आउटपुट करने और इसके होने की प्रतीक्षा करने के बजाय, आप बस इंतजार नहीं करते इसे खत्म करने के लिए। उदाहरण के लिए, फ़ाइल के अंतिम संपादित समय के लिए पूछें:

// Pseudo code
stat( 'somefile' )

यह कुछ सेकंड मिल सकता है, या यह सेकंड ले सकता है। घटना के साथ I / O आप बस अनुरोध को बंद कर देते हैं और इसके बजाय अपने चारों ओर प्रतीक्षा करने पर कॉलबैक देते हैं जो अनुरोध समाप्त होने पर चला जाता है:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

यह ब्राउज़र में जावास्क्रिप्ट कोड की तरह बहुत कुछ बनाता है (उदाहरण के लिए, अजाक्स शैली की कार्यक्षमता के साथ)।

अधिक जानकारी के लिए, आपको इस लेख की जांच करनी चाहिए कि नोड.जेएस वास्तव में रोमांचक है जो पुस्तकालय / मंच से मेरा परिचय था ... मुझे यह काफी अच्छा लगा।


4
बिना थ्रेडिंग, प्रक्रिया, क्लोजर का उपयोग करके आईओ को कैसे लागू किया जाता है? और मुझे लगता है कि अवधारणाएं कार्यात्मक प्रोग्रामिंग और एर्लैंग के समान हैं।
जेफ

1
यह एक साधारण ईवेंट लूप के रूप में कार्यान्वित किया जाता है, जहाँ तक मुझे पता है। v8 में कॉलबैक / आदि की कार्यक्षमता पहले से ही है, किसी भी जावास्क्रिप्ट कार्यान्वयन की तरह।
rfunduk

2
नोड.जेएस के IO ईवेंट लूप का अर्थ है कि किसी भी समय पर केवल एक ही चीज पर काम किया जा रहा है। मुझे दो महत्वपूर्ण लाभ दिखाई देते हैं: थ्रेड स्विचिंग का कोई ओवरहेड नहीं है, इसलिए नोड.जेएस बहुत तेज़ है, और दूसरी बात यह है कि जावा के लिए कुख्यात कई विशिष्ट संगरोध बग संभव नहीं हैं।
nalply

1
"बिना उपयोग किए IO को कैसे कार्यान्वित किया जाता है ... क्लोजर?" जावास्क्रिप्ट क्लोजर का समर्थन करता है और वे नोड में हर समय उपयोग किए जाते हैं। जेएस (उदाहरण में अनाम फ़ंक्शन ans)।
पनजी

@ अपंजी: ध्यान नहीं दिया कि जेफरी ने अपनी चीजों की सूची में क्लोज़र को शामिल किया। नोड को 'बिना' के लागू किया गया है। जाहिर है कि जावास्क्रिप्ट में प्रत्येक फ़ंक्शन इसके दायरे के आसपास एक
करीबी है

35

Node.js एक ओपन सोर्स कमांड लाइन टूल है जो सर्वर साइड जावास्क्रिप्ट कोड के लिए बनाया गया है। आप एक टारबॉल डाउनलोड कर सकते हैं , स्रोत को संकलित और स्थापित कर सकते हैं। यह आपको जावास्क्रिप्ट प्रोग्राम चलाने देता है।

जावास्क्रिप्ट को V8 द्वारा निष्पादित किया जाता है , Google द्वारा विकसित एक जावास्क्रिप्ट इंजन जो क्रोम में उपयोग किया जाता है ब्राउज़र है। यह नेटवर्क और फ़ाइल सिस्टम तक पहुंचने के लिए एक जावास्क्रिप्ट एपीआई का उपयोग करता है।

यह अपने प्रदर्शन और समानांतर संचालन करने की क्षमता के लिए लोकप्रिय है।

नोड.जेएस को समझना नोड का सबसे अच्छा स्पष्टीकरण है। जेएस मुझे अब तक मिला है।

विषय पर कुछ अच्छे लेख निम्नलिखित हैं।


13

क्लोजर उस संदर्भ में कोड निष्पादित करने का एक तरीका है जो इसमें बनाया गया था।

सहमति के लिए इसका मतलब यह है कि आप चर को परिभाषित कर सकते हैं, फिर एक नॉनब्लॉकिंग I / O आरंभ करें फ़ंक्शन , और इसके कॉलबैक के लिए एक अनाम फ़ंक्शन भेज सकते हैं।

जब कार्य पूरा हो जाता है, तो कॉलबैक फ़ंक्शन चर के संदर्भ में निष्पादित होगा, यह क्लोजर है।

कारण क्लोज़र नॉनब्लॉकिंग I / O के साथ एप्लिकेशन लिखने के लिए बहुत अच्छे हैं, यह है कि अतुल्यकालिक रूप से निष्पादित कार्यों के संदर्भ को प्रबंधित करना बहुत आसान है।


8

दो अच्छे उदाहरण इस बारे में हैं कि आप कैसे टेम्पलेट्स का प्रबंधन करते हैं और इसके साथ प्रगतिशील संवर्द्धन का उपयोग करते हैं। इसे पूरी तरह से काम करने के लिए आपको जावास्क्रिप्ट कोड के कुछ हल्के टुकड़ों की आवश्यकता है।

मैं दृढ़ता से अनुशंसा करता हूं कि आप ये लेख देखें और पढ़ें:

किसी भी भाषा को चुनें और यह याद रखने की कोशिश करें कि आप अपने HTML फ़ाइल टेम्प्लेट को कैसे प्रबंधित करेंगे और आपको अपनी DOM संरचना में एकल CSS वर्ग का नाम अपडेट करने के लिए क्या करना है (उदाहरण के लिए, एक उपयोगकर्ता मेनू आइटम पर क्लिक करता है और आप चाहते हैं कि वह चिह्नित हो "चयनित" और पृष्ठ की सामग्री को अपडेट करें)।

Node.js के साथ यह क्लाइंट-साइड जावास्क्रिप्ट कोड में करने जैसा ही सरल है। अपना DOM नोड प्राप्त करें और उस पर अपना CSS वर्ग लागू करें। अपना DOM नोड और भीतर का HTML अपनी सामग्री प्राप्त करें (ऐसा करने के लिए आपको कुछ अतिरिक्त जावास्क्रिप्ट कोड की आवश्यकता होगी। और जानने के लिए लेख पढ़ें)।

एक और अच्छा उदाहरण यह है कि आप अपने वेब पेज को उसी कोड के साथ जावास्क्रिप्ट को चालू या बंद कर सकते हैं। कल्पना कीजिए कि आपके पास जावास्क्रिप्ट में एक तारीख चयन है जो आपके उपयोगकर्ताओं को कैलेंडर का उपयोग करके किसी भी तारीख को लेने की अनुमति देगा। आप जावास्क्रिप्ट कोड के एक ही टुकड़े को अपने जावास्क्रिप्ट को चालू या बंद करने के लिए लिख सकते हैं (या उपयोग कर सकते हैं)।


7

एक बहुत अच्छा फास्ट फूड प्लेस सादृश्य है जो सबसे अच्छी तरह से Node.js के इवेंट संचालित मॉडल की व्याख्या करता है, पूरा लेख देखें, Node.js, डॉक्टर के कार्यालय और फास्ट फूड रेस्तरां - इवेंट-संचालित प्रोग्रामिंग को समझना

यहाँ एक सारांश है:

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

Node.js ईवेंट-चालित है, लेकिन अधिकांश वेब सर्वर थ्रेड-आधारित हैं। यॉर्क बताता है कि Node.js कैसे काम कर सकता है:

  • Node.js वेब सर्वर पर "/about.html" के लिए अनुरोध करने के लिए आप अपने वेब ब्राउज़र का उपयोग करते हैं।

  • Node.js सर्वर आपके अनुरोध को स्वीकार करता है और डिस्क से उस फ़ाइल को पुनः प्राप्त करने के लिए एक फ़ंक्शन को कॉल करता है।

  • जबकि Node.js सर्वर फ़ाइल के पुनः प्राप्त होने की प्रतीक्षा कर रहा है, यह अगले वेब अनुरोध की सेवा प्रदान करता है।

  • जब फ़ाइल पुनर्प्राप्त होती है, तो एक कॉलबैक फ़ंक्शन होता है जिसे Node.js सर्वर कतार में डाला जाता है।

  • Node.js सर्वर उस फ़ंक्शन को निष्पादित करता है जो इस मामले में "/about.html" पृष्ठ को प्रस्तुत करेगा और इसे आपके वेब ब्राउज़र पर वापस भेज देगा।


6

खैर, मैं समझता हूं कि

  • नोड का लक्ष्य स्केलेबल नेटवर्क प्रोग्राम बनाने का एक आसान तरीका प्रदान करना है।
  • रूडी के इवेंट मशीन या पाइथन ट्विस्टेड जैसी प्रणालियों से डिजाइन और प्रभाव में नोड समान है।
  • V8 जावास्क्रिप्ट के लिए I / O का आयोजन किया।

मेरे लिए इसका मतलब है कि आप तीनों धारणाओं में सही थे। पुस्तकालय सुनिश्चित होनहार लग रहा है!


1
पृष्ठ के बारे में मुझे लगता है कि बहुत बार अस्पष्ट है।
जेफ

6

इसके अलावा, यह बताना न भूलें कि Google का V8 बहुत तेज़ है। यह वास्तव में संकलित बाइनरी के मिलान प्रदर्शन के साथ जावास्क्रिप्ट कोड को मशीन कोड में परिवर्तित करता है। तो अन्य सभी महान चीजों के साथ, यह तेजी से अंदर है।


3

प्रश्न: प्रोग्रामिंग मॉडल ईवेंट संचालित है, विशेष रूप से जिस तरह से यह I / O हैंडल करता है ।

सही बात। यह कॉल-बैक का उपयोग करता है, इसलिए फ़ाइल सिस्टम तक पहुंचने के किसी भी अनुरोध के कारण फ़ाइल सिस्टम को भेजा जाएगा और फिर Node.js अपने अगले अनुरोध को संसाधित करना शुरू कर देगा। यह केवल I / O अनुरोध के बारे में चिंता करेगा क्योंकि एक बार इसे फाइल सिस्टम से प्रतिक्रिया मिल जाती है, जिस समय यह कॉलबैक कोड चलाएगा। हालाँकि, समकालिक I / O अनुरोध करना संभव है (अर्थात, अवरुद्ध अनुरोध)। यह एसिंक्रोनस (कॉलबैक) या सिंक्रोनस (प्रतीक्षा) के बीच चयन करने के लिए डेवलपर पर निर्भर है।

प्रश्न: यह जावास्क्रिप्ट का उपयोग करता है और पार्सर V8 है।

हाँ

प्रश्न: समवर्ती सर्वर अनुप्रयोगों को बनाने के लिए इसका उपयोग आसानी से किया जा सकता है।

हाँ, हालाँकि आपको जावास्क्रिप्ट को बहुत अधिक हाथ-कोड की आवश्यकता होगी। एक रूपरेखा को देखना बेहतर हो सकता है, जैसे कि http://www.easynodejs.com/ - जो पूर्ण ऑनलाइन प्रलेखन और एक नमूना आवेदन के साथ आता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.