Node.js เป็นกรอบงานหรือไม่? [ปิด]


35

ฉันเห็นผู้สรรหาผู้พัฒนา ฯลฯ อ้างถึง Node.js เป็นกรอบ ในความคิดของฉันนี่เป็นสิ่งที่ไม่รู้ว่า Node.js เป็นอย่างไร

บ่อยครั้งในคำบรรยายลักษณะงาน Node.js ถูกจัดกลุ่มเป็นห้องสมุดท่ามกลางAngularJS , Reactและอื่น ๆ โดยทั่วไปฉันเห็นว่าเป็นการถูกป้อนโดยบุคคลที่ไม่ทราบความแตกต่าง (HR, ผู้สรรหา ฯลฯ )

ในความคิดของฉัน Node.js เป็นแพลตฟอร์มหรือสภาพแวดล้อมรันไทม์ มันสลับ DOM API (JavaScript ในเบราว์เซอร์) สำหรับ API อื่น ๆ เช่นระบบไฟล์ (เนื่องจากทำงานเป็นเซิร์ฟเวอร์ไม่ใช่ในเบราว์เซอร์)

ทำไมคนคิดว่า Node.js เป็นกรอบ; ฉันผิดหรือเปล่า จริง ๆ แล้วเป็นกรอบหรือไม่



5
ไม่เฉพาะ แต่ฉันเห็นความสับสน
ndugger

1
นานมาแล้วเมื่อโหนดแรกออกมาฉันโพสต์คำตอบเกี่ยวกับ SO ที่กล่าวว่าโหนดไม่ได้เป็นกรอบ คำตอบนั้นถูกลดลงอย่างมากในตอนนั้น ทุกวันนี้มีคนจำนวนน้อยมากที่ใช้โหนดเชื่อว่าเป็นกรอบ มันเป็นกรอบในแง่เดียวกันว่า Swift เป็น framework หรือ Go เป็น framework หรือ Rust เป็น framework ภาษาการเขียนโปรแกรมสมัยใหม่นั้นมี API ระดับสูงมากที่เคยนำมาใช้เป็นกรอบงาน "แพลตฟอร์ม" เป็นคำที่ดี ผมว่ามันเป็นล่ามตัวเอง (โดยใช้ยูนิกซ์แบบดั้งเดิมความหมายของคำว่า)
slebetman

โปรดทราบว่าโหนดจะไม่สลับ DOM API และสิ่งใดก็ตามที่คุณสามารถรันด้วย javascript นั้นยังคงมีอยู่สำหรับคุณโดยมีหรือไม่มีโหนด
Rob

@slebetman ความหมาย "อื่น ๆ " ของล่ามคืออะไร? ฉันก็ไม่รู้ว่ามีการโต้เถียงเช่นกัน! : S
J. Abrahamson

คำตอบ:


44

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

ทั้งหมดนี้ทำให้เกิดความเสียหายและบ่อยครั้งที่ฉันเห็นการใช้ภาษาไม่ดีนักดังนั้นฉันจะต้องชัดเจนและเริ่มจากด้านล่าง


JavaScript เป็นภาษาคอมพิวเตอร์ซึ่งจะกล่าวอย่างแคบ ๆ ชุดของการประชุมที่ช่วยให้เราสามารถอ่านและตีความกลุ่มข้อความที่มีความหมายการดำเนินการ - เป็นคำแฟนซีสำหรับ "วิธีการตีความภาษาเป็นชุดของคำแนะนำ" คลาสของโปรแกรมที่เรียกว่าinterpreters , compilers , transpilers , linters , highlightersและอื่น ๆ ล้วน แต่ใช้ข้อความและพยายามทำบางสิ่งบางอย่างด้วยความเข้าใจในวิธีการรันโค้ด

  • ล่ามจะทำการประมวลผลความหมายโดยการใช้งานเครื่องบางเครื่องซึ่งโดยปกติจะเป็นคอมพิวเตอร์ของคุณ คุณอาจคิดว่าพวกเขาเป็นคนตัวเล็ก ๆ ในสวิตช์พลิกคอมพิวเตอร์เช่น "พิมพ์ตัวละครนี้" ตามคำแนะนำที่เขียนในโปรแกรม JavaScript ของคุณ
  • คอมไพเลอร์พยายามแปลงข้อความ JavaScript เป็นชุดข้อความใหม่ซึ่งมีความหมายในการดำเนินการสำหรับภาษาอื่น - อาจเป็นหนึ่งเดียวกับคุณสมบัติพิเศษที่คอมพิวเตอร์สามารถเรียกใช้งานได้โดยตรง
  • Transpilersเป็นรูปแบบทั่วไปของคอมไพเลอร์ที่พวกเขาใช้ข้อความ JavaScript ในและข้อความที่ส่งออกของภาษาอื่น ๆ ความแตกต่างจึงเป็นอัตนัยเล็กน้อย แต่โดยทั่วไปแล้วคนหนึ่งคิดว่าคอมไพเลอร์เป็นเอาต์พุตโค้ดระดับต่ำมากและ transpiler เป็นเอาต์พุตโค้ดระดับสูง
  • Linters , highlighters , ตัวตรวจสอบชนิดและอื่น ๆทั้งหมดใช้ในข้อความ JavaScript และส่งออกผลิตภัณฑ์การวิเคราะห์บางชนิดข้อความที่เน้นสีเช่นซึ่งได้รับอิทธิพลจากความหมายการดำเนินการ แต่ไม่ได้เป็นตัวแทนจริง ๆ

ทีนี้มาขุดความหมายของการประมวลผลกันหน่อย โดยทั่วไปหมายการดำเนินการที่เกี่ยวข้องกับกระบวนการของการอ่านข้อความภาษาและมาถึงที่ทั้งที่รายละเอียดของเครื่องที่เป็นนามธรรมหรือคำอธิบายของผลข้างเคียงที่สังเกต สิ่งที่ฉันอยากจะแนะนำก็คือทั้งสองสิ่งนี้ถือว่าจำเป็นที่จะต้องมี "API ระดับต่ำ" บางชนิดเพื่อใช้งานเครื่องหรือเพื่อแสดงผลที่สังเกตได้ โดยปกติจะถือว่าเป็นส่วนหนึ่งของสภาพแวดล้อมรันไทม์

  • สภาพแวดล้อมรันไทม์หรือรันไทม์เป็นชุดของวิทยาการสันนิษฐานว่าที่ประชุมภาษาที่ต้องใช้จะมีชีวิตอยู่เพื่อที่จะทำงาน ตราบใดที่ภาษาดำเนินไปอาจมีข้อสันนิษฐานบางอย่างเกี่ยวกับพฤติกรรมของพวกเขา แต่พวกเขาไม่สามารถสังเกตเห็นได้ ในภาพของล่ามข้างต้น "ชายข้างใน" แค่เปิดสวิตช์ของรันไทม์ - เขาไม่สามารถตรวจสอบสิ่งที่พวกเขากำลังทำอยู่เป็นการส่วนตัว

ปกติแล้วคำว่ารันไทม์จะถูกใช้เพื่อหมายถึงทั้งชุดของตัวเองและการสร้างอินสแตนซ์ที่แท้จริงของมัน


ดังนั้นตอนนี้เราไปถึงสิ่งที่มีขนดก ภาษาคือชุดของอนุสัญญาที่ถือว่ามีอยู่ของรันไทม์เพื่อให้ความหมายกับความหมายของการดำเนินการ ไม่เคย "ตรวจสอบเข้าไปในพวกเขา" เนื่องจากอยู่นอกขอบเขต

เพื่อที่จะใช้ภาษาที่คุณต้องการบางสิ่งบางอย่างเช่นคอมไพเลอร์หรือล่ามพร้อมกับการใช้งานจริง คอมไพเลอร์ / ล่ามและรันไทม์นี้ไปจับจริงรันรหัสของคุณ

  • Chrome V8ซึ่งมักเรียกว่าเอ็นจิ้นเป็นข้อตกลงแพคเกจที่มีล่ามคอมไพเลอร์การใช้งานแบบไทม์ซึ่งเข้ากันได้กับอินเทอร์เฟซแบบรันไทม์ที่ร้องขอโดยข้อกำหนด JavaScript มาตรฐานของ ECMA

ดังนั้น Node.js พอดีกับสิ่งนี้ที่ไหน

เราต้องแบ่งมันออกเป็นส่วน ๆ :

  1. Node.js ขยายภาษา JavaScriptโดยจัดเตรียมชุดพื้นฐานของสภาวะแวดล้อมรันไทม์ที่ใหญ่กว่าซึ่งอยู่นอกขอบเขตของมาตรฐานของ ECMA สิ่งเหล่านี้รวมถึงไฟล์ I / Oเช่น ซึ่งหมายความว่า Node.js เปลี่ยนภาษาและเป็นภาษาใหม่: "Node.js JavaScript"
  2. Node.js เป็นแพคเกจประกอบด้วยล่ามและคอมไพเลอร์ มันแค่ขโมยสิ่งเหล่านี้จาก V8
  3. Node.js จัดเตรียมการนำไปใช้งานของสภาวะแวดล้อมรันไทม์ของ Node.jsซึ่งอนุญาตให้เรียกใช้ "Node.js JavaScript"
  4. Node.js จัดเตรียมชุดของไลบรารีมาตรฐานที่สร้างขึ้นบน primitives ใหม่ซึ่งทำให้ผู้ใช้ปลายทางสามารถเข้าถึง "Node.js JavaScript" ได้มากขึ้น

ดังนั้น Node.js ก็มีหลายสิ่งหลายอย่าง!

แต่มันเป็นกรอบหรือไม่


นี่คือที่ศัพท์ทั้งหมดสลาย - ไม่มีใครมีความหมายที่ดีสอดคล้องและมีความหมายของกรอบจริง

มีการถกเถียงกันอย่างดุเดือดว่า: "อะไรคือกรอบการทำงานกับห้องสมุด" และพวกเขาก็จบลงด้วยสิ่งที่ไม่น่าพึงพอใจเช่น "ห้องสมุดคือสิ่งที่คุณเรียกและกรอบคือสิ่งที่เรียกคุณ" ฉันไม่ต้องการที่จะให้คำอธิบายที่น่าเศร้าเช่นแสงของวัน - แต่ JavaScript และโดยเฉพาะอย่างยิ่ง JavaScript และ Node.js เป็นระเบิดขนาดใหญ่เพื่อนิยามนี้ตั้งแต่เทคนิคการโทรกลับผ่านทั้งหมดหมายความว่าคุณสลับตลอดเวลาระหว่างการโทร และถูกเรียกว่า

ในความเห็นส่วนตัวของฉันมีบางสิ่งที่สำคัญที่นี่ ฉันไม่ต้องการวาดเส้นที่สดใส แต่ฉันจะพูดแค่นั้น

  • ชุดของรหัสเป็นเหมือนห้องสมุดถ้ามันทำงานเหมือนชุดของ legos : หารและทำเพื่อประกอบ ในขณะที่อาจมีบางตัวอย่างสำหรับวิธีการใช้ไลบรารีโดยทั่วไปแล้วผู้ใช้จะรวบรวมเข้าหาความต้องการของตนเอง
  • ชุดของรหัสเป็นเหมือนเฟรมเวิร์กหากไม่สามารถหารและหมายถึงอนุสัญญา *: การดึงส่วนของมันออกจากกันอาจทำให้สมมติฐานมากมายล้มเหลวดังนั้นคุณต้องเข้าใจการใช้งานทั่วไปเพื่อใช้เฟรมเวิร์กอย่างถูกต้อง

นี่คือเส้นคลื่นมือที่ต้องแน่ใจ แต่ฉันต้องการดึงจุดที่น่าสนใจเกี่ยวกับกรอบ:

กรอบหมายถึงชุดของการประชุมของวิธีการตีความรหัส; ดังนั้นพวกเขาจึงเป็นภาษาในสิทธิของตนเอง

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


ดังนั้นทั้งหมดที่กล่าวว่าฉันมีความสุขที่จะเรียก Node.js เป็นกรอบแม้ว่ามันจะขัดกับบรรทัดฐาน! Node.js เพิ่มฟังก์ชันการทำงาน JavaScript ดิบในทางของการขยายตัวของภาษา ด้วยการนำสมมติฐานและเครื่องมือใหม่สำหรับการทำงานในภาษาขยายนี้ หน้าที่ความคิดเหล่านี้เป็นเช่นเดียวกับความคิดของกรอบที่ยอมรับอื่น ๆ เช่นRuby on Rails

ฉันจะยืนยันว่าถ้าในขณะนี้คุณรู้สึกไม่สบายใจและต้องการยืนยันว่ามีการแบ่งขนาดใหญ่ระหว่าง Ruby on Rails และ Node.js ในลักษณะนี้ฉันก็อยู่ที่นั่นกับคุณแน่นอน โลกแห่งแนวคิดที่ทั้งสองอาศัยอยู่มีความแตกต่างกันอย่างมาก - ฉันแค่อยากจะบอกว่าพวกมันเป็นสิ่งเดียวกัน: ชุดของอนุสัญญาเพื่อขยายอำนาจของภาษาพื้นฐานภายในโดเมนเฉพาะ

ฉันยินดีที่จะแนะนำว่าโดเมนของ Node.js มีขนาดเล็กและแน่นดังนั้นการประชุมที่เพิ่มเข้ามานั้นง่ายต่อการให้เหตุผลและค่อนข้างง่ายต่อการแก้ไข OTOH, Ruby on Rails อาศัยอยู่ในโดเมนที่ซับซ้อนและมีคุณภาพต่ำของ "เว็บแอปพลิเคชันทางธุรกิจ" ซึ่งหมายความว่าการประชุมที่วางไว้นั้นจะคลุมเครือและแตกหักอย่างแน่นอน


แต่ทั้งหมดนี้เป็นวิธีที่ยาวในการพูดใช่นายหน้าอาจไม่รู้ว่าพวกเขาหมายถึงอะไรเมื่อพูดว่า ฉันคาดเดา "กรอบงาน" ดูเหมือนคำที่ดีกว่าและอ่านง่ายกว่า "รันไทม์" หรือ "เอ็นจิ้น"


เฮ้สมดุลอย่างน่าทึ่ง! ดังนั้นprobably have no idea: 'framework' เป็นคำที่คุณสามารถเข้าใจได้โดยไม่ต้องเป็นโปรแกรมเมอร์คุณสมบัติที่มีประโยชน์หากไม่ได้ใช้งานเมื่อมันจะสร้างความแตกต่าง
n611x007

"Node.js เพิ่มฟังก์ชันการทำงานให้กับ JavaScript แบบดิบเพื่อขยายภาษา" ไม่เป็นความจริงมันกำลังขยายฟังก์ชั่นและไม่ใช่ภาษา แต่มันไม่เปลี่ยนวิธีที่คุณต้องเขียนโค้ดตามที่กรอบงานต้องการ มีฟังก์ชั่นหรือวัตถุอื่น ๆ เพิ่มเช่นห้องสมุดที่รวมสามารถเพิ่ม คุณสามารถเรียกมันหรือใช้มันเหมือนกับฟังก์ชั่นหรือวัตถุใหม่ รูปแบบของการเขียนโปรแกรมไม่เปลี่ยนแปลงพื้นฐานภาษาเหมือนกันเพียงเพิ่มฟังก์ชันการทำงานบางอย่างเท่านั้น ดังนั้นจึงไม่ใช่เฟรมเวิร์กหรือการขยายภาษาจาวาสคริปต์พร้อมกับเพิ่มไลบรารีแพลตฟอร์มเริ่มต้นและฟังก์ชันการทำงาน
Codebeat

แน่นอนว่าฉันสามารถติดตามคุณได้อย่างสมบูรณ์ ฉันคิดว่าเส้นตรงนี้คลุมเครือ วิธีคิดอย่างใดอย่างหนึ่งทำให้รู้สึก ในฐานะที่เป็นจุดเข้มงวดโหนดจะขยาย JS โดยจัดเตรียม FFI ซึ่งเป็นชิ้นส่วนหลักที่อนุญาตให้โหนดจัดหาไลบรารีระบบเพิ่มเติมในภายหลัง ในขณะที่โหนด“ core” เป็นเพียง runtime (และ FFI นี้) ส่วนใหญ่เวลาที่คนพูดถึง node พวกเขาหมายถึง“ core runtime, นามสกุล FFI และฟังก์ชั่นไลบรารีพื้นฐานที่สร้างขึ้นที่นี่” เป็นวิธีที่โหนดถูกทำแพ็กเกจ
J. Abrahamson

20

Node.js®เป็นรันไทม์ JavaScript ที่สร้างขึ้นบนเครื่องมือ V8 JavaScript ของ Chrome

แหล่ง

โหนดเป็นรันไทม์หรือสภาพแวดล้อม มันไม่ได้เป็นกรอบ ผู้คน (ฉันรู้สึก) มักจะผิดพลาดเพราะเฟรมเวิร์กอย่าง express นั้นแพร่หลายกับโหนด

อ่านเพิ่มเติมเกี่ยวกับกรอบรันไทม์และกรอบถ้าคุณมีความสนใจ


inb4 "แต่หน้าเกี่ยวกับบอกว่า" ในฐานะที่เป็นเฟรมเวิร์กเหตุการณ์แบบอะซิงโครนัส "" ฉันทราบ
rlemon

3
ตัว v8 ในตัวไม่ใช่รันไทม์หรือ ;-)
johannes

@johannes ฉันมีแนวโน้มที่จะเห็นด้วยกับคุณเกี่ยวกับเรื่องนี้ V8 เป็นรันไทม์และโหนดเพียงแค่ขยายเครื่องมือที่มีให้กับนักพัฒนา (เซิร์ฟเวอร์ http, util ฯลฯ ) ดังนั้นฉันคิดว่าฉลากกรอบยังคงทำงาน ถึงกระนั้นก็เป็นสภาพแวดล้อม v8 แก้ไข; โหนดไม่ใช่สิ่งที่คุณเพียง "รวม" ในโครงการของคุณ มันเป็นเรื่องของมุมมองที่ฉันเดา
กรงขัง

@rlemon เฟรมเวิร์กส่วนได้ถูกลบออก
ebram khalil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.