2010-09-14 12 views
18

जेएस में कुछ अनुभव वाले किसी व्यक्ति से नहीं, आप Node.js सीखने के लिए क्या सलाह देते हैं?node.js

मैंने ईवेंट संचालित, गैर-अवरुद्ध, एसिंक, कॉलबैक इत्यादि के बारे में मंच में बहुत कुछ पढ़ा लेकिन मुझे नहीं पता कि वह क्या है!

मैं उन सभी शर्तों और भविष्य में, node.js को समझने के लिए मूल बातें कहां से सीख सकता हूं?

धन्यवाद!

+4

बहुत सारे जावास्क्रिप्ट प्रोग्राम लिखने और इसे अच्छी और उचित करने की देखभाल करने के साथ शुरू करें। यदि आप जावास्क्रिप्ट और संबंधित तकनीकों को नहीं समझते हैं तो भी नोडजेएस पर विचार करने का कोई मतलब नहीं है। मेरा कठोर होने का मतलब नहीं है, लेकिन आपको वह सीखने की ज़रूरत है; जावास्क्रिप्ट और इसका उपयोग कैसे किया जाता है और इसका उपयोग कैसे किया जाता है, ये मूल बातें हैं। Ergo, मास्टर जावास्क्रिप्ट पहले;) stackoverflow पर उस पर बहुत सारे awnsers। – BGerrissen

+0

आपकी टिप्पणी के लिए धन्यवाद। मुझे जेएस सीखना मुश्किल लगता है क्योंकि मुझे नहीं पता कि इसके साथ क्या करना है। अगर मैं Django, रेल, आदि सीखना चाहता हूं, तो मुझे पता है कि जावास्क्रिप्ट नहीं करना है। साथ ही, क्या आप एक अच्छी किताब की सिफारिश कर सकते हैं जो मूल रूप से node.js ज्ञान के लिए मूल बातें रख सकती है? धन्यवाद – donald

+1

बस node.js. पर एक नज़र डाली थी। यह सिर्फ जेएस सिंटैक्स का उपयोग कर रहा है जैसे कि jQuery है। क्या आपको लगता है कि node.js का उपयोग करते समय जावास्क्रिप्ट का गहरा ज्ञान अधिक सहायक होगा? वैसे भी, पढ़ने के लिए पुस्तक जावास्क्रिप्ट है: निश्चित गाइड – mplungjan

उत्तर

49

आपके द्वारा उल्लिखित अवधारणाओं (घटना-संचालित, गैर-अवरुद्ध, एसिंक, कॉलबैक) जावास्क्रिप्ट के लिए विशिष्ट नहीं हैं और उन्हें अधिक सामान्य संदर्भ में समझना मूल्यवान है। वे सभी संसाधनों को सुदृढ़ तरीके से संभालने के आसपास घूमते हैं जिन पर हमारा कोई नियंत्रण नहीं होता है।

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

कई मामलों में, यह इंगित करना बेहतर होगा कि संसाधन में रुचि होने पर हम संसाधन में रूचि रखते हैं और चरण-दर-चरण निर्देशों के बाहर सूचनाएं प्राप्त करते हैं। अवधारणाओं की अपनी सूची से:

  • Events संसाधनों हम में रुचि रखते हैं में परिवर्तन कर रहे हैं - हमारे TCP कनेक्शन कुछ डेटा प्राप्त किया, फ़ाइल को हटाने पूरा हो गया है, या एक उपयोगकर्ता एक बटन क्लिक किया।
  • Asynchronous कॉल ओएस या रनटाइम को बताते हैं कि हम संसाधन के साथ कुछ करने में रुचि रखते हैं। वे गैर-अवरुद्ध हैं - संसाधन में बदलाव के लिए इंतजार करते समय हमारा प्रोग्राम कुछ और काम कर सकता है।
  • Callbacks संसाधन बदलते समय निष्पादित किए जाने वाले कार्य होते हैं। एक एसिंक्रोनस संसाधन कॉल अक्सर कॉलबैक फ़ंक्शंस के लिए एक या अधिक संदर्भ स्वीकार करता है (सफलता के लिए एक, एक त्रुटि के लिए, इत्यादि ...)। जब संसाधन बदलता है, रनटाइम उपयुक्त कॉलबैक को कॉल करता है।

हम इन अवधारणाओं Node.js के साथ एक फ़ाइल का नाम बदलने करके इसका उदाहरण देख सकते हैं:

var fs = require('fs'); 

// args (current file name, new file name, callback function) 
fs.rename('/tmp/hello', '/tmp/world', function (err) { 
    // this occurs when the rename is complete 
    if (err) throw err; 
    console.log('rename complete'); 
}); 
console.log('step after rename'); 

तीसरा तर्क अजीब लग सकता है। यह एक अनाम (anonymous) फ़ंक्शन है जिसे नाम पूर्ण होने पर बुलाया जाएगा।

ध्यान दें कि चूंकि fs।नाम अतुल्यकालिक है, यह बताना असंभव है कि क्या हम पहले 'नाम बदलें' या 'नाम बदलने के बाद चरण' देखेंगे। यह घटना-संचालित/असीमित प्रोग्रामिंग का नकारात्मक पक्ष है - यदि हमारे पास परस्पर निर्भर कार्यों का एक जटिल सेट है, तो हमें उन कार्यों पर कार्य करने से पहले निर्भर कार्यों को बीमा करने के लिए बेहद सावधान रहना होगा। तथ्य यह है कि एसिंक कॉल समापन का क्रम बदल सकता है बहुत सूक्ष्म बग का कारण बन सकता है।

यह भी देखें:


संपादित की और अधिक जटिल हेरफेर:

को समझने के लिए सबसे अच्छा तरीका है node.js डाउनलोड, बिल्ड, इंस्टा है ll, और इसका इस्तेमाल करें। आपको इसकी आवश्यकता होगी:

  • मैक ओएस या लिनक्स। यदि आप सिग्विन के साथ सहज हैं, तो यह एक विकल्प भी हो सकता है लेकिन यदि आप विंडोज़ चला रहे हैं तो मुझे वर्चुअल मशीन में लिनक्स चलाने में आसान लगता है।
  • Git - आवश्यक नहीं है लेकिन यह कोड भंडार को आसान बनाता है।
  • अपने आवेदन को डीबग करने का एक तरीका। this question देखें। प्रारंभ में, कंसोल में डीबग जानकारी लिखना काम कर सकता है। आखिरकार, आप मजबूत डीबगिंग चाहते हैं।
  • एक विचार - आप node.js के साथ क्या करना चाहते हैं? यदि आप इसकी क्षमताओं के अवलोकन में रूचि रखते हैं, तो its API ब्राउज़ करें।

    • Going evented with Node.js (भंडार, इमारत को डाउनलोड करने का एक सरल संस्करण से पता चलता स्थापित करने, और)
    • A game lobby
    • :

    अधिकांश ट्यूटोरियल Node.js की जल्दी से एक HTTP सर्वर का निर्माण करने की क्षमता पर ध्यान केंद्रित An Http server with Html templating

ध्यान रखें कि node.js एक बहुत ही खास जगह भरता है - i टी नेटवर्क प्रोग्राम बनाने के लिए डिज़ाइन किया गया है। यह अन्य प्रकार के कार्यक्रमों के लिए सही उपकरण नहीं हो सकता है।

+1

कॉर्बिन, धन्यवाद आपकी व्याख्या क्या आप कुछ अन्य संदर्भ भी जोड़ सकते हैं जो मुझे node.js की समझ में मदद कर सकते हैं? आप जो कुछ मानते हैं वह प्रासंगिक है। धन्यवाद – donald

+0

आपके उत्तर में प्रयास करने का तरीका [अपवित्र] –

+0

ग्रेट उत्तर कॉर्बिन! –

0

ठीक है, इस स्टैक ओवरफ्लो प्रश्न में बहुत सारे चांदनी हैं जो आपको जेएस सीखने के बारे में और अधिक सिखाएंगे।

https://stackoverflow.com/questions/3696199/how-can-i-truly-master-javascript/3696765#3696765

जावास्क्रिप्ट मूल बातें वास्तव में एक ही मूल बातें के रूप में किसी भी अन्य भाषाओं (हैलो दुनिया एप्लिकेशन, आदि), वास्तविक अंतर जावास्क्रिप्ट का 'उन्नत क्षेत्रों में निहित हैं।

6

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

नोड में, आप जिन कार्यों को कॉल कर सकते हैं वे गैर-अवरुद्ध हैं। जब आप fs.ReadStream() को कॉल करते हैं, उदाहरण के लिए, यह एक पठनीयस्ट्रीम ऑब्जेक्ट देता है। वह ऑब्जेक्ट एक EventEmitter है, इसलिए स्ट्रीम की सामग्री के साथ कुछ भी करने के लिए, आपको ऑब्जेक्ट में श्रोता संलग्न करने की आवश्यकता होती है, जो एक ऐसा फ़ंक्शन होता है जिसे किसी विशेष ईवेंट के दौरान बुलाया जाता है।

तो कुछ इस तरह काम करता है:

var fs=require('fs'); 
var stream = fs.createReadStream("/var/log/messages", { 'flags':'r' }); 
stream.addListener('data', function(someData) { 
     console.log(someData); 
}); 

यह दिया फ़ाइल से पाठ के सभी पढ़ता है, और यह कंसोल के लिए लिखता है। जब स्ट्रीम से पढ़ने के लिए डेटा होता है, तो आपके फ़ंक्शन को कॉल किया जाता है, और फ़ाइल से डेटा पास कर दिया जाता है।

दिलचस्प बात यह है कि, फ़ाइल से पढ़ने के लिए कोई और डेटा नहीं होने पर, स्क्रिप्ट निकलती है। नोड केवल तब तक चल रहा है जब एक एमिटर से जुड़ा एक वैध ईवेंट श्रोता है, या एक अन्य एसिंक्रोनस कॉलबैक (टाइमर की तरह) सक्रिय है।

+1

धन्यवाद। मुझे उस उदाहरण से क्या समझ में नहीं आता है, जहां फ़ंक्शन (कुछडेटा) कहा जाता है और "कुछडेटा" क्या होता है। मुझे कुछ भी नहीं दिख रहा है जो कुछ डेटा को तर्क देता है। धन्यवाद – donald

+0

स्ट्रीम ऑब्जेक्ट उन घटनाओं को उत्सर्जित करना शुरू करता है, दृश्यों के पीछे फ़ंक्शन (कुछडेटा) को कॉल करना। – Unoti

+0

दाएं। प्रत्येक इवेंट एमिटर में इवेंट श्रोताओं की एक सूची होती है जो प्रत्येक घटना के लिए आग लग सकती है। जब कोई घटना आग लगती है, तो प्रत्येक श्रोताओं को बुलाया जाता है। –

4

«Javascript: The Good Parts» भाषा के इंस और आउट सीखने के लिए कभी भी सबसे अच्छी किताबों में से एक है और न केवल डोम सामान।