รีวิว AdonisJS (2020) ทำไมถึงน่าใช้
Table of contents
แนะนำสั้น ๆ เกี่ยวกับ AdonisJS
เกี่ยวกับ AdonisJS โดย AdonisJS คือ *Framework มุ่งเน้นเป็น MVC Framework (แต่ก็สามารถพัฒนาแค่ API ก็ได้สำหรับ Microservices) โดยผู้พัฒนาบอกว่าได้รับแรงบันดาลใจมาจาก Laravel Framework ที่มีความสุดยอด ด้วยสโลแกนที่ว่า A Laravel-style Framework for Node.js 😅
AdonisJS นั้นคล้ายคลึง Laravel แค่เขียนด้วยภาษา JavaScript ดังนั้นใครที่เคยใช้ Laravel Framework มาก่อนแล้ว ให้ลองมาอ่าน Docs ของ AdonisJS จะเข้าใจคอนเซ็ปได้เร็วมาก เพราะหลายส่วนมีความคล้ายคลึงกัน
ณ ปัจจุบัน (05/2020)
- เวอร์ชั่นเสถียรคือ AdonisJS 4.1
- และกำลังจะออก AdonisJS 5 ซึ่งมีการเปลี่ยนแปลงครั้งใหญ่ และสนับสนุนภาษา TypeScript เต็มรูปแบบ
*Framework คือกรอบหรือข้อตกลงสำหรับการใช้งาน โดยผู้พัฒนา Framework ได้กำหนดกฎเกณฑ์สำหรับการพัฒนาไว้แล้ว ซึ่ง Framework เหมาะสำหรับการพัฒนาระบบเป็นทีม ที่ต้องการความ ยืดหยุ่น กรอบแบบแผนที่ชัดเจน เพื่อใช้สื่อสารกันในทีมได้ง่าย อีกทั้งยังบำรุงรักษา Code ได้ง่าย
AdonisJS Blog Demo (Code) https://github.com/AdonisCommunity/adonis-blog-demo
ทำไมต้อง AdonisJS
การเลือก Framework สักอันนั้นเป็นเรื่องที่ค่อนข้างยุ่งยากใช่ไหม งั้นมาดูด้วยกันว่า AdonisJS มีความแตกต่างจาก Node.js framework อื่น ๆ อย่างไร 👍
-
ความเป็นมา
AdonisJS นั้นเป็นโปรเจค Open source มาตั้งแต่ปี 2015 โดยตั้งใจจะเป็น Framework ทางเลือกอื่น ๆ สำหรับ Node.js
ในอดีตผู้พัฒนา เคยร่วมพัฒนากับ Laravel Framework และหลังจากนั้นก็ย้ายไปใช้ Node.js จึงได้ค้นหา Framework สำหรับ Node.js ที่ตัวเองชอบ ... แล้วก็ค้นพบว่า
- Framework เช่น Express, Koa นั้นระบบ Routing สนับสนุนการทำ Middleware
- Framework เช่น SailsJS นั้นออกแบบมาไม่ดี (badly architected)
- Meteor มีอะไรที่เกินความจำเป็น เช่น มี Package manager เป็นของตัวเอง
สรุปเลยก็คือ โดยส่วนใหญ่ Framework ทั้งหมดนั้น จะไม่มีรูปแบบเครื่องไม้ เครื่องมือของตัวเอง เพราะเน้นพึ่งพา Packages Dependency เป็นส่วนใหญ่ และแน่นอน Framework อย่าง Express, Koa นั้นมีความสามารถในบางกรณี แต่ผู้คนส่วนใหญ่ก็อยากใช้ความสามารถจาก Full Stack Framwork อย่างเช่น Rails หรือ Laravel แต่ไม่ใช่สำหรับ Node.js
ดังนั้นอย่างในส่วน HTTP Server ของ AdonisJS ก็จะไม่ได้อาศัย Express ด้วย ดังนั้นก็เลยไม่มีการอธิบายการใช้ Middleware ของ Express นั่นก็หมายความว่า AdonisJS มี HTTP Server ของตัวเองมีระบบ Middleware ของตัวเอง เลยเป็นเหตุผลที่ว่า AdonisJS ได้พัฒนาขึ้นด้วยพื้นฐานและด้วยหลักการ เป้าหมายที่ชัดเจน
-
Framework ที่มีระบบรวม (Integrated Systems) สำหรับพร้อมใช้ทันที
มาดูกันว่า Integrated Systems นั้นมีประโยชน์อย่างไร ซึ่ง AdonisJS นั้นได้ให้ความสำคัญเรื่อง integrated systems อย่างมาก โดยแทนที่จะแนะนำให้คุณใช้ไลบรารี่ต่าง ๆ นา ๆ เพื่อเข้ามาช่วยในโปรเจคของคุณ แล้วพูดว่า “คุณสามารถเลือกใช้ในสิ่งที่คุณต้องการ” แต่ AdonisJS ได้มีการสร้าง class พื้นฐานสำหรับทุกส่วนเพื่อให้คุณได้พร้อมใช้แล้ว
ประโยคที่ว่า “คุณสามารถเลือกใช้ในสิ่งที่คุณต้องการ” ก็เป็นคำพูดที่ดูสวยหรู “โปรดทำทุกอย่างด้วยตัวเอง เราได้รวบรวมรายชื่อไลบรารี่ไว้สำหรับคุณแล้ว” 😅
เอาละ ก็อย่างที่ว่า การที่แนะนำรายการไลบรารี่ไว้นั้น ก็ไม่ใช่เรื่องแย่ซะทีเดียว แต่นั่นก็หมายความว่า Framework จะมีขั้นตอนที่เยอะกว่าปกติที่จะทำให้งานสำเร็จ โดยเมื่อถ้า Framework ไม่ได้มีเครื่องมือที่ Integrated Systems ไว้แล้วนั้น ก็จะอารมณ์ประมาณว่า คุณกำลังถูกปล่อยทิ้งไว้ดงกาวโค้ด (glue code) 😅
กาวโค้ด คือการนำโค้ดหรือ Libs แต่ละส่วนมาเชื ่อมต่อกันให้ทำงานร่วมกันได้
งั้นมาดูตัวอย่างเล็ก ๆ น้อย ๆ ที่จะอธิบายให้คุณเห็นว่า คุณจะต้องกาวโค้ดของคุณอย่างไร 😅
- สมมุติคุณเลือก Framework หลักสักอัน
- แน่นอนคุณก็เลือกไลบรารี่ยอดฮิตสักอันมาเป็นตัวรับ Body parser สำหรับเข้าถึง Input Form และ Files Uploaded
- สเต็ปถัดไปคุณอาจจะต้องใช้ไลบรารี่ Validation สำหรับตรวจสอบข้อมูลจากฟอร์ม แต่ดูเหมือนว่าไลบรารี่ Validation จะไม่มีวิธีการที่เกี่ยวกับตรวจสอบ Properties สำหรับการมีอยู่ของไฟล์ออปเจ็คที่ถูกส่งมาจาก Body parser .... 😅 ดังนั้นคุณต้องเขียนบางอย่างสำหรับเชื่อมต่อทั้ง 2 อย่างนั้นให้สามารถทำงานร่วมกันได้ จึงเรียกว่า การกาวโค้ด ยังไงละ 😅
- แต่เดี๋ยวก่อน คุณอาจจะต้องตรวจสอบ Email ด้วยกันกัน อย่างเช่นเพื่อให้แน่ใจว่าเป็น Email ที่ไม่ซ้ำอยู่ในฐานข้อมูล (Unique) ไลบรารี่ Validation ก็ดูเหมือนจะไม่มีวิธีการที่เกี่ยวกับตรวจส อบวิธีการเหล่านั้น ... เห็นมั้ยละ ต้องกาวโค้ด อีกแล้ว 😅
นั่นไงละ จะเห็นว่าที่ได้เล่ามาข้างต้นนั้น มันก็เป็นข้อเท็จจริง ที่อาจจะเกิดขึ้นในโลกของการพัฒนาระบบจริง ซึ่งอาจจะมีส่วนอื่นหลาย ๆ เหตการณ์ที่อาจจะเกิดขึ้น จาก Framework ที่ไม่มี Integrated System จากนั้นคุณจะพบว่าตัวเองเขียนโค้ดกาว มากกว่าโค้ดจริงเสมอ 😅
นอกจากนี้ก็อย่าเข้าใจผิดละว่า Integrated System จะเป็นคุณสมบัติแบบ Hardcoded AdonisJS ได้พัฒนา ORM และ Validation Engine เป็นสองโมดูลแยกจากกัน และแน่นอนตัว Framework ก็ได้สร้าง APIs ที่อนุญาตผู้ที่จะเขียนโมดูลสำหรับกาวโค้ดได้อีกด้วย
-
ประสิทธิภาพและประสบการณ์สำหรับนักพัฒนา
ใน AdonisJS นั้นได้ให้ความสำคัญกับการพัฒนา ประสบการณ์ของนักพัฒนา การใช้ TypeScript คำสั่ง CLI และเอกสารประกอบที่ครอบคลุม ซึ่งล้วนเป็นสิ่งที่มีส่วนทำให้ไปถึงเป้าความความสำเร็จที่ดี
นอกจากนี้ที่ได้เล่ามาเกี่ยวกับเครื่องมือต่าง ๆ ก็ยังไม่เพียงพอ AdonisJS ได้ใส่ใจความสวยงามของโค้ดด้วยเช่นกัน โดยทุกส่วนของ Framework จะรู้สึกคล้ายกับว่าทุกไลบรารี่เป็นสมาชิกในครอบครัวเดียวกัน ในความเป็นจริงนี่คือเหตุผลหนึ่ง ในการพัฒนา Framework ที่ใช้ไลบรารี่แพ็คเก็จของภายใน Framework เอง
-
คุณสมบัติเด่น
AdonisJS นั้นได้มีคุณสมบัติต่าง ๆ มากมาย ซึ่งคุณสามารถสำรวจได้จากคู่มือเอกสารได้ แต่ก็ได้ก็มีคุณสมบัติเด่น ๆ ที่ได้ยกมาอธิบายให้อ่านกันดังนี้
- SQL ORM ที่สุดยอดและมีประสิทธิภาพ มันมาพร้อมกับ Query builder, Migrations และ Active Record Models
- ระบบเราเตอร์ HTTP ที่สุดยอด มากับพร้อมคุณสมบัติเช่น Route groups (อันนี้หายากในบาง Framework ไม่มีด้วยซ้ำ 👍), Subdomains, Pttern matching และ ระบบ Resourceful routes
- Form validator ที่มีความสามารถตรวจสอบตามประเภทของข้อมูล และบางทีก็ไม่จำเป็นต้องสร้าง Interface สำหรับ HTTP Request body ทุก Method
- มีระบ บ Health check module ช่วยให้คุณควบคุมตรวจสอบ เหมือน Kubernetes
- ให้ความสำคัญกับระบบความปลอดภัย (Web security) ตามมาตรฐานเพื่อป้องกันการโจมตีในรูปแบบต่าง ๆ
ทีนี้มาดูลักษะเฉพาะของ AdonisJS 4.1 กัน
AdonisJs คือ Web Framework มุ่งเน้นเป็น MVC framework (แต่ก็สามารถพัฒนาแค่ API สำหรับ Microservices ได้) โดยผู้สร้างบอกว่าได้รับแรงบันดาลใจมาจาก Laravel Framework ที่มีความสุดยอด ด้วยสโลแกนที่ว่า A Laravel-style Framework for Node.js 😅
AdonisJS นั้นคล้ายคลึง Laravel มากแค่เขียนด้วยภาษา JavaScript (ของ Laravel ใช้ PHP) ดังนั้นใครที่เคยใช้ Laravel Framework มาก่อนแล้ว ให้ลองมาอ่าน Docs ของ AdonisJS จะเข้าใจคอนเซ็ปได้เร็วมาก เพราะหลายส่วนมีความคล้ายคลึงกัน
- ระบบ Routing โดยก็ไม่ได้มีอะไรโดดเด่นจาก Framework ตัวอื่น ๆ ของ Node.js มากนัก โดยส่วนใหญ่มีคุณสมบัติที่คงได้รับแรงบันดาลใจมาจาก Laravel แต่มีคุณสมบัติอย่างนึงที่ผมชอบเป็นการส่วนตัว เพราะมันมีประโยชน์มาก ๆ คือ ระบบ Route Groups (Framework อื่น ๆ อาจจะไม่มีด้วยซ้ำ ต้องหาไลบรารีอื่น ๆ มาลงเพิ่มเอา)โดยการทำงานจะเป็นการทำ Prefix สำหรับกลุ่มของ Route ต่าง ๆ ประโยชน์ที่ชัดเจนเลยก็คือ ช่วยจัดกลุ่มของระบบ และไม่จำเป็นต้องพิมพ์ Prefix URL Path ทุกกลุ่ม Route เดียวกัน และอีกคุณสมบัติที่ชอบโดยส่วนตัวเลยก็คือด้วยความเป็น Route Group ทำให้สามารถกำหนด Middleware ของกลุ่มได้ง่ายขึ้น นอกจากนี้ก็มีคุณสมบัติอื่น ๆ เช่น Group Formats, Namespace, Domain สามารถเข้าไปอ่านเพิ่มเติมได้
- ระบบ Middleware (โดยส่วนตัวเวลาที่ไปหาดู Framework ต่าง ๆ เป็นสิ่งแรก ๆ ที่ผมจะต้องดูเลยว่า Framework นั้น ๆ มีระบบจัดการ Middleware เหรอเปล่า 😅) โดย Middleware มีประโยชน์ในการจัดการอะไรบางอย่างก่อนที่ Route จะวิ่งไปทำงานที่ Method ใน Controller เหมาะสำหรับการประยุกต์สร้างสำหรับระบบตรวจสอบสิทธิ์การเข้าถึง Route ต่าง ๆ เพราะต้องผ่าน Middleware ที่ได้กำหนดไว้ก่อนเสมอ
- ระบบ Controllers มีความสามารถคล้าย ๆ Framework อื่น ๆ ทั่ว ๆ ไป โดยภายในจะประกอบด้วย Method ต่าง ๆ ที่ใช้เชื่อมโยงกับระบบ Route สามารถกำหนดได้ว่าจะให้ Method นั้น Return ค่าเป็น View (MVC) หรือ Return เป็น JSON ออกมาเลยก็ได้
- ระบบ Views ที่มีความคล้ายคลึงกับระบบ Blade Template engine ของ Laravel โดยมีคุณสมบัติเช่น Layouts, partials, Components, Logical tags เป็นต้น
- ระบบ Authentication สามารถใช้ได้ทั้งระบบ Session, Basic Auth, Access Token และมี JWT ในตัวไม่ต้องหามาลงเพิ่ม
- ระบบ CLI ที่เรียกว่า Ace Commands สามารถใช้คำสั่งต่าง ๆ ช่วยในการจัดการโปรเจคงานเช่นคำสั่งจัดการ Migration ตารางฐานข้อมูล นอกจากนี้โดยส่วนตัวยังชอบที่เราสามารถสร้าง Custom Commad ได้เองซึ่งมีประโยชน์หากเอาไปประยุกต์สำหรับงานที่ต้องการรันคำสั่ง Jobs อะไรบางอย่างเป็นเบื้องหลัง หรือทำงานร่วมกับระบบคิว (Ace Cmd จะรันได้แค่ภายใน Root path ของโปรเจค AdonisJS เท่านั้น)
- ระบบ adonis CLI (Global) มีประโยชน์เอาไว้สั่ง New Project สั่งดู List ของ Route ทั้งหมดในโปรเจค และ สั่ง Generate Class หรือ Service ต่าง ๆ เช่น make:command, make:controller, make:view, make:middleware, make:model เป็นต้น
- ระบบ Model สามารถใช้ได้ทั้งแบบ Query Builder และแบบ ORM ที่เรียกว่า Lucid ORM ซึ่งก็สนับสนุนฐานข้อมูลหลายตัว เช่น MariaDB, MSSQL, MySQL, Oracle, PostgreSQL, SQLite3
- มี WebSocket สำหรับสร้าง Real-Time Apps
- ระบบ Testing จะมี Unit Tests, Functional Tests นอกจากนี้ยังมี e2e Testing เช่น HTTP Tests, Browser Tests
สรุป
AdonisJS ก็ถือเป็นตัวเลือกที่ดี อีกตัวสำหรับทางเลือกผู้ที่กำลังหา Node.js Framework สักตัว และแน่นอนผู้ที่เคยใช้ Laravel Framework มาก่อนนั้นเหมาะมากที่จะศึกษา เพราะโครงสร้างนั้นมีความคล้ายคลึง (แต่ก็ไม่ได้เหมือนหมดซะทีเดียว)
ในการเขียน AdonisJS นั้นจะใช้ภาษา JavaScript (AdonisJS 5 นั้นจะ Support TypeScript ด้วย) และรันด้วย Node.js ดังนั้นจึงมั่นใจว่าจะทำให้มีประสิทธิภาพค่อนข้างสูง (สูงกว่า PHP เป็นเท่าตัว)
จากส่วนตัวโดยภาพรวมจากที่ได้ใช้งานมาพบว่า เครื่องไม้ เครื่องมือต่าง ๆ ที่เป็น Ecosystem ภายใน Framework ค่อนข้างพร้อมที่จะใช้งานได้เลย ไม่ต้องหาลงอะไรเพิ่ม หรือต้องโดดไปอ่านเอกสารไลบรารี่อื่น ๆ ร่วมมากมาย โดยสามารถใช้พัฒนาโปรเจคได้ทั้งแบบ MVC หรืออยากได้แบบแค่ API ก็ได้ ส่วนระบบความปลอดภัย และระบบยืนยันตัวตนก็มี JWT และ Access Token ไว้ให้พร้อมใช้ ในส่วนของไลบรารี่ที่ใช้ รับ - ส่ง ค่า ทั้ง Request, Response โดยเฉพาะ Request ทำงานกับ Validation ได้ดีมาก มี Method สำหรับการเช็ค Validate หยิบย่อยมาก ส่วนไลบรารี่ Storage ก็รองรับ Driver หลายตัว เช่นแบบ Local file, Amazon S3, DigitalOcean Spaces เหมาะอย่างมากที่จะ Scale ระบบให้มีขนาดใหญ่ขึ้น ไม่ต้องหาไลบรารี่มาทดลองใช้ เพราะมีในตัว Framework อยู่แล้ว ดีมากอยากให้ลองกันดูครับ 👍
ฝากตารางเทียบเทียบ AdonisJS Vs. Laravel ไว้หน่อยละกัน
Comparing AdonisJS to Laravel - Modus Create From: https://moduscreate.com/blog/comparing-adonisjs-to-laravel/
References:
- About AdonisJS From https://adonisjs.com/docs/4.1/about
- Why AdonisJS? From https://preview.adonisjs.com/why-adonisjs