Node.js แตกต่างจากเฟรมเวิร์กฝั่งเซิร์ฟเวอร์อื่นอย่างไร


21

ฉันสังเกตเห็นว่า Node.js ได้รับความนิยมมากและฉันเห็นผู้คนหลายคนทำโครงการขนาดเล็กในนั้น

ฉันได้ดูรายการข้อดีและข้อเสียเพื่อรับทราบว่า Node.js สามารถทำอะไรได้บ้าง แต่ฉันยังไม่ชัดเจนว่ามันแตกต่างจากเทคโนโลยีด้านเซิร์ฟเวอร์ที่เป็นผู้ใหญ่กว่าอย่างเช่น PHP, Perl หรือ Ruby บน ทางรถไฟ

อะไรคือสิ่งที่ทำให้ Node.js แตกต่างจากทางเลือกปัจจุบันและทำไม?


1
@downvoter - ทำไมต้อง downvote ยกเว้น paragragh ที่สอง (คุณไม่สามารถถามได้ว่าทำไมเริ่มบางสิ่งบางอย่างเมื่อมีคนทำเพราะคุณทำได้ดีกว่าเสมอ) ฉันพบว่าคำถามนี้น่าสนใจ ฉันมักจะคิดอย่างนี้เอง
David Peterman

มันเป็นเรื่องเล็กน้อยที่จะเลือก แต่ถ้าคุณ google ในวลี "node.js" ที่ยกมาคุณจะได้รับความนิยมประมาณ 3 ล้านครั้ง
Peter Rowell

@ ปีเตอร์ใช่ฉันลองแล้วคุณก็พูดถูก แต่ 3 ล้านยังคงเป็นสองเท่า คุณสามารถกลับมาได้ในอีกหนึ่งปีต่อมาและตัวเลขนี้อาจสูงถึง 10 ล้าน :)
Saeed Neamati

3
@ Mark ขอบคุณสำหรับการแก้ไขที่โดดเด่น มันชัดเจนขึ้นแล้ว
Saeed Neamati

คำตอบ:


18

มีสองสิ่งสำคัญที่ทำให้ Node.js แตกต่างจากเฟรมเวิร์กฝั่งเซิร์ฟเวอร์ที่มีอยู่เหตุการณ์อะซิงโครนัสและการใช้JavaScriptเป็นภาษาโปรแกรม

เหตุการณ์ไม่ตรงกัน

ในขณะที่เฟรมเวิร์กฝั่งเซิร์ฟเวอร์ส่วนใหญ่ที่มีอยู่ใช้สถาปัตยกรรมแบบซิงโครนัส Node.js ใช้สถาปัตยกรรมแบบอะซิงโครนัสซึ่ง JavaScript สามารถจัดการได้ดี ซึ่งหมายความว่าเซิร์ฟเวอร์ตอบสนองต่อเหตุการณ์และส่งกิจกรรม (ข้อความ) ไปยังฐานข้อมูล รูปแบบการเขียนโปรแกรมนี้แตกต่างจากแบบซิงโครนัสมากและอาจใช้งานกับภาษาอื่นได้ยาก Node.js ใช้สไตล์อะซิงโครนัสกับ IO แบบอะซิงโครนัสและสามารถขยายขนาดได้ดี

ดูเพิ่มเติมที่สถาปัตยกรรมขับเคลื่อนเหตุการณ์

JavaScript

JavaScript เป็นภาษาการเขียนโปรแกรมที่เว็บแอปพลิเคชันใช้งานบนไคลเอนต์ การใช้ภาษาเดียวกันบนฝั่งเซิร์ฟเวอร์หมายความว่าผู้พัฒนาสามารถใช้ความรู้ JavaScript ของเขาทั้งบนไคลเอนต์และเซิร์ฟเวอร์และใช้ฟังก์ชั่นเดียวกับที่ต้องการ

ฉันจะแนะนำงานนำเสนอIntroduction to Node.js กับ Ryan Dahlที่ซึ่งเขาอธิบายสถาปัตยกรรม Node.js ที่ขับเคลื่อนด้วยเหตุการณ์ในรายละเอียดเพิ่มเติม


2
นี่เป็นคำตอบที่ดีที่สุดได้อย่างง่ายดาย แต่ฉันจะใส่เหตุการณ์ Asynchromous ก่อนเพราะนั่นคือสิ่งที่ทำให้ Node.js เป็นที่น่าสนใจในฐานะกรอบงานฝั่งเซิร์ฟเวอร์ ทำได้ดีแม้ว่าจะกล่าวถึง I / O แบบอะซิงโครนัสและความสามารถในการปรับขยาย นั่นคือหัวใจของมัน
Adam Crossland

ดี @ โจนัสฉันยังไม่เข้าใจ ASP.NET เป็นไปตามเหตุการณ์ แล้วความแตกต่างระหว่าง Node.js และ ASP.NET คืออะไร? เป็นเพราะมันไม่ตรงกันหรือเปล่า? ในกรณีนี้ฉันคิดว่าการใช้มัลติเธรดใน ASP.NET สามารถทำได้เหมือนกันใช่ไหม?
Saeed Neamati

3
@Saeed: ASP.NET เป็นเธรดและซิงโครนัสเช่นเมื่อเข้าถึงฐานข้อมูลเธรดจะถูกบล็อกและกำลังรอการตอบกลับจากฐานข้อมูล และเมื่อใช้หลายเธรด (เช่นหนึ่งต่อการร้องขอ) หน่วยความจำจำนวนมากถูกใช้ (แต่ละเธรดต้องการหน่วยความจำจำนวนมาก) นั่นอาจเป็นคอขวด Node.js ส่งข้อความและตอบสนองต่อเหตุการณ์ดังนั้นจึงไม่เคย (หวังว่า) บล็อกเธรด ด้วย node.js คุณกำลังใช้โมเดลการเขียนโปรแกรมเดียวกันกับฝั่งไคลเอ็นต์กับ Ajax ( Asynchronous javascript และ XML) และภาษาเดียวกัน
Jonas

คุณลืมชุมชนโอเพ่นซอร์สที่ยิ่งใหญ่ที่อยู่เบื้องหลัง
Raynos

3
เมื่อ C # 5 หมุนไปรอบ ๆ พร้อมกับasyncสิ่งใหม่ๆ ที่อาจมีการเปลี่ยนแปลง ปัญหาไม่ได้คือคุณไม่สามารถเขียนโค้ดแบบอะซิงโครนัสที่ปรับขนาดได้ในภาษาอื่น ๆ มันเป็นเรื่องยากที่จะทำ (ถูกต้อง) โดยไม่มีการสนับสนุนระดับภาษาที่ดี
Davy8

6

มันต่างกันเพราะมันขับเคลื่อนด้วยเหตุการณ์ สิ่งนี้ทำให้เซิร์ฟเวอร์ปรับขยายได้อย่างมาก

โดยสังเขป;

รุ่นด้าย

  1. ลูกค้าขออะไรบางอย่าง
  2. เซิร์ฟเวอร์ปิดและประมวลผลคำขอ
  3. ให้กลับไปที่ลูกค้า
  4. พร้อมที่จะดำเนินการตามคำขอใหม่

รูปแบบกิจกรรม

  1. ลูกค้าขออะไรบางอย่าง
  2. เซิร์ฟเวอร์ส่งคำร้องขอเพื่อดำเนินการ พร้อมที่จะดำเนินการตามคำขอใหม่
  3. เซิร์ฟเวอร์จัดการคำขอเพิ่มเติมตามที่เข้ามา
  4. เซิร์ฟเวอร์ให้ข้อมูลกลับไปยังไคลเอนต์เมื่อการร้องขอเสร็จสิ้นการประมวลผล

@Tom คุณหมายถึงอะไรโดยเหตุการณ์ขับเคลื่อน ASP.NET WebForms ยังเป็นเหตุการณ์ที่ขับเคลื่อนด้วยและคุณสามารถเห็นรถขนเหมือนSession_StartedหรือContext_AuthenticatedหรือPage_Load?
Saeed Neamati

1
การเรียกมันว่าการขับเคลื่อนด้วยเหตุการณ์นั้นมีความคลุมเครือเกินความจำเป็นและมันก็ไม่ได้อยู่ในหัวใจของโหนด
Adam Crossland

2

ฉันได้รับความประทับใจว่าความนิยมเป็นเพราะการใช้งาน JavaScript เนื่องจากนักพัฒนาเว็บจำนวนมากรู้จัก JavaScript จึงเป็นจุดขายที่ตอนนี้พวกเขาสามารถพัฒนาโค้ดฝั่งเซิร์ฟเวอร์โดยใช้ภาษาเดียวกัน นี่เป็นข้อได้เปรียบที่ฉันคิดได้:

  • ไฟล์รหัสสามารถใช้ร่วมกันระหว่างเซิร์ฟเวอร์และไคลเอนต์ป้องกันการซ้ำซ้อนของความพยายามเพียงเพื่อจัดการทั้งสองด้านของระบบ
  • นักพัฒนาไม่จำเป็นต้องสลับระหว่างภาษาทางจิตใจ (ไม่ใช่เรื่องใหญ่ในความคิดของฉัน)
  • สถาปนิกไม่จำเป็นต้องเลือกหลายภาษาเมื่อสร้างโซลูชันเว็บ
  • คนที่ไม่เคยพัฒนาโค้ดฝั่งเซิร์ฟเวอร์สามารถทำได้โดยไม่ต้องเรียนรู้ภาษาอื่น (ไม่น่าจะเป็นอาร์กิวเมนต์ที่มีค่า IMHO)

Node.JS เป็นที่นิยมเพราะรวดเร็วและมีขนาดที่ดี ว่ามันอยู่ในจาวาสคริปต์เป็นสิ่งที่ดี แต่ส่วนใหญ่เป็นเรื่องเล็กน้อย
Adam Crossland

2
สิ่งที่มีค่ายิ่งกว่าคือผู้พัฒนาฝั่งเซิร์ฟเวอร์สามารถเขียนโค้ดฝั่งไคลเอ็นต์ในภาษาเดียวกันและคุณสามารถแชร์โมดูลฝั่งเซิร์ฟเวอร์กับไคลเอนต์ได้ ไม่ใช่วิธีอื่น ๆ ฉันไม่ต้องการพอร์ตแฮ็ครหัสฝั่งไคลเอ็นต์ไปยังเซิร์ฟเวอร์นั่นเป็นการยิงตัวคุณเอง
Raynos

@ อดัม: ทำไม node.js ถึงได้รับความนิยมเมื่อมีเทคโนโลยีที่เหมาะสมกับคำอธิบาย "เร็วและสเกลได้ดี"? - เพราะมันเป็นจาวาสคริปต์
John Fisher

@John การเขียนแอปที่ทำได้ไม่ดีใน Node.js หากแอปของคุณเป็นดิสก์ / เครือข่ายที่เข้มข้นกว่า CPU มาก (ซึ่งส่วนใหญ่เป็น) คุณสามารถรองรับการเชื่อมต่อพร้อมกันหลาย ๆ ครั้งบนแกนเดียวมากกว่าเซิร์ฟเวอร์อื่น ๆ ส่วนใหญ่เว้นแต่ว่าคุณจะเขียนรหัสเกลียวที่ยุ่งยากมาก
Davy8

@ Davy8: ฉันเดาว่าทั้งหมดขึ้นอยู่กับกรอบ / ระบบอื่น ๆ ที่คุณใช้ ความง่ายในการปรับขยายที่คุณอธิบายนั้นง่ายมากด้วยเครื่องมือที่ฉันใช้ สิ่งเดียวที่ Node.js นำเสนอจากมุมมองของฉันคือรสชาติ JavaScript ซึ่งไม่น่าสนใจ
John Fisher
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.