แนวคิดพื้นฐาน
Node.js หรือโหนดเป็นแพลตฟอร์มที่อนุญาตให้ JavaScript ทำงานบนฝั่งเซิร์ฟเวอร์ อาจกล่าวได้ว่า Node.js เป็นผู้บุกเบิกการพัฒนาแบบแยกส่วนของ javascript ข้อกำหนด javascript ต้นนั้นง่ายมากและโดยทั่วไปแล้วจะถูกเขียนเป็นฟังก์ชั่นตามด้วยการเขียนเชิงกระบวนการ ต่อมามีการแนะนำแนวคิดการพัฒนาเชิงวัตถุค่อยๆได้รับการแนะนำและจากนั้นพวกเขาจะถูกเขียนช้าลงในชั้นเรียน ในที่สุดการเกิดขึ้นของ node.js เริ่มมีแนวคิดของการพัฒนาแบบแยกส่วน JS ซึ่งกำจัดรหัส js ที่ป่องเช่นการตั้งชื่อความขัดแย้งและปัญหาการพัฒนาอื่น ๆ
คุณสมบัติที่ใหญ่ที่สุด Node คือการใช้ I/O แบบอะซิงโครนัสและการออกแบบสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ Node.js เป็นแพลตฟอร์มที่อนุญาตให้ JS ทำงานนอกเบราว์เซอร์ เป้าหมายเริ่มต้นคือการใช้งานเว็บเซิร์ฟเวอร์ I/O ที่ขับเคลื่อนด้วยเหตุการณ์
Node.js เป็นเพียงสภาพแวดล้อมที่ใช้งาน JavaScript (หรือชุดไลบรารี) ซึ่งเสริม js มาตรฐานด้วยฟังก์ชั่นของ IO แบบอะซิงโครนัสนั่นคือการอ่านและการเขียนเครือข่ายและไฟล์
ในฐานะห้องสมุดมันไม่มีอะไรมากไปกว่าการปรับแต่ง API นอกเหนือจากการโทรกลับเหตุการณ์ต่อต้านมนุษย์เล็กน้อยแล้วมันไม่ได้แตกต่างจากภาษาแบ็คเอนด์อื่น ๆ (PHP, Python)
Node.js ใช้โหมดเธรดเดียว แต่ละเธรดเสร็จสิ้นฟังก์ชั่น กระบวนการสามารถมีหลายเธรด I/OS ทั้งหมดใช้ในวิธีการร้องขอแบบอะซิงโครนัส หลังจากคำขอ I/O แบบอะซิงโครนัสแต่ละครั้งจะเสร็จสมบูรณ์แล้วมันจะถูกส่งไปยังคิวเหตุการณ์และรอกระบวนการโปรแกรมเพื่อดำเนินการ
ในระยะสั้นแนวคิดหลักของ node คือ: การไม่ปิดกั้น, เธรดเดี่ยวและการขับเคลื่อนเหตุการณ์ (ซิงโครนัสสอดคล้องกับการปิดกั้นอะซิงโครนัสสอดคล้องกับการไม่ปิดกั้น)
ไดอะแกรมสถาปัตยกรรม Node.JS
เกลียวเดี่ยว
สภาพแวดล้อมการดำเนินการของภาษา javascript คือ "เธรดเดี่ยว"
"เธรดเดี่ยว" ที่เรียกว่า "งานหนึ่งสามารถเสร็จสิ้นได้ในแต่ละครั้งเท่านั้น หากมีหลายงานคุณต้องเข้าคิวให้ทำภารกิจก่อนหน้าให้เสร็จสิ้นงานถัดไปและอื่น ๆ
ข้อได้เปรียบของโมเดลนี้คือมันค่อนข้างง่ายที่จะนำไปใช้และสภาพแวดล้อมการดำเนินการค่อนข้างง่าย ข้อเสียคือตราบใดที่มีงานที่ใช้เวลานานงานที่ตามมาจะต้องเข้าคิวซึ่งจะทำให้การดำเนินการของโปรแกรมทั้งหมดล่าช้า เบราว์เซอร์ทั่วไปไม่ตอบสนอง (การตายปลอม) บ่อยครั้งเนื่องจากรหัส Javascript บางชิ้นทำงานเป็นเวลานาน (เช่นวนซ้ำ) ทำให้หน้าทั้งหมดติดอยู่ในสถานที่นี้และงานอื่น ๆ ไม่สามารถดำเนินการได้
คอขวดของเว็บแอปพลิเคชันส่วนใหญ่อยู่ใน I/O นั่นคืออ่านและเขียนดิสก์อ่านและเขียนเครือข่ายและอ่านและเขียนฐานข้อมูล กลยุทธ์ใดที่จะใช้เพื่อรอช่วงเวลานี้ได้กลายเป็นจุดสำคัญในการปรับปรุงประสิทธิภาพ
ซิงโครนัสและอะซิงโครนัส
เพื่อแก้ปัญหานี้ภาษา Javascript แบ่งโหมดการดำเนินการของงานออกเป็นสองประเภท: ซิงโครนัส (ซิงโครนัส) และอะซิงโครนัส (อะซิงโครนัส)
"โหมดซิงโครนัส" เป็นโหมดของส่วนก่อนหน้า งานหลังรอให้งานก่อนหน้าจบลงแล้วดำเนินการ คำสั่งการดำเนินการของโปรแกรมนั้นสอดคล้องกันและซิงโครนัสกับลำดับการจัดเรียงของงาน "โหมดอะซิงโครนัส" นั้นแตกต่างกันอย่างสิ้นเชิง แต่ละงานมีฟังก์ชั่นการโทรกลับอย่างน้อยหนึ่งฟังก์ชั่น ( callback ) หลังจากงานก่อนหน้านี้จบแล้วมันไม่ใช่งานต่อไป แต่ฟังก์ชั่นการโทรกลับจะถูกดำเนินการ งานหลังดำเนินการโดยไม่ต้องรอให้งานก่อนหน้าจบลงดังนั้นลำดับการดำเนินการของโปรแกรมจึงไม่สอดคล้องกันและแบบอะซิงโครนัสกับลำดับการจัดเรียงของงาน
"โหมด async" มีความสำคัญมาก ในด้านเบราว์เซอร์การดำเนินงานระยะยาวควรดำเนินการแบบอะซิงโครนัสเพื่อหลีกเลี่ยงเบราว์เซอร์จากการสูญเสียการตอบสนอง ตัวอย่างที่ดีที่สุดคือการดำเนินการ AJAX ทางด้านเซิร์ฟเวอร์ "โหมดอะซิงโครนัส" เป็นโหมดเดียวเนื่องจากสภาพแวดล้อมการดำเนินการเป็นเธรดเดี่ยวหากคำขอ http ทั้งหมดได้รับอนุญาตให้ดำเนินการแบบซิงโครนัสประสิทธิภาพของเซิร์ฟเวอร์จะลดลงอย่างรวดเร็วและจะสูญเสียการตอบกลับในไม่ช้า
กระบวนการและเธรด
กระบวนการและเธรดในระบบ MAC
จากรูปเราจะเห็นว่ากระบวนการสามารถรวมหลายเธรด กระบวนการเป็นเหมือนการประชุมเชิงปฏิบัติการในโครงการ เธรดเป็นคนงานในการประชุมเชิงปฏิบัติการนี้ ในระบบปฏิบัติการที่แนะนำเธรดพวกเขามักจะใช้กระบวนการเป็นหน่วยพื้นฐานสำหรับการจัดสรรทรัพยากรและเธรดเป็นหน่วยพื้นฐานสำหรับการทำงานอิสระและการกำหนดเวลาอิสระ เนื่องจากเธรดมีขนาดเล็กกว่ากระบวนการและโดยทั่วไปไม่ได้เป็นเจ้าของทรัพยากรระบบค่าใช้จ่ายของการกำหนดเวลาจะมีขนาดเล็กลงมากซึ่งสามารถปรับปรุงระดับของการดำเนินการพร้อมกันระหว่างหลายโปรแกรมในระบบได้อย่างมีประสิทธิภาพมากขึ้น
ความแตกต่าง
ความแตกต่างระหว่างเธรดและกระบวนการคือกระบวนการเด็กและกระบวนการพาเรนต์มีรหัสและช่องว่างข้อมูลที่แตกต่างกันในขณะที่หลายเธรดแบ่งปันพื้นที่ข้อมูลแต่ละเธรดมีสแต็กการดำเนินการของตัวเองและตัวนับโปรแกรมสำหรับบริบทการดำเนินการ มัลติเธรดส่วนใหญ่ใช้เพื่อประหยัดเวลา CPU และใช้ตามสถานการณ์เฉพาะ จำเป็นต้องใช้ทรัพยากรหน่วยความจำของคอมพิวเตอร์และ CPU ในระหว่างการทำงานของเธรด
โมดูลและโมดูลแพ็คเกจ
โมดูล: ไฟล์ที่ใช้ฟังก์ชั่นเฉพาะบางอย่างเพื่อใช้การเขียนโปรแกรมแบบแยกส่วน แนะนำโมดูลผ่านต้องการ (ชื่อโมดูล)
- ฟังก์ชั่นในโมดูล (เช่นตัวแปรฟังก์ชั่น) ให้กับผู้โทรโดยการกำหนดคุณสมบัติให้กับวัตถุ exports
วิธีใช้โมดูล?
สะดวกมากในการใช้โมดูลในโหนด ในรหัส JavaScript คุณสามารถใช้ฟังก์ชั่ require() เพื่อโหลดโมดูล ตัวอย่างเช่นเราสามารถใช้ require("http") เพื่อโหลดโมดูลเซิร์ฟเวอร์ HTTP ที่มาพร้อมกับ node
ถุง
แพ็คเกจ: แพ็คเกจเป็นโฟลเดอร์ที่ห่อหุ้มโมดูลสำหรับการเปิดตัวอัปเดตการจัดการการพึ่งพาและการควบคุมเวอร์ชัน อธิบายข้อมูลแพ็คเกจผ่าน package.json: ไฟล์รายการ, แพ็คเกจภายนอกที่พึ่งพา ฯลฯ ติดตั้งแพ็คเกจผ่านคำสั่ง npm install และใช้แพ็คเกจผ่าน require
I/O แบบอะซิงโครนัสและกิจกรรมที่ขับเคลื่อนด้วยเหตุการณ์
Node.js 'กลไกอะซิงโครนัสเป็นไปตามเหตุการณ์ แต่ละ I/O เป็นคำขอ ดิสก์ I/O ทั้งหมดการสื่อสารเครือข่ายและการสืบค้นฐานข้อมูลจะถูกร้องขอในลักษณะที่ไม่ปิดกั้น ผลลัพธ์ที่ส่งคืนจะถูกประมวลผลโดยลูปเหตุการณ์ ดังที่แสดงในรูปด้านล่าง:
กระบวนการ Node.js จะดำเนินการเพียงครั้งเดียวในเวลาเดียวกันและป้อนลูปเหตุการณ์ทันทีเพื่อตรวจสอบและประมวลผลเหตุการณ์ที่ตามมาหลังจากเสร็จสิ้น ข้อได้เปรียบของสิ่งนี้คือ CPU และหน่วยความจำมีอยู่ในเวลาเดียวกันเพื่อรวมศูนย์สิ่งหนึ่งในขณะที่อนุญาตให้ใช้การดำเนินการ I/O ที่ใช้เวลานาน
เริ่มการเขียนโปรแกรมโหนด
ที่นี่ฉันขอแนะนำให้คุณใช้ webstorm สำหรับการพัฒนา node.js ซึ่งสะดวกและรวดเร็วและใช้งานง่ายกว่า CMD หรือเทอร์มินัลภายใต้ Mac
สำหรับการติดตั้งโหนดโปรด Baidu ด้วยตัวคุณเอง ฉันจะไม่เข้าไปดูรายละเอียดที่นี่ มาดูอินเทอร์เฟซการเขียนโปรแกรมโหนดภายใต้ webstorm :
เราแค่ต้องคลิกขวาที่อินเทอร์เฟซรหัสโหนดที่เขียนแล้วคลิก Run ซึ่งสะดวกและรวดเร็ว
ต่อไปนี้เป็นอินเทอร์เฟซเอาต์พุตของโหนด:
ในระบบ Mac ฉันขอแนะนำเครื่องมือสามอย่างที่ฉันใช้: Coda2, Webstorm และ Sublime Text3 นี่คือเครื่องมือการพัฒนาที่ดีที่สุดที่ฉันมีจนถึงตอนนี้ คุณอาจลองลองว่าอันไหนสอดคล้องกับรสนิยมของคุณ
สำหรับการพัฒนาโหนดใน webstorm คุณต้องกำหนดค่าไฟล์บางไฟล์ก่อน ทุกคนควรใช้ Baidu เพื่อทำมัน เนื่องจาก webstorm ของฉันได้รับการกำหนดค่าฉันจึงไม่สามารถถ่ายภาพหน้าจอเพื่อแสดงขั้นตอนให้คุณได้ ขั้นตอนทั่วไปคือ: ภายใต้ระบบ MAC ให้คลิก webstorm ก่อนในแถบด้านบนจากนั้นคลิก perference จากนั้นคลิก Node.js and NPM จากนั้นคลิกกำหนดค่าทางด้านขวาและในที่สุดมันก็จะมีลักษณะดังต่อไปนี้:
ขั้นตอนของกระบวนการภายใต้ระบบ windows นั้นคล้ายกับกระบวนการนี้ เวอร์ชันที่ฉันใช้คือ 8.0.4
ตัวแปรทั่วโลก
ในการเขียนโปรแกรม JS จะเป็นการดีที่สุดที่จะเพิ่มคำหลัก VAR ให้กับตัวแปรแต่ละตัวเพื่อหลีกเลี่ยงมลพิษทางเนมสเปซทั่วโลกและเพิ่มความเสี่ยงของการมีเพศสัมพันธ์รหัส
ปลอบประโลม
console ใช้ในการส่งออกอักขระไปยัง Stream Stream Stream มาตรฐาน ( standout ) และ StreaR Stream มาตรฐาน (StderR)
console.log() พิมพ์อักขระไปยังสตรีมเอาท์พุทมาตรฐานและสิ้นสุดด้วยบรรทัดใหม่ซึ่งยอมรับพารามิเตอร์หลายตัวและจะเป็นเอาต์พุตในรูปแบบ c-like printf()
console.log(__dirname)输出文件目录คำนวณรหัสเวลาทำงาน
console.time(label) console.timeEnd(label)เราเพียงแค่ต้องให้ป้ายกำกับเดียวกันในตอนต้นและสิ้นสุดและใส่รหัสใด ๆ ที่คุณต้องการคำนวณเวลาดำเนินการตรงกลาง
__filename และ __dirname
console.log(__filename);// /Users/hwax/Desktop/My Project/avalon/hello.js console.log(__dirname);// /Users/hwax/Desktop/My Project/avalon