มันค่อนข้างยากที่จะพูดเพราะคำเหล่านี้ไม่ชัดเจน ในการพูดจาทั่วไปฉันคิดว่ามันผิดปกติเล็กน้อยที่จะเรียก Node.js กรอบแน่นอน แต่ฉันมีช่วงเวลาที่ยากลำบากในการโต้เถียงว่าทำไมมันไม่ตรง
ทั้งหมดนี้ทำให้เกิดความเสียหายและบ่อยครั้งที่ฉันเห็นการใช้ภาษาไม่ดีนักดังนั้นฉันจะต้องชัดเจนและเริ่มจากด้านล่าง
JavaScript เป็นภาษาคอมพิวเตอร์ซึ่งจะกล่าวอย่างแคบ ๆ ชุดของการประชุมที่ช่วยให้เราสามารถอ่านและตีความกลุ่มข้อความที่มีความหมายการดำเนินการ - เป็นคำแฟนซีสำหรับ "วิธีการตีความภาษาเป็นชุดของคำแนะนำ" คลาสของโปรแกรมที่เรียกว่าinterpreters , compilers , transpilers , linters , highlightersและอื่น ๆ ล้วน แต่ใช้ข้อความและพยายามทำบางสิ่งบางอย่างด้วยความเข้าใจในวิธีการรันโค้ด
- ล่ามจะทำการประมวลผลความหมายโดยการใช้งานเครื่องบางเครื่องซึ่งโดยปกติจะเป็นคอมพิวเตอร์ของคุณ คุณอาจคิดว่าพวกเขาเป็นคนตัวเล็ก ๆ ในสวิตช์พลิกคอมพิวเตอร์เช่น "พิมพ์ตัวละครนี้" ตามคำแนะนำที่เขียนในโปรแกรม JavaScript ของคุณ
- คอมไพเลอร์พยายามแปลงข้อความ JavaScript เป็นชุดข้อความใหม่ซึ่งมีความหมายในการดำเนินการสำหรับภาษาอื่น - อาจเป็นหนึ่งเดียวกับคุณสมบัติพิเศษที่คอมพิวเตอร์สามารถเรียกใช้งานได้โดยตรง
- Transpilersเป็นรูปแบบทั่วไปของคอมไพเลอร์ที่พวกเขาใช้ข้อความ JavaScript ในและข้อความที่ส่งออกของภาษาอื่น ๆ ความแตกต่างจึงเป็นอัตนัยเล็กน้อย แต่โดยทั่วไปแล้วคนหนึ่งคิดว่าคอมไพเลอร์เป็นเอาต์พุตโค้ดระดับต่ำมากและ transpiler เป็นเอาต์พุตโค้ดระดับสูง
- Linters , highlighters , ตัวตรวจสอบชนิดและอื่น ๆทั้งหมดใช้ในข้อความ JavaScript และส่งออกผลิตภัณฑ์การวิเคราะห์บางชนิดข้อความที่เน้นสีเช่นซึ่งได้รับอิทธิพลจากความหมายการดำเนินการ แต่ไม่ได้เป็นตัวแทนจริง ๆ
ทีนี้มาขุดความหมายของการประมวลผลกันหน่อย โดยทั่วไปหมายการดำเนินการที่เกี่ยวข้องกับกระบวนการของการอ่านข้อความภาษาและมาถึงที่ทั้งที่รายละเอียดของเครื่องที่เป็นนามธรรมหรือคำอธิบายของผลข้างเคียงที่สังเกต สิ่งที่ฉันอยากจะแนะนำก็คือทั้งสองสิ่งนี้ถือว่าจำเป็นที่จะต้องมี "API ระดับต่ำ" บางชนิดเพื่อใช้งานเครื่องหรือเพื่อแสดงผลที่สังเกตได้ โดยปกติจะถือว่าเป็นส่วนหนึ่งของสภาพแวดล้อมรันไทม์
- สภาพแวดล้อมรันไทม์หรือรันไทม์เป็นชุดของวิทยาการสันนิษฐานว่าที่ประชุมภาษาที่ต้องใช้จะมีชีวิตอยู่เพื่อที่จะทำงาน ตราบใดที่ภาษาดำเนินไปอาจมีข้อสันนิษฐานบางอย่างเกี่ยวกับพฤติกรรมของพวกเขา แต่พวกเขาไม่สามารถสังเกตเห็นได้ ในภาพของล่ามข้างต้น "ชายข้างใน" แค่เปิดสวิตช์ของรันไทม์ - เขาไม่สามารถตรวจสอบสิ่งที่พวกเขากำลังทำอยู่เป็นการส่วนตัว
ปกติแล้วคำว่ารันไทม์จะถูกใช้เพื่อหมายถึงทั้งชุดของตัวเองและการสร้างอินสแตนซ์ที่แท้จริงของมัน
ดังนั้นตอนนี้เราไปถึงสิ่งที่มีขนดก ภาษาคือชุดของอนุสัญญาที่ถือว่ามีอยู่ของรันไทม์เพื่อให้ความหมายกับความหมายของการดำเนินการ ไม่เคย "ตรวจสอบเข้าไปในพวกเขา" เนื่องจากอยู่นอกขอบเขต
เพื่อที่จะใช้ภาษาที่คุณต้องการบางสิ่งบางอย่างเช่นคอมไพเลอร์หรือล่ามพร้อมกับการใช้งานจริง คอมไพเลอร์ / ล่ามและรันไทม์นี้ไปจับจริงรันรหัสของคุณ
- Chrome V8ซึ่งมักเรียกว่าเอ็นจิ้นเป็นข้อตกลงแพคเกจที่มีล่ามคอมไพเลอร์การใช้งานแบบไทม์ซึ่งเข้ากันได้กับอินเทอร์เฟซแบบรันไทม์ที่ร้องขอโดยข้อกำหนด JavaScript มาตรฐานของ ECMA
ดังนั้น Node.js พอดีกับสิ่งนี้ที่ไหน
เราต้องแบ่งมันออกเป็นส่วน ๆ :
- Node.js ขยายภาษา JavaScriptโดยจัดเตรียมชุดพื้นฐานของสภาวะแวดล้อมรันไทม์ที่ใหญ่กว่าซึ่งอยู่นอกขอบเขตของมาตรฐานของ ECMA สิ่งเหล่านี้รวมถึงไฟล์ I / Oเช่น ซึ่งหมายความว่า Node.js เปลี่ยนภาษาและเป็นภาษาใหม่: "Node.js JavaScript"
- Node.js เป็นแพคเกจประกอบด้วยล่ามและคอมไพเลอร์ มันแค่ขโมยสิ่งเหล่านี้จาก V8
- Node.js จัดเตรียมการนำไปใช้งานของสภาวะแวดล้อมรันไทม์ของ Node.jsซึ่งอนุญาตให้เรียกใช้ "Node.js JavaScript"
- 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 อาศัยอยู่ในโดเมนที่ซับซ้อนและมีคุณภาพต่ำของ "เว็บแอปพลิเคชันทางธุรกิจ" ซึ่งหมายความว่าการประชุมที่วางไว้นั้นจะคลุมเครือและแตกหักอย่างแน่นอน
แต่ทั้งหมดนี้เป็นวิธีที่ยาวในการพูดใช่นายหน้าอาจไม่รู้ว่าพวกเขาหมายถึงอะไรเมื่อพูดว่า ฉันคาดเดา "กรอบงาน" ดูเหมือนคำที่ดีกว่าและอ่านง่ายกว่า "รันไทม์" หรือ "เอ็นจิ้น"