อะไรคือเอกลักษณ์ของ Node.js [ปิด]


48

เมื่อไม่นานมานี้มีการสรรเสริญ Node.js มากมาย ฉันไม่ได้เป็นนักพัฒนาซอฟต์แวร์ที่มีความเสี่ยงต่อแอปพลิเคชันเครือข่ายมาก จากความเข้าใจของฉันเกี่ยวกับ Nodes.js จุดแข็งของมันคือ: เรามีเธรดเพียงตัวเดียวที่จัดการการเชื่อมต่อได้หลายตัวซึ่งให้สถาปัตยกรรมแบบอิงเหตุการณ์

อย่างไรก็ตามตัวอย่างเช่นใน Java ฉันสามารถสร้างเพียงหนึ่งเธรดโดยใช้ NIO / AIO (ซึ่งไม่ใช่การปิดกั้น APIs จากความเข้าใจที่เปลือยเปล่าของฉัน) และจัดการการเชื่อมต่อจำนวนมากโดยใช้เธรดนั้นและฉันจัดเตรียมสถาปัตยกรรมที่อิงเหตุการณ์ การจัดการกับลอจิก (ไม่ควรจะยากขนาดนี้หากมีการติดต่อกลับ ฯลฯ )?

เนื่องจาก JVM เป็น VM ที่เป็นผู้ใหญ่มากกว่า V8 (ฉันคาดว่ามันจะทำงานได้เร็วขึ้น) และสถาปัตยกรรมการจัดการตามเหตุการณ์ดูเหมือนจะเป็นสิ่งที่ไม่ยากที่จะสร้างฉันไม่แน่ใจว่าทำไม Node.js ดึงดูดความสนใจมาก ฉันพลาดจุดสำคัญบางอย่างหรือไม่?


3
ฉันสงสัยว่าเพราะเหตุใด downvote ... ฉันรู้สึกว่าคำถามนี้เป็นคำถามเกี่ยวกับการเขียนโปรแกรมมากขึ้นดังนั้นฉันจึงไม่ได้ใส่ใน stackoverflow ฉันพยายามค้นหาหัวข้อที่คล้ายกัน แต่ฉันพบเฉพาะข้อมูลเกี่ยวกับความแข็งแกร่งของ Nodes.js แต่ปัญหาของฉันคือฉันไม่เข้าใจว่าทำไม "ความแข็งแกร่ง" จึงมีความแปลกใหม่ (ซึ่งฉันยังหาไม่ได้)
Adrian Shum

6
ลองใช้รูปแบบนั้นใน Java มันใช้งานได้แน่นอน แต่คุณจะเห็นสิ่งหนึ่ง: มันเป็นอย่างมาก verbose มากใน Java: คุณต้องโทรกลับจำนวนมากซึ่งมักจะหมายถึงการสร้างชั้นเรียนใหม่ นั่นอาจฟังดูคล้าย nitpick เล็กน้อย แต่ในโปรแกรมใหญ่มันน่าเกลียดและรวดเร็วมาก
โจอาคิมซาวเออร์

6
การโทรกลับด้วย Javascript นั้นมีแนวโน้มที่จะไม่มั่นคงและสปาเก็ตตี้นั้นง่ายต่อการตรวจแก้จุดบกพร่องและสร้างใหม่ใน Java มากกว่าใน Javascript IMO
funkybro

5
@AdrianShum: มันเป็นเอฟเฟกต์ slashdot อะไรก็ตามที่ไม่เข้ากับความคิดของกลุ่มจะถูกลดระดับลง - เช่นการชมเชย Microsoft ใน /
gbjbaanb

3
ฉันประหลาดใจที่ไม่เห็นใครพูดถึงโฆษณา
deadalnix

คำตอบ:


33

ในขณะที่แนวคิดนั้นสามารถนำไปใช้ได้จริงในหลายภาษา (และตามที่dodgy_coderกล่าวถึงมันได้ถูกนำมาใช้ใน Ruby และ Python อย่างน้อย) แต่ก็ไม่ได้เป็นเรื่องเล็กน้อยตามที่คุณพูด

True, Java ไม่มีการปิดกั้น IO API ดังนั้นคุณสามารถทำ raw disk / network IO ในแบบที่ไม่มีการบล็อก อย่างไรก็ตาม API ทุกตัวที่มีการหุ้มหรือจัดการ IO จะต้องมีการใช้งานในลักษณะที่ไม่มีการปิดกั้นเช่นกัน ตัวแยกวิเคราะห์ XML ทุกตัวไดรเวอร์ฐานข้อมูลทุกตัวแปลงรูปแบบไฟล์ทุกไฟล์จำเป็นต้องเขียนเพื่อรองรับ IO ที่ไม่บล็อก เพราะหากห้องสมุดเดียวกำลังบล็อกในรูปแบบนี้นั่นจะทำให้ประสิทธิภาพการทำงานของเซิร์ฟเวอร์ลดลงตามอายุ

Node.js มีโครงสร้างพื้นฐานที่ห้องสมุดว่าเพราะมันถูกออกแบบมาเสมอวิธีการที่: ห้องสมุดที่มุ่งมั่นที่จะกลายเป็นที่นิยมทุกมีเพื่อให้ API ตรงกันหรือมันจะไม่ถูกนำมาใช้


18
อ๋อ กล่าวอีกนัยหนึ่ง: จุดแข็งที่สำคัญที่สุดของ Node.js คือจุดอ่อนที่สำคัญที่สุดของ ECMAScript: ไลบรารีมาตรฐาน ECMAScript ที่เส็งเคร็งอย่างไม่น่าเชื่อ เนื่องจากนักพัฒนา Node.js ต้องสร้างใหม่ทุก ๆ วงล้อพวกเขามีโอกาสที่จะสร้างมันใหม่อย่างถูกวิธี
Jörg W Mittag

4
เท่าที่ฉันรู้ ECMAScript ได้รับการออกแบบเป็นภาษาที่ฝังตัวอยู่เสมอดังนั้นจึงไม่จำเป็นต้องใช้ API ระดับระบบปฏิบัติการใด ๆ (แม้แต่เครือข่าย IO ก็ถูกแยกส่วนออกไป) การขาดดังกล่าวนั้นเป็นข้อได้เปรียบสำหรับ Node.js
โจอาคิมซาวเออร์

"ห้องสมุดทุกแห่งที่มุ่งมั่นที่จะเป็นที่นิยมต้องจัดหา asnychronous API มิเช่นนั้นจะไม่ถูกใช้" ฉันคิดว่านั่นเป็นสิ่งที่ฉันกำลังมองหา มีทรัพยากรใดที่ต้องพิจารณาเกี่ยวกับวิธีที่ asynchronous api มีให้ตัวอย่างเช่นการแยกวิเคราะห์ XML และการเข้าถึงฐานข้อมูลใน Node.js
Adrian Shum

1
@AdrianShum โดยทั่วไปมองหาตัวอย่างการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ การใช้งานเฉพาะสามารถพบได้ในหลายภาษา นอกจากโมดูล Node.js คุณสามารถดูตัวอย่าง Twisted ใน Python, twistedmatrix.com/trac/wiki , ตัวอย่าง POE ใน Perl, poe.perl.org , และ Ruby มี EventMachine, github.com/eventmachine/eventmachine
mghicks

19

เหตุผลหลักอาจเป็นเพราะมันใช้ JavaScript เพื่อเขียนส่วนประกอบฝั่งเซิร์ฟเวอร์สำหรับสิ่งต่าง ๆ เช่นเว็บเซิร์ฟเวอร์แอปพลิเคชันเว็บหรือบริการเว็บ สิ่งนี้รวม JavaScript ภาษาการพัฒนาส่วนหน้าแบบดั้งเดิม (ฝั่งไคลเอ็นต์) กับภาษาฝั่งเซิร์ฟเวอร์

คุณพูดถูก - ความจริงมันไม่ใช่การปิดกั้นการใช้รูปแบบของเครื่องปฏิกรณ์นั้นไม่ซ้ำกัน - มันทำมาแล้วก่อนที่จะใช้ภาษาและกรอบอื่น ๆ เช่น Ruby's EventMachine หรือ Python Twisted เป็นต้น


5
เทคโนโลยีน้อยมากที่มีคุณสมบัติที่เป็นเอกลักษณ์อย่างแท้จริงเอกลักษณ์นั้นมาจากการรวมกันของคุณสมบัติทั้งหมดของพวกเขา
jk

1
เห็นด้วยมีรายการของห้องสมุดที่สนับสนุนในภาษาที่สำคัญทั้งหมด ... รูปแบบเครื่องปฏิกรณ์บน Wikipedia
dodgy_coder

10

สามเหตุผลหลักที่ฉันจะให้คือ:

  1. Non Blocking IO / Asynchronous IO สิ่งนี้จะถูกแฮชทุกที่บนเว็บและในโปสเตอร์ก่อนหน้า สิ่งหนึ่งที่ฉันจะมีส่วนร่วมคือการออกแบบรหัสของคุณให้มีพฤติกรรมอะซิงโครนัสอย่างชัดเจนจะช่วยให้เครื่องยนต์คอมไพเลอร์เพื่อเพิ่มฮาร์ดแวร์ให้สูงสุด ใช่คอมไพเลอร์ JIT และตัวประมวลผลไฮเปอร์เธรดจำนวนมากใช้โค้ดซิงโครนัสและช่วยดำเนินการแบบขนาน แน่นอนว่านี่เป็นวิธีการปฏิบัติที่ดีที่สุด ในทางตรงกันข้ามการสร้างแอปพลิเคชันสำหรับ async io อย่างชัดเจนคุณมั่นใจได้ว่าเอ็นจิ้นและฮาร์ดแวร์สามารถเพิ่มเวลาดำเนินการให้ได้มากที่สุดสำหรับโค้ดของคุณ เป็นที่ยอมรับว่าฉันไม่มีข้อมูลเชิงปริมาณเพื่อพิสูจน์สิ่งนี้ แต่มันทำให้ฉันรู้สึกอบอุ่นภายในที่จะคิดแบบนี้

  2. รหัสเดียวฐานสำหรับลูกค้าและเซิร์ฟเวอร์ สิ่งนี้มีข้อดีหลายประการ: ช่วยเพิ่มประสิทธิภาพต้นทุนดาต้าเซ็นเตอร์โดยสามารถย้ายตรรกะทางธุรกิจจากเซิร์ฟเวอร์ไปยังไคลเอนต์ ช่วยนำการตรวจสอบตรรกะ / ข้อมูลธุรกิจกลับมาใช้ใหม่ ลดความซับซ้อนของทักษะการพัฒนาที่จำเป็นต้องมีเพื่อสนับสนุนผลิตภัณฑ์ (เทียบกับ Python & javascript)

  3. อุปสรรคน้อยในการเข้า Javascirpt เป็นเหมือน Basic, Pascal และ Perl ของปีก่อน มันง่ายสุด ๆ ในการเริ่มเขียนโค้ดและไม่จำเป็นต้องมีความรู้เกี่ยวกับโดเมนมากมายในการเริ่มต้น สิ่งนี้ยังช่วยลดค่าใช้จ่ายในการพัฒนาของคุณด้วยความสามารถในการนำนักพัฒนา jr เพิ่มเติมและเพิ่มจำนวนของโครงการ [แน่นอนคุณจะต้องผ่านแนวคิดที่เชื่อว่าภาษาโปรแกรมควรยากสำหรับการกำจัดนักพัฒนาที่มีประสิทธิภาพต่ำ]


ฉันไม่แน่ใจว่าฉันแนะนำให้สร้างทีม Node ด้วย jr หรือไม่ JS devs สถาปัตยกรรมไม่ใช่สิ่งที่เราต้องคิดเกี่ยวกับในโครงการ jr-web / UI เพิ่มเติมและ JS ใช้เวลาในการสร้างผลงานระยะยาวเช่นเดียวกับภาษาอื่น ๆ แม้ว่าคุณจะได้ผลลัพธ์ที่ค่อนข้างดี รวดเร็วในระดับที่ต่ำกว่าของประสบการณ์ในโครงการที่ซับซ้อนน้อยกว่าโครงการทั่วไป
Erik Reppen

ฉันเห็นด้วยกับ @ErikReppen; ทีมงานด้านสถาปัตยกรรมของ junior devs (ไม่ว่าจะใช้ภาษาใด) ก็เหมือนกับการออกแบบและสร้างบ้านโดยใช้ช่างไม้ที่เก่งในการสร้างเก้าอี้โต๊ะและบ้านสุนัข
Wildcard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.