ทำความเข้าใจ NodeJS กันให้มากขึ้น
What is NodeJS
โดยผมจะสรุปเป็นข้อๆนะครับ
- NodeJS เป็น Open Source และสามารถรัน Cross-platform ได้ (สามารถนำไปรันบน OS X, Microsoft Windows, and Linux)
- NodeJS ใช้ V8 engine(เป็นตัวแปลงโค้ด JS ให้ไปเป็น machine code) ทำให้สามารถทำงานนอก Browser ได้ เนื่องจากปกติแล้ว Javascript สามารถรันได้บน client เท่านั้น
- NodeJS ทำงานแบบ Single process คือจะไม่สร้าง thread ใหม่เข้ามา
- NodeJS ทำงานแบบ Asynchronous โดยมี Event-loop เข้ามาช่วย
- NodeJS ทำงานแบบ Non-Blocking I/O
- NodeJS สามารถเขียน Server-side code ได้แล้ว ทำให้ไม่จำเป็นต้องเรียน programming language อื่นๆ สามารถเขียน Frontend Backend โดยรู้แค่ Javascript ก็พอ
- ด้วย npm ทำให้เราสามารถดาวโหลด Libraries ได้ฟรี
Non-Blocking I/O
หากยังงงๆ เรื่อง single process ,asynchronous ,event-loop ,non-blocking ไม่เป็นไรครับ เดี๋ยวเราจะเข้าใจไปด้วยกันครับ ก่อนที่จะฟังเรื่องที่กล่าวมา เราไปเข้าใจ Blocking I/O (Input/Output)กันก่อนดีกว่าครับ
Blocking I/O
คือ การทำงานที่จะต้องรอให้ฟังก์ชั่นก่อนหน้าทำงานนั้นให้เสร็จก่อนจึงจะทำงานต่อไปได้ เช่น มี User1 และ User2 ได้ทำการส่ง request ไปที่ server เพื่อต้องการข้อมูล User2 จำเป็นต้องรอให้ server ทำการ response User1 กลับมาก่อน จึงจะทำงาน User2 ได้ ฉะนั้นหากเราต้องการให้มันทำงานพร้อมๆกัน เราจำเป็นต้องสร้าง thread ใหม่ขึ้นมา
Non-blocking I/O
ในตัวอย่างเดียวกับข้างบน เราสามารถส่ง request ของ User1 และ User2 ไปด้วยด้วยกันได้เลย โดยไม่จำเป็นต้องรอ response ของ User1 กลับมาก่อน ทำให้ลดการใช้หลายๆ thread ได้ แล้ว nodeJs สามารถทำแบบนี้ได้อย่างไร โดยใช้แค่ single thread (single process) เนื่องจากเป็น single thread ทำให ้node ไม่เหมาะสำหรับทำงานที่เป็น CPU Intensive เพราะมันจะทำให้ block การทำงานทั้งหมด
Event-Loop
ด้วย Event-loop ทำให้เราสามารถทำงานแบบ Asynchronous ได้
การทำงาน
- เมื่อกดรันโค้ด Main() จะเข้าไปอยู่ใน Call stack
- โค้ดบรรทัดที่ 1 เข้าไปใน Call stack แล้วหลังจากนั้นจึงทำงานทันที
- โค้ดบรรทัดที่ 3 เข้าไปใน call stack เนื่องจาก setTimeout(2000) เป็น Node API ดังนั้นมันจะเข้าไปใน Node API แล้วรอการเรียกกลับอีก 2 วินาที เมื่อผ่านไป 2 วินาที มันจะเข้าไปใน Callback Queue
- โค้ดบรรทัดที่ 7 setTimeout(0) ก็จะเข้าไปใน Node API เมื่อเวลาผ่านไป 0 วินาที มันจะเข้าไปใน Callback Queue ก่อน จะยังไม่ทำงานทันที แม้จะตั้งเวลาไว้ 0 วินาที
- โค้ดบรรทัดที่ 11 จะทำงานทันที
- หลังจากที่ทำงานเสร็จแล้วภายใน Call stack จะไม่มีฟังก์ชั่นเหลืออยู่ ทำให้ Event loop ทำงานทันที ทำให้ Event loop ทำการย้าย ฟังก์ชั่นที่อยู่ใน Callback Queue ไปอยู่ใน Call stack เพื่อทำงานต่อ
NPM
Node Package Manager (NPM) เป็นตัวช่วยในการจัดการกับ package ของ Node เอง
เนื่องจากว่าโค้ดบางอย่างมีคนเขียนไว้แล้ว เราก็สามารถโหลดโค้ดเหล่านั้นเข้ามาได้ ทำให้เราไม่ต้องไปเสียเวลาในการเขียนเองใหม่ทั้งหมด ทำให้ทำงานได้เร็วขึ้นและมีประสิทธิภาพมากขึ้น
สรุป
NodeJS เป็น Framework ซึ่งช่วยให้เราทำงานได้ง่ายขึ้น มีการทำงานแบบ single thread และมี community ที่ใหญ่ สามารถโหลดโค้ดหรือ package จากนักพัฒนาได้ฟรี ทำให้มีเวลาในการพัฒนาโปรแกรมในส่วนอื่นๆได้
References :
https://nodejs.dev/learn/introduction-to-nodejs
https://medium.com/@duartekevin91/basics-of-understanding-chromes-v8-engine-c5c8ec61fa6b
https://www.freecodecamp.org/news/what-exactly-is-node-js-ae36e97449f5/