- เป็น ภาษาประกาศเชิงคำสั่งที่ขยายไวยากรณ์ HTML เพื่อสร้างเว็บอินเทอร์เฟซแบบไดนามิกและตอบสนองได้ พร้อมมอบสภาพแวดล้อมการพัฒนาที่คุ้นเคยสำหรับผู้ใช้ HTML เดิม
- รองรับ การเรนเดอร์แบบสตรีมมิง ที่ทำให้เซิร์ฟเวอร์ส่งคอนเทนต์ได้ทันที และแสดงผลหน้าจอได้แม้ก่อนที่ JavaScript bundle ฝั่งไคลเอนต์จะโหลดเสร็จ
- ใช้ การทำ bundling แบบละเอียด (fine-grained bundling) เพื่อลดการส่งโค้ดที่ไม่จำเป็นให้น้อยที่สุด ช่วยเพิ่มประสิทธิภาพและความเร็วในการโหลด
- รองรับ การคอมไพล์แบบปรับแต่งตามสภาพแวดล้อม (targeted compilation) เพื่อสร้างผลลัพธ์ที่มีประสิทธิภาพเหมาะกับทั้งเบราว์เซอร์และเซิร์ฟเวอร์
- มี การรองรับ TypeScript แบบผสานรวม และฟีเจอร์ในเอดิเตอร์ที่ครบถ้วน ช่วยเพิ่มผลิตภาพในการพัฒนาและคุณภาพของโค้ด
ภาพรวมของ Marko
- Marko คือ ภาษาประกาศเชิงคำสั่งที่ตีความ HTML ขึ้นใหม่ โดยมีเป้าหมายเพื่อสร้างส่วนติดต่อผู้ใช้ที่ไดนามิกและตอบสนองได้
- HTML ที่ถูกต้องส่วนใหญ่สามารถใช้งานใน Marko ได้ตามเดิม
- ขยายไวยากรณ์ของ HTML เพื่อให้เขียนแอปพลิเคชันสมัยใหม่แบบประกาศเชิงคำสั่งได้
- ถูกใช้งานจริงในระบบบริการของ เว็บไซต์ทราฟฟิกขนาดใหญ่ เช่น eBay.com
- หากรู้จัก HTML, CSS และ JavaScript ก็สามารถเริ่มใช้งานได้ทันทีโดยแทบไม่มีเส้นโค้งการเรียนรู้เพิ่มเติม
คุณสมบัติหลัก
- มีฟีเจอร์ การเรนเดอร์แบบสตรีมมิง (Streaming) ที่ทำให้เซิร์ฟเวอร์ส่งคอนเทนต์ที่พร้อมแล้วได้ทันที
- สามารถแสดงผลหน้าจอเริ่มต้นได้แม้ก่อนที่ JavaScript bundle ฝั่งไคลเอนต์จะโหลดเสร็จ
- HTML, รูปภาพ และแอสเซ็ตต่าง ๆ โหลดแบบอะซิงโครนัส เพื่อให้ได้การเรนเดอร์หน้าจอแรกที่รวดเร็ว
- ใช้ การทำ bundling แบบละเอียด (Fine-Grained Bundling) เพื่อส่งเฉพาะโค้ดที่จำเป็น
- ลบโค้ดที่ไม่ได้ใช้งาน และข้าม hydration ที่ไม่จำเป็นในระดับซับเทมเพลต
- ออกแบบภายใต้แนวคิด “Lean by default, Fast by design”
- รองรับ การคอมไพล์แบบปรับแต่งตามสภาพแวดล้อม (Targeted Compilation)
- สร้างผลลัพธ์ที่ปรับแต่งเหมาะสมกับแต่ละสภาพแวดล้อม โดยคำนึงถึงความแตกต่างระหว่างเบราว์เซอร์และเซิร์ฟเวอร์
- โหลดได้เร็วขึ้น, bundle เล็กลง, และพัฒนาได้ด้วยภาษาเดียวแบบรวมศูนย์
ตัวอย่างโค้ดและไวยากรณ์
ประสิทธิภาพและการขยายตัว
- รองรับ การเรนเดอร์ครั้งแรกที่รวดเร็วขึ้น (Faster First Paint) ช่วยยกระดับประสบการณ์ผู้ใช้
- ขยายสเกลได้ (Scalable) : สามารถขยายได้อย่างยืดหยุ่นตั้งแต่เทมเพลต HTML แบบง่ายไปจนถึงโครงสร้างคอมโพเนนต์ที่ซับซ้อน
- ด้วย รันไทม์ขนาดเล็กและคอมไพเลอร์ที่ปรับแต่งมาอย่างดี ทำให้ยังคงรักษาประสิทธิภาพสูงได้ในสภาพเครือข่ายที่หลากหลาย
การผสานรวม TypeScript และเครื่องมือนักพัฒนา
- มี การรองรับ TypeScript ในตัว พร้อมความสามารถด้านการอนุมานชนิดข้อมูลที่แข็งแกร่ง
- รักษาความสอดคล้องของชนิดข้อมูลระหว่างเทมเพลตและคอมโพเนนต์
- รองรับฟีเจอร์ในเอดิเตอร์ เช่น การเติมโค้ดอัตโนมัติ, ไปยังคำจำกัดความ, การไฮไลต์ไวยากรณ์ และการจัดรูปแบบ
- มอบ สภาพแวดล้อมการพัฒนาที่เสถียร ด้วยการตรวจจับข้อผิดพลาดได้ตั้งแต่เนิ่น ๆ และช่วยยกระดับคุณภาพโค้ด
บทสรุป
- Marko คือภาษาเว็บสมัยใหม่ที่ผสาน ไวยากรณ์ที่เป็นมิตรกับ HTML, การเรนเดอร์ประสิทธิภาพสูง, การทำ bundling ที่ละเอียด, และ การผสานรวม TypeScript เข้าไว้ด้วยกัน
- ทำงานได้อย่างมีประสิทธิภาพทั้งบนเซิร์ฟเวอร์และไคลเอนต์ พร้อมมอบ ความสามารถในการขยายระบบและประสิทธิภาพที่เหมาะกับการให้บริการขนาดใหญ่
2 ความคิดเห็น
ตอนนี้ก็คงเป็น Svelte ล่ะมั้ง
ความคิดเห็นบน Hacker News
อยากให้ HTML เองรองรับ HTTP verb ทุกแบบได้ โดยไม่ต้องใช้ JavaScript ในอนาคต เช่น put, delete และมี input control อย่าง dropdown, multi-select, วันที่, เวลา ให้มาเป็นพื้นฐาน รวมถึงส่งฟอร์มได้โดยไม่ต้อง reload ทั้งหน้า
ตอนที่ได้ยินชื่อ htmx ครั้งแรกก็หวังว่าจะเป็นแบบนั้น แต่ของจริงกลับอยู่แค่ระดับ intercooler
ฟีเจอร์พวกนี้ต้องอาศัยการรองรับอย่างกว้างขวางจาก browser vendors
ดูรายละเอียดได้ใน โปรเจกต์ Triptych
ในฐานะคนที่เคยทำ JavaScript framework เอง มองว่า Marko ถูกประเมินค่าต่ำเกินไป
การ optimize ตอน compile time น่าประทับใจมาก และเอกสาร คำอธิบายเรื่อง fine-grained bundling ก็ยอดเยี่ยม
ใน การเปรียบเทียบประสิทธิภาพ Kanban board ก็ทำผลงานได้ดีจริง
React พอจับคู่กับ Next.js แล้วก็ทรยศต่อแก่นของแพลตฟอร์ม และตอนนี้แทบไม่มีเหตุผลให้เลือกใช้อีกต่อไป
สมัยที่ React แบบ static hydration รันอยู่บน CDN ยังดีกว่ามาก
ถึงอย่างนั้นก็เริ่มคิดว่าควรลองดู Marko ด้วย
อยากให้มี การวิเคราะห์เชิงลึก แบบนี้กับฝั่ง desktop framework อย่าง Electron บ้าง
เหตุผลที่ชอบ React ก็เพราะมันเป็นแค่ “JavaScript ล้วน ๆ”
ไม่ชอบไวยากรณ์แบบ
<let>หรือ<for>แค่คุ้นจนลืมไป เวลาเจอ framework ใหม่ควรจำจุดนี้ไว้
รูปแบบอย่าง
{% for user in users %}หรือ{#each users as user}ชัดเจนกว่ามากJSX เองก็ไม่ได้สมบูรณ์แบบ — ไวยากรณ์
{users.map(...)}ก็ยังเยิ่นเย้ออยู่ดีนี่ก็เป็นเหตุผลที่ Vue กับ Svelte ได้รับความนิยม
อนึ่ง Vue ก็เขียนด้วย JSX ล้วน ๆ ได้ถ้าต้องการ
DSL มันพองตัวขึ้นเรื่อย ๆ และยิ่งซับซ้อนขึ้นจาก hook อย่าง useFormStatus หรือ useActionState
ในทางกลับกัน ไวยากรณ์ของ Marko ดูตรงไปตรงมา ฟังก์ชันก็ดูเป็นฟังก์ชัน ตัวแปรก็ดูเป็นตัวแปร จึงเข้าใจง่ายกว่า
แนวทางเอา JS ไปใส่ใน HTML ดูสดใหม่ดี
Ryan Carniato เคยมีส่วนกับโปรเจกต์นี้ ก่อนจะไปนำ SolidJS ต่อ เลยสงสัยว่าทำไมถึงย้อนกลับไปใช้สไตล์ HTML-in-JS อีก
ทั้งสองโปรเจกต์พัฒนาต่อกันด้วยการแลกเปลี่ยนไอเดีย และทุกวันนี้ก็ยังมีปฏิสัมพันธ์กันอยู่
นักพัฒนาจำนวนมากคุ้นเคยกับมัน และฝั่ง editor กับ TypeScript support ก็พร้อมอยู่แล้ว
วงการฟรอนต์เอนด์วนไปวนมามากว่า 20 ปี จนเหมือนกลับไปสู่ paradigm ยุค JSP อีกครั้ง
ตอนนั้นคนเมินเพราะมองว่าเชย แต่สุดท้ายดูเหมือนมันจะถูกทาง
บางอย่างหายไป แต่ความคิดสร้างสรรค์ของคนรุ่นถัดไปก็ทำให้เกิดสิ่งใหม่
เพียงแต่ต้องระวังเรื่องการขยายระบบในระดับใหญ่
เพราะบางสถานการณ์ แนวทางอื่นอาจเหมาะกว่า
ตอนนั้นความต้องการคือ mobile app และสถาปัตยกรรมแบบ API-centric ซึ่ง SPA ตอบโจทย์นั้น
ทุกวันนี้มันไม่ใช่การกลับไปหา JSP แต่เป็นกระบวนการหาจุดสมดุล ระหว่างสองฝั่ง
Marko เป็นเทคโนโลยีที่ ผ่านการพิสูจน์ใน eBay แล้ว
ใช้มาหลายปีโดยไม่เคยเจอปัญหาเลย
ในทางกลับกัน Facebook, Instagram และ Messenger ที่สร้างบน React กลับมีบั๊กฝั่ง UI ไม่ขาดสาย
ถ้าดูผลในบริการขนาดใหญ่จริง ๆ จะเห็นว่า Marko โดดเด่นเรื่องความเสถียร
Marko เคยขึ้น HN มาหลายรอบแล้ว
มีเธรดที่เกี่ยวข้องใน มกราคม 2023, สิงหาคม 2017, และ กุมภาพันธ์ 2015
ดูเหมือนเป็นไวยากรณ์ที่พัฒนาขึ้นจาก JSX มากพอสมควร
โดยเฉพาะ ไวยากรณ์แบบย่อสไตล์ Pug ที่ชอบมาก แต่ก็สงสัยว่าทำไมถึงเอาไปซ่อนไว้ลึกในเอกสาร
เอกสาร Concise Syntax
แต่ไม่ชอบ ข้อผิดพลาดของ syntax highlighting กับวิธีแยกแอตทริบิวต์ในเอกสาร
ช่วงหลังใช้ Svelte เป็นหลัก แต่ก็ยังรอไวยากรณ์ที่สง่างามกว่านี้อยู่
ไวยากรณ์ที่อิงช่องว่างนั้นไม่เลว แต่รูปแบบอย่าง
--และความยากในการ parse น่าเสียดายทีม Marko ทำ Hacker News clone ออกมาเผยแพร่เองเพื่อแนะนำ Marko 6
ดูตัวอย่างบน GitHub
คงเพราะเป็นภาษาที่ทำขึ้นเพื่อเดโม เลยตลกดีที่ข้อความไล่สีอย่าง “HTML-based” กับ “building web apps” กลับมองไม่เห็น