เจาะลึกกับ node.js แบบเริ่มต้นทำความรู้จัก

เจาะลึกกับ node.js แบบเริ่มต้นทำความรู้จัก

มาถึงตอนนี้แล้ว เชื่อว่า ทุกท่านมองภาพออกแล้ว ว่า node.js คืออะไร เป็นยังไง ถ้ายังไม่เข้าใจภาพกว้าง ลองอ่าน บทความ เริ่มต้น node.js คืออะไร ยังไง เพราะว่าเนื้อหานี้ จะพูดเรื่องของ node.js เน้นๆเลย

node.js มันคืออะไร

node.js อย่างที่ผมนิยามไว้ว่ามันคือ environment เพื่อให้เราเขียน software มารันตามที่เราต้องการ ภายใต้ environment ของ node นี้ โดยภาษาที่เราจะใช้เขียน มันคือภาษา javascript เหมือนที่เราใช้เขียนบนหน้าเว็บเลย โดยจะมีตัว compiler คือ google javascript engine V8 ก็คือตัวประมวลผลภาษา javascript ที่ทาง google พัฒนาขึ้นมานั่นเอง (เป็น open source) สรุปคือ เราเขียนโปรแกรมด้วยภาษา javascript โดยความสามารถมันทำได้หลายอย่างมาก ไม่ว่าจะเป็นประมวลผลงานต่างๆ หรือติดต่อผ่าน socket หรือไปจนถึงสั่ง command line บนเครื่องเลย ทำได้หมด

node.js เค้าหยิบ V8 มาทำเป็นตัว compiler เพราะว่า มันประมวลผลได้รวดเร็วมาก ผลที่ได้คือมันทำตัวคล้ายๆกับจะเป็น parallel execution ด้วย คือ ทำงานหลายอย่างพร้อมกันในเวลาเดียวกัน แต่ความจริงคือไม่ใช่ เพราะว่ามันเป็น single thread ครับ แต่มันปรับกระบวนการโดยเอาแต่ละงานไปเข้าคิวเวลาเอาไว้ก่อน (ยังไม่ประมวลผล) แล้วค่อยประมวลผลงานตามคิวเวลา ไม่ได้เรียงตามขั้นตอนที่เสร็จหรือไม่เสร็จ ซึ่งกระบวนการเข้าคิวเวลามันใช้เวลาน้อยมากๆ เราเลยมองเห็นเป็นว่า อ๋อ มันเริ่มต้นทำงานได้พร้อมกัน

node.js เอามาใช้ประโยชน์อย่างไร

ส่วนใหญ่เค้าจะนิยมใช้ node.js ในงานที่ทำเป็นเบื้องหลังครับ ก็คือ งานที่ประมวลผลสั่ง server ซึ่งเป็นงานที่อาจจะต้อง interface กับผู้ใช้ หรือไม่ต้อง interface เลยก็ได้ ตัวอย่างงานที่ต้อง interface กับคนใช้ก็คือ การทำตัวเองเป็น http server ในการดึงหน้าเว็บมาแสดงผลให้กับ user หรือว่า การเปิด socket เพื่อรับส่งข้อมูลกันระหว่าง server กับคนใช้ ที่อาจจะเอาไปทำเป็นห้อง chat , ทำเกม, ทำระบบที่ป้อนข้อมูลเพื่อคำนวนเอาผลลัพท์ เป็นต้น จุดนี้มันไม่ได้เอาไว้ทำหน้าตานะครับ แต่มันเอาไว้ประมวลผลล้วนๆเลยครับ หน้าตาก็ปล่อยให้เป็นหน้าที่ของ html + css + javascript ที่เขียนหน้าเว็บตามปกติครับ หรือ ตัวอย่างงานที่ไม่ต้อง interface กับคนใช้ก็เช่นเอาไปทำ spider crawler เว็บ คือให้มันเปิดเว็บอ่านแล้วเก็บข้อมูลไปเรื่อยๆ หรือว่า โปรแกรมที่ รอรับค่าจาก streaming ที่ต่างๆ เพื่อเอามาบันทึกเอาไว้ เหล่านี้ไม่จำเป็นต้อง interface กับคนใช้ครับ ต่างก็ใช้ node.js ทำงานด้วยกันทั้งนั้น

node.js กับส่วนเสริม ที่ download มาต่อยอดในงานเราได้

node package manager

node.js มี ส่วนเสริม ที่ชื่อว่า node package managment หรือมองภาพง่ายๆว่า มันเป็นเหมือน google play ใน android หรือ app store ใน iOS นั่นเอง ที่เราสามารถเอา package ที่คนอื่นเค้าเขียนเอาไว้แล้วแจกฟรี มาต่อยอดเพื่อใช้ในงานของเราได้ โดยตัวอย่างที่ได้รับความนิยมมากๆ ก็จะเป็น underscore, async, request, express เป็นต้น อย่างเช่น ตัว underscore หากเราเอามาใช้ เราก็จะสามารถใช้งาน function เช่น  _.each([1, 2, 3], alert); ได้เลย หรือ _.filter(list, iterator, [context]) ได้เลย หรือ express ก็เหมือนเป็น web framework ตัวนึงเลยติดตั้งตัวนี้แล้วตั้งค่านิดหน่อย ก็รันเว็บได้โดยไม่ต้องมี Apache เลย ซึ่ง package เหล่านี้ช่วยให้เราไม่ต้องมาเขียน function พื้นฐานเหล่านี้ด้วยตัวเราเอง ปัจจุบัน มีให้เราได้เลือกใช้เยอะมาก (ณ วันที่เขียน มี 37,784 ตัวแล้ว) จริงๆ เราก็ใช้เท่าที่งานเราจำเป็นนั่นแหล่ะครับ (เท่าที่ผมเขียนมาก็ใช้ 1-4 ตัว ต่องานประมาณนี้) การติดตั้ง ก็แสนง่าย แค่สั่ง npm install underscore เท่านั้นเอง ก็จะได้ package underscore มาใช้เลย

การจะใช้งาน node.js

node.js เวลาเราจะใช้งานมัน จะเหมือนภาษา script ที่ต้องใช้ command เพื่อสั่งให้มันทำงาน (ถ้าเคยใช้ python หรือ linux shell script หรือ windows batch ผ่าน dos ก็จะนึกออก มันคือแบบนั้นแหล่ะ) เพราะมันไม่มีตัวกลางที่คอยสร้าง request เหมือน web browser ที่ไปทำหน้าที่เรียกหาเว็บต่างๆ ดังนั้น คนที่จะใช้งาน node.js จำเป็นที่จะต้องรู้เรื่องของ linux command เบื้องต้น (แนะนำให้ทำงานบน linux มากกว่า เพราะโดยส่วนใหญ่จะใช้งานกันบน linux เวลาเจอปัญหาก็จะสามารถค้น solution ได้ง่าย) เพื่อให้พอเข้าใจ และเรียกใช้งานได้ โดยประมาณว่า จะใช้ command ของ linux เช่น cd, ls, ll, &, nohup command & , ps aux | grep node, kill, nano (vi) เท่านี้ครับ นอกเหนือจากนี้ไม่ได้ใช้เลย หรือถ้าใช้ก็น้อยมากๆ (ไม่นับเรื่องการแก้ปัญหา หรือ การปรับแต่ง linux ต่างๆนะครับ)

เวลาใช้งาน เราก็สร้างไฟล์ test.js แล้วพิมพ์ว่า console.log("yes you can do it"); แล้ว save จากนั้นไปที่ command แล้วสั่งรันด้วย node test.js เท่านี้ครับ เราก็จะได้ข้อความดังกล่าวปรากฏที่หน้าจอแล้ว (เครื่องต้องทำการติดตั้ง node.js เอาไว้ก่อนแล้วนะ)

การ debug node.js

node.js built in การ debug มาให้ด้วย วิธีใช้ก็แสนง่ายอีก คือ โดยปกติเวลาเราจะรันงานของเรา เราจะสั่ง node file.js เราก็แค่สั่งแทนด้วย node debug file.js เท่านั้นเอง หรืออีกวิธีเพื่อให้เรามองเห็นสิ่งที่ node มันทำก็คือ การใช้ console.log('message'); เพื่อ print message ออกมาให้เราเห็นผลลัพท์ ระหว่างที่เรารันไฟล์นั่นเอง ง่ายมากๆ

node.js ทำงานแบบ event driven

การทำงานของ node เค้าจะเรียกมันว่า การขับเคลื่อนด้วย event ต่างๆที่เกิดขึ้น ทำให้เรากระโดดจาก event หนึ่งที่เสร็จแล้วไปอีก event หนึ่งได้ด้วยการสั่งงานมันต่อเนื่องกันไปเรื่อยๆ หรือว่าการสั่งให้ หลายๆ event เริ่มทำงานในเวลาใกล้ๆเคียงกันเลยก็ได้เช่นกัน ประโยชน์อีกอย่างที่ได้จาก event driven ก็คือ การสั่งให้มันรอรับ event นั้นไปตลอดการณ์ โดยไม่เปลือง resource เช่น การเชื่อมต่อไปยัง streaming channel สักที่หนึ่ง อาจจะเป็น text หรือข้อมูลบางอย่างเช่นปริมาณน้ำฝน ทิ้งเอาไว้ หากต้นทางของ streaming ยังไม่มีข้อมูลส่งมา มันก็จะไม่เกิด event ใดๆ node.js ก็จะอยู่นิ่งๆ แต่หากต้นทาง streaming มาแล้ว node.js ก็จะทำงานเพื่อตอบสนองต่อ event ที่เกิดขึ้นนั้นทันที (ตรงนี้ขึ้นอยู่กับว่าเราจะเอาข้อมูลไปทำอะไรต่อ)

node.js event driven

ด้วยประโยชน์ของ event driven นี้ทำให้เราเอามาต่อยอดได้อีกหลายอย่างเช่น การ subscribe pubsub (เช่น pubsub ใน redis) หากเกิด event publish เมื่อไร node.js ที่ subscribe รอเอาไว้อยู่นานแล้ว ก็จะถูกกระตุ้นแล้วทำงานตามที่เราเขียนเอาไว้โดยทันที ซึ่งแบบนี้ จะทำให้ลดการสูญเสีย header ในการเริ่มต้นประมวลตั้งแต่จุดแรกไปได้มาก รวมทั้ง ไม่ต้องไปหน่วงเวลาเพื่อคอยเช็ค event เหมือนเวลาเราเขียน ajax เลยแม้แต่น้อย เรียกได้ว่า อยู่เฉยๆเถอะ ถ้ามีข้อมูลมาเดี๋ยวไปกระตุ้นให้ทำงานเอง (โดยต้องรันงานนั้นรอเอาไว้ก่อนแล้ว แต่อย่างที่บอก เปลืองทรัพยากรน้อยมาก)

node.js ต้องเปลี่ยนความคิด ในการออกแบบ

เนื่องด้วย มันทำงานเร็วมาก มากเสียจนเราลำดับความคิดไม่ทันเลย ฮา คือ เราไม่รู้ได้เลย ว่า event ไหนจะทำงานเสร็จก่อนอะไร ตรงนี้ต้องระวังที่สุด เพราะจากเดิมเวลาเราออกแบบ ภาษา C, PHP ,C++ , .net, python หรืออื่นๆ แนวทางการประมวลผลจะอยู่ในบรรทัดที่เราเขียนโค้ด ต้องเสร็จบรรทัดนี้ก่อน แล้วเอาผลไปใช้ในบรรทัดต่อไป แต่กับ node.js นั่นไม่ใช่เลย บรรทัดสุดท้ายของไฟล์ หลายครั้งเป็นการเริ่มต้นทำงานจุดแรก และกลับกันคือ บรรทัดแรกๆ อาจจะเป็นสิ่งสุดท้ายที่ทำเสร็จของระบบที่เราเขียนก็เป็นได้ เพราะอย่างที่บอก มันคือ event driven ก็คือถูกกระตุ้นตาม event ที่เกิดขึ้นจริง ดังนั้น การออกแบบ software ที่ใช้ node นี้ ต้องพยายามมองให้เป็น state ต่างๆ ว่า program เรากำลังทำงาน state ไหนอยู่ ซึ่งในแต่ละ state อาจจะมีการประมวลผลสองอย่างหรือมากกว่าทำงานไปพร้อมๆกันก็เป็นได้ เราต้องเขียน เพื่อดักเอาผลลัพท์ให้ดี และแม่นยำ (จับเอามาจาก callback เพราะหากมี callback นั่นคือ ทำงานส่วนนั้นเสร็จแล้ว) เพื่อจะได้เอาผลลัพท์ที่เสร็จแล้วมาทำงานในขั้นตอนต่อไปของโปรแกรมได้

callback เป็นเรื่องที่ค่อนข้างสำคัญ

ในงานที่ทำงานผูกพันกับหลายระบบ ข้อมูลจำนวนมากๆ มีการลำดับความคิดที่ชัดเจน ต้องหระมวลผลลัพท์ทีละตัว เพื่อเอาไปใช้ในขั้นตอนต่อไป เป็นลูกโซ่ แบบนี้ node ก็สามารถทำได้ โดยหากเขียนให้ง่าย เราก็จะให้การทำงานส่วนแรกไป callback ส่วนที่สอง แล้วการทำงานส่วนที่สอง callback ไปส่วนที่สามก็จะเกิด series แบบนี้ไปเรื่อยๆนั่นเอง แต่หากจะให้ง่ายและดูมีระเบียบกว่านั้น ก็คือการใช้ package async มาช่วยเรานั่นเองครับ (เห็นมั้ยครับของเล่นเค้าเยอะ) เราสามารถทำตัวให้ประมวลผลทีละบรรทัดเหมือน php เลยก็ยังได้ (แต่อย่างที่บอกว่า นั่นไม่ใช่จุดแข็งของ node.js)

node.js ก็เหมือนกับวงจรไฟฟ้า

electic circuit

อันนี้แถม สำหรับใครที่เรียน electronic มา node.js เหมือนเรากำลังออกแบบวงจรไฟฟ้าเลย ที่เมื่อเราปล่อยให้กระแสไฟฟ้าใหล มันก็จะใหลไปในทุกๆอุปกรณ์ พร้อมๆกันโดยทันที และต่อเนื่อง และตลอดไป ตราบใดที่เรายังปล่อยกระแสไฟฟ้าให้มันอยู่ (ยังรัน node งานนั้นอยู่) และการทำงานแต่ละส่วน(โค้ดแต่ละบรรทัด) ก็เหมือนอุปกรณ์แต่ละตัวที่เราใส่เข้า เอาออก เพื่อให้มันทำงานจนได้ผลลัพท์ตามที่เราต้องการ และด้วย node.js มีความสามารถในการ เขียน/อ่าน socket ได้ด้วยแล้ว หากจะเอาไปเขียนเพื่อเชื่อมต่อ hardware นั้นเป็นไปได้อย่างแน่นอนครับ และอย่างที่บอกครับ มันทำงานตลอดไป เมื่อมี data เข้ามาก็ทำงานได้ทันที

ถึงตรงนี้ คงจะเข้าใจมากขึ้นแล้ว ว่าพฤติกรรมของ node.js แบบชัดๆมันเป็นอย่างไร หากยัง งง หรือสงสัยตรงไหน ถามไว้ที่ด้านล่างได้เลยครับ

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

Create: Modify : 2013-08-14 22:14:38 Read : 29836 URL :