Hologram v0.5.0 มอบความเร็วในการเรนเดอร์เพิ่มขึ้น 50 เท่าสำหรับการพัฒนา Full-Stack Elixir

ทีมชุมชน BigGo
Hologram v0.5.0 มอบความเร็วในการเรนเดอร์เพิ่มขึ้น 50 เท่าสำหรับการพัฒนา Full-Stack Elixir

Hologram เฟรมเวิร์ก full-stack สำหรับเว็บที่ช่วยให้นักพัฒนาสามารถสร้างเว็บแอปพลิเคชันแบบโต้ตอบได้ทั้งหมดด้วย Elixir ได้ปล่อยเวอร์ชัน 0.5.0 พร้อมกับการปรับปรุงประสิทธิภาพอย่างมาก เฟรมเวิร์กนี้แปลงโค้ด Elixir เป็น JavaScript ทำให้สามารถทำงานฝั่งไคลเอนต์ได้โดยที่นักพัฒนาไม่ต้องเขียน JavaScript โดยตรง

การปล่อยเวอร์ชันนี้เป็นจุดสำคัญที่มีการ commit มากกว่า 950 ครั้งตั้งแต่เวอร์ชันก่อนหน้า โดยเน้นไปที่การปรับปรุงประสิทธิภาพและประสบการณ์ของนักพัฒนาเป็นหลัก

การเพิ่มประสิทธิภาพอย่างมากเปลี่ยนแปลงประสบการณ์ผู้ใช้

การปรับปรุงที่โดดเด่นที่สุดในรีลีสนี้คือการเขียน bitstring implementation ใหม่ทั้งหมด ซึ่งให้ความเร็วในการเรนเดอร์เพิ่มขึ้นประมาณ 50 เท่า การเพิ่มประสิทธิภาพนี้ได้เปลี่ยนประสบการณ์ผู้ใช้จากการโต้ตอบที่ช้าเป็นอินเทอร์เฟซที่ลื่นไหลและตอบสนองที่ทำงานที่ 60+ เฟรมต่อวินาที

สมาชิกในชุมชนสังเกตเห็นความแตกต่างอย่างมากทันที เว็บไซต์ของเฟรมเวิร์กเอง ซึ่งทำหน้าที่เป็นการสาธิตในโลกจริง ตอนนี้ให้การนำทางหน้าเว็บที่เกือบจะทันทีและการโต้ตอบเมนูที่ตอบสนองซึ่งก่อนหน้านี้ใช้เวลามากกว่าหนึ่งวินาทีในการทำงานให้เสร็จ

การปรับปรุงประสิทธิภาพขยายไปเกินกว่าการเรนเดอร์ โดยเวลาในการทำงานลดลงจากมิลลิวินาทีเป็นไมโครวินาทีสำหรับการทำงานหลักฝั่งไคลเอนต์หลายอย่าง สิ่งนี้ทำให้ Hologram เร็วพอที่จะจัดการกับการโต้ตอบแบบเรียลไทม์ที่ต้องการประสิทธิภาพสูง เช่น การติดตามการเคลื่อนไหวของเมาส์สำหรับแอปพลิเคชันการวาดภาพ ตามที่แสดงใน SVG Drawing Demo ใหม่

การปรับปรุงประสิทธิภาพ

  • ความเร็วในการเรนเดอร์เพิ่มขึ้น ~50 เท่าจากการเขียน bitstring ใหม่
  • เวลาในการประมวลผลลดลงจากมิลลิวินาทีเป็นไมโครวินาที
  • ความสามารถในการเรนเดอร์หน้าเว็บได้มากกว่า 60 FPS
  • เวลาในการ build แบบ incremental เร็วขึ้น 2-10 เท่า

ประสบการณ์การพัฒนาได้รับการอัพเกรดครั้งใหญ่

เวอร์ชัน 0.5.0 นำเสนอการจัดการเซสชันและคุกกี้แบบครอบคลุม ทำให้ Hologram ใกล้เคียงกับความสามารถของเฟรมเวิร์กเว็บแบบดั้งเดิมมากขึ้น นักพัฒนาตอนนี้สามารถใช้ฟังก์ชันที่คุ้นเคย เช่น put_session/3, get_session/2 และฟังก์ชันการจัดการคุกกี้พร้อมกับการรองรับตัวเลือกคุกกี้มาตรฐานอย่างเต็มรูปแบบ

การปล่อยเวอร์ชันนี้ยังเพิ่มฟังก์ชัน live reload พร้อมกับการติดตามไฟล์อย่างชาญฉลาดและ error overlay ที่สวยงามสำหรับปัญหาการคอมไพล์ เมื่อรวมกับการคอมไพล์แบบเพิ่มหน่วยที่ให้เวลาการ build เร็วขึ้น 2 ถึง 10 เท่า ประสบการณ์การพัฒนาจึงกลายเป็นสิ่งที่น่าพอใจและมีประสิทธิภาพมากขึ้นอย่างมาก

การรองรับอีเวนต์ใหม่รวมถึง pointer events และ mouse move events พร้อมกับการติดตามพิกัดแบบครอบคลุม ทำให้สามารถโต้ตอบกับผู้ใช้ได้อย่างซับซ้อนมากขึ้นซึ่งก่อนหน้านี้ยากที่จะทำให้ทำงานได้อย่างลื่นไหล

ฟีเจอร์ใหม่ใน v0.5.0

  • ระบบจัดการ session แบบครบครันพร้อม put_session/3, get_session/2, get_session/3, delete_session/2
  • รองรับ cookie อย่างเต็มรูปแบบด้วย put_cookie/3, put_cookie/4, get_cookie/2, get_cookie/3, delete_cookie/2
  • เหตุการณ์ใหม่: pointer_move, pointer_cancel, pointer_down, pointer_up, mouse_move, select
  • Live reload พร้อมการติดตามไฟล์และ error overlay
  • การใช้งาน CRDT ( Last Writer Wins Map ) สำหรับ distributed state

สถาปัตยกรรมเปลี่ยนไปสู่การสื่อสารแบบ HTTP

การเปลี่ยนแปลงสถาปัตยกรรมที่สำคัญเกี่ยวข้องกับการย้ายจาก WebSocket ไปเป็นการสื่อสารแบบ HTTP สำหรับการทำงานที่ต้องเข้าถึงข้อมูลคุกกี้และเซสชัน การเปลี่ยนแปลงนี้รวมถึงระบบ HTTP ping ใหม่ที่รักษาสุขภาพการเชื่อมต่อในขณะที่ให้ latency เกือบเท่ากับการเชื่อมต่อ WebSocket

เฟรมเวิร์กตอนนี้ใช้การ implement WebSocket แบบกำหนดเองแทนที่จะพึ่งพา Phoenix Channels ทำให้นักพัฒนามีการควบคุมการจัดการการเชื่อมต่อมากขึ้นและลดการพึ่งพาภายนอก

การเปลี่ยนแปลงสถาปัตยกรรม

  • การย้ายจาก WebSocket ไปใช้ HTTP สำหรับการดำเนินงาน cookie/session
  • ระบบ HTTP ping ที่มีช่วงเวลา 30 วินาที
  • การใช้งาน WebSocket แบบกำหนดเอง (ลบการพึ่งพา Phoenix Channels )
  • รูปแบบ Serialization เวอร์ชัน 2 พร้อมความเข้ากันได้แบบย้อนหลัง

การยอมรับของชุมชนและข้อกังวลเรื่องประสิทธิภาพ

แม้ว่าการปรับปรุงประสิทธิภาพจะทำให้ผู้ใช้งานแรกๆ ประทับใจ แต่สมาชิกในชุมชนบางคนได้แสดงความกังวลเกี่ยวกับขนาดของ bundle และเวลาในการโหลดหน้าเว็บครั้งแรก การทดสอบ Google PageSpeed Insights เผยให้เห็น runtime bundle ขนาด 104 KiB พร้อมกับคะแนน Largest Contentful Paint 1.5 วินาที ซึ่งบางคนถือว่ามากเกินไปสำหรับเว็บไซต์เอกสาร

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

การวิเคราะห์ขนาด Bundle

  • Runtime bundle ปัจจุบัน: ขนาดการถ่ายโอน 104 KiB
  • Google PageSpeed Insights LCP: 1.5 วินาที
  • การปรับปรุง bundle ยังไม่ได้ดำเนินการ
  • คาดหวังการลดขนาดอย่างมีนัยสำคัญในเวอร์ชันอนาคต

การวางตำแหน่งเทียบกับ Phoenix LiveView

Hologram วางตำแหน่งตัวเองเป็นทางเลือกแทน Phoenix LiveView สำหรับสถานการณ์ที่ต้องการการโต้ตอบฝั่งไคลเอนต์แบบทันที ในขณะที่ LiveView เรนเดอร์การอัพเดต UI บนเซิร์ฟเวอร์และส่งไปยังไคลเอนต์ Hologram แปลงโค้ด UI ของ Elixir เป็น JavaScript ที่ทำงานทั้งหมดในเบราว์เซอร์

วิธีการนี้ขจัดการเดินทางไปกลับของเซิร์ฟเวอร์สำหรับการโต้ตอบ UI ทำให้เหมาะสำหรับแอปพลิเคชันที่ต้องการความสามารถในการทำงานออฟไลน์ ลดโหลดเซิร์ฟเวอร์ หรือส่วนติดต่อผู้ใช้ที่ตอบสนองอย่างแท้จริง เฟรมเวิร์กสามารถอยู่ร่วมกันในแอปพลิเคชัน Phoenix เดียวกันได้ ทำให้นักพัฒนาสามารถเลือกวิธีการที่ดีที่สุดสำหรับฟีเจอร์ต่างๆ ได้

การปล่อยเวอร์ชันนี้แสดงให้เห็นความมุ่งมั่นของ Hologram ในการนำโมเดลการเขียนโปรแกรมที่ทรงพลังของ Elixir มาสู่การพัฒนาฝั่งไคลเอนต์ในขณะที่รักษาข้อได้เปรียบของการ deploy แบบทันทีและการเข้าถึงได้แบบสากลของเว็บแอปพลิเคชัน ด้วยการรองรับ CRDT พื้นฐานที่รวมไว้สำหรับฟีเจอร์แบบกระจายในอนาคต เวอร์ชัน 0.5.0 สร้างรากฐานที่มั่นคงสำหรับการพัฒนาต่อเนื่องของเฟรมเวิร์ก

อ้างอิง: Hologram v0.5.0 Released!