Brut - เว็บเฟรมเวิร์กใหม่สำหรับ Ruby
(naildrivin5.com)- สำหรับระบบนิเวศของ Ruby เป็นเว็บเฟรมเวิร์กที่เรียบง่ายและทรงพลังบนหลักการ นามธรรมต่ำและขั้นตอนน้อย (low-ceremony) และมอบโครงสร้างแบบเน้น หน้า ฟอร์ม และการกระทำเดี่ยว โดยไม่ใช้แนวคิด คอนโทรลเลอร์และทรัพยากร REST
- การเรนเดอร์ HTML ฝั่งเซิร์ฟเวอร์, การเขียน JS/CSS ด้วยตัวเอง, การเชื่อมต่อ OpenTelemetry, เครื่องมือ Ruby สมัยใหม่อย่าง Sequel และ OptionParser ถูกรวมไว้ในตัว ทำให้ติดตั้งและพัฒนาได้ภายในไม่กี่นาที
- โครงสร้างแบบอิงคลาส, การจัดการเซสชัน ฟอร์ม และพารามิเตอร์ตามชนิดข้อมูลจริง การลดการใช้เมธอดไดนามิกและ Hash ให้เหลือน้อย เพื่อให้ได้ โค้ดที่ชัดเจนและมีการสร้างเอกสารอัตโนมัติ
- การใช้ประโยชน์จากแพลตฟอร์มเว็บล่าสุด: การรวมการตรวจสอบฝั่งเซิร์ฟเวอร์และไคลเอนต์, BrutJS (Web Components), การ bundle และใส่ hash ให้กับ CSS ด้วย esbuild, และการเสริมทักษะพื้นฐานด้านนโยบายความปลอดภัยและการออกแบบ DB
- ลดการใช้ YAML และการตั้งค่าด้วย Ruby/Hash พร้อมชื่อและการแยกบทบาทที่ชัดเจน เป้าหมายคือการใช้ Ruby และเทคโนโลยีเบราว์เซอร์อย่างสนุกโดยไม่บังคับนามธรรมหรือ pattern ที่ไม่จำเป็น
คุณสมบัติหลักของเฟรมเวิร์ก Brut
โครงสร้างใหม่โดยสมบูรณ์ – เน้นหน้าแทนคอนโทรลเลอร์
- แทนคอนโทรลเลอร์ ทรัพยากร REST และ route action ด้วย คลาสหน้า คลาสฟอร์ม และตัวจัดการแอ็กชันเดี่ยว
- HTML ถูกสร้างโดยตรงบนเซิร์ฟเวอร์ สามารถเขียน JS/CSS ได้ตามต้องการ
- ตัวอย่าง: หน้าแสดงเวลา สามารถกำหนดได้ทันทีด้วย
TimePage < AppPage
การใช้ประโยชน์จากแพลตฟอร์มเว็บสมัยใหม่อย่างเต็มที่
- ประสบการณ์ผู้ใช้ฟอร์มแบบบูรณาการการตรวจสอบทั้งฝั่งเซิร์ฟเวอร์และไคลเอนต์
- รองรับการขยาย HTML อย่างค่อยเป็นค่อยไปด้วย BrutJS (ไลบรารี Web Components)
- ทำ CSS bundle และการตั้ง hash ด้วย esbuild อย่างกระชับ โดยไม่ต้องใช้ PostCSS หรือ SASS
พื้นฐานการพัฒนาที่มีประสิทธิภาพในตัว
- OpenTelemetry instrumentation ในตัว, การเข้าถึงข้อมูลด้วย Sequel, และการทำ automation คำสั่งด้วย OptionParser
- นโยบายความปลอดภัยเริ่มต้น, ค่าเริ่มต้นคอลัมน์/foreign key/index ของ DB, เวลาแบบ timezone-aware เสมอ, และการกำหนด locale ที่ใช้งานง่าย (Localization)
- การทดสอบด้วย RSpec, การสร้างข้อมูลด้วย Faker/FactoryBot, และ การสร้าง HTML ด้วย Phlex
ลดการใช้ YAML และโครงสร้างการตั้งค่าที่ชัดเจน
- I18n ใช้ Ruby Hash เป็นหลัก และการตั้งค่าที่เปลี่ยนได้ถูกจัดการด้วย dotenv (แทบไม่ใช้ YAML)
- ใช้ YAML ก็ต่อเมื่อเป็น docker-compose เท่านั้น
ไม่บังคับการนามธรรมหรือ pattern ที่ไม่จำเป็น
- ตั้งชื่อและโครงสร้างให้ชัดเจน (เช่น
WidgetsPageเข้าถึงที่/widgets) - สามารถแยกเลเยอร์ข้อมูล (DB::Widget) และเลเยอร์โดเมน (Widget) ออกจากกันได้อย่างสมบูรณ์
- ไม่มีแนวคิดคอนโทรลเลอร์ สามารถเขียน business logic ตามวิธีที่ต้องการได้
- ไม่บังคับใช้รูปแบบฟังก์ชันนัลที่ซับซ้อน, Monad, Proc และ pattern อื่น ๆ
ประสบการณ์การพัฒนาและความยืดหยุ่น
- มีเครื่องมือสำคัญของ ecosystem Ruby สมัยใหม่อย่าง RSpec อยู่ในตัว
- ใช้ไลบรารีหลักเช่น Phlex (HTML), Faker/FactoryBot, Sequel, OpenTelemetry อย่างเต็มที่
- ออกจากการเขียน boilerplate การตั้งค่า และการตัดสินใจซ้ำซาก มุ่งเน้นไปที่ “ความสนุก” ของ Ruby และเทคโนโลยีฝั่งเบราว์เซอร์
ทำไมถึงเลือก Brut?
- แทนที่จะวนเวียนกับการตั้งค่าเดิม ๆ การถกเถียงเรื่องการออกแบบและโครงสร้างไม่รู้จบ และความยืดหยุ่นที่เกินความจำเป็นของ Rails และเฟรมเวิร์กเดิมอื่น ๆ เรามุ่งที่ความสนุกของตัวโค้ด
- ในฐานะเฟรมเวิร์กเว็บแอป Ruby ที่สร้าง พัฒนา และ deploy ได้อย่างรวดเร็ว เป้าหมายคือการมุ่งสู่ ประสิทธิภาพและความชัดเจน
การเริ่มต้นและแผนในอนาคต
- รองรับอิมเมจทางการของ Brut และการสร้าง/เรียกใช้งานแอปอย่างรวดเร็วผ่านคำสั่ง
- มีตัวอย่างแอปใช้งานจริงเช่น ADRs.cloud
- จะมีการอัปเดตเวอร์ชัน 1.0 และ road map อย่างต่อเนื่อง
3 ความคิดเห็น
https://naildrivin5.com/blog/2025/…
น่าจะแก้เป็นลิงก์นี้
เหมือนว่าลิงก์จะใส่ผิดนะครับ
ความคิดเห็นใน Hacker News
ชอบแนวทางที่โฟกัสที่ forms และ pages มาก ผมเองก็ใช้วิธีแบบนี้ในแอปของตัวเองเช่นกัน ทุกการโต้ตอบถูกขับเคลื่อนด้วย Forms และ Links ส่วนการปรับปรุงด้วย JavaScript ทั้งหมดก็แทบจะเป็นแค่การกด form ที่มีอยู่เดิมอยู่แล้วเท่านั้น (รวมถึงที่ซ่อนไว้ด้วย) ทำให้สามารถเปิดดู HTML ได้ตรงๆ เสมอเพื่อรู้ชัดว่า route ไหนเป็นตัวจัดการการโต้ตอบจริงๆ ผมมองว่า controllers ถูกใช้งานเกินความจำเป็น ที่จริงมีแค่ forms กับ models (ฝั่งแบ็กเอนด์) และ views (Pages) ก็เพียงพอแล้ว ส่วน validation จำนวนมากหรือขั้นตอนซ้ำๆ ใน controller นั้น framework น่าจะจัดการให้ได้อย่างสวยงามกว่านี้
ชอบคำอธิบายที่บอกว่าไม่จำเป็นต้องเข้าใจแนวคิดซับซ้อนอย่าง monad, algebraic data types, currying หรือการทำทุกอย่างด้วย Proc ก็ได้ ถ้าอยากใช้ functor ใน business logic ก็เลือกใช้ได้เต็มที่ ความยืดหยุ่นแบบนี้ถูกใจมากจนรู้สึกว่าอยากลองใช้กับโปรเจ็กต์ข้างเคียงที่ทำร่วมกับเพื่อนร่วมงานฝีมือดีไม่กี่คน
framework นี้ดูเหมือนจะเป็นจุดกึ่งกลางที่ดีมากระหว่างความเรียบง่ายของ Sinatra กับความครบเครื่องของ Rails ปกติผมใช้ Sinatra กับแอปง่ายๆ และใช้ Rails เมื่อจำเป็น แต่สำหรับแอปที่ไม่ได้ซับซ้อน Rails กลับดูหนักเกินไป เลยค่อนข้างตื่นเต้นที่จะได้ลองของใหม่นี้
อีกตัวเลือกที่ควรดูคือ Roda ซึ่งยอดเยี่ยมมากสำหรับโปรเจ็กต์ขนาดเล็กและขยายต่อได้ดี ระบบ plugin ช่วยให้เพิ่มความสามารถได้ง่าย และ routing tree ก็จัดการได้ไม่ยาก
สำหรับผม hanami คือจุดกึ่งกลางที่ดีที่สุด แต่จากนี้ไปก็คงจะจับตาดูพัฒนาการของ bruts อย่างใกล้ชิด
ผมชอบหนังสือ Sustainable Rails ของ David มาก และเป็นหนังสือเกี่ยวกับ Rails ที่ผมแนะนำอยู่เสมอ แนวทางของ framework นี้น่าประทับใจมาก ถ้ามี framework ทางเลือกขนาดเล็กแบบนี้สักตัวที่นำ Sorbet มาใช้อย่างเต็มรูปแบบเพื่อใช้กับเรื่องอย่าง form validation ก็น่าจะน่าสนใจมาก แน่นอนว่ามันอาจสวนทางกับแนวทาง gradual typing แต่ในเชิงทดลองก็คงสนุกดี
David ไม่ได้เป็นแค่ผู้พัฒนาที่ มีพรสวรรค์ มากเท่านั้น แต่ยังพูดบรรยายได้ยอดเยี่ยมด้วย ขอแนะนำวิดีโอบรรยายที่เชื่อมโยงกับประเด็นในหนังสือ: https://www.youtube.com/watch?v=CRboMkFdZfg
Sorbet ก็ดี แต่ในแง่การบังคับโครงสร้างและการตรวจสอบข้อมูล (data validation) โดยส่วนตัวผมชอบ ecosystem ของ dry-rb มากกว่า
เข้าใจว่า framework นี้ใช้ไลเซนส์ที่ค่อนข้างแปลก แต่สงสัยว่านี่หมายความว่าไม่สามารถดู ซอร์สโค้ด ได้หรือเปล่า
ดูซอร์สบน github ได้: https://github.com/thirdtank/brut
เห็นด้วยว่าไลเซนส์มันให้ความรู้สึก แปลกๆ อยู่เหมือนกัน
โปรเจ็กต์นี้ทำให้นึกถึง framework เก่าอย่าง Camping ขึ้นมาเลย ต่างกันตรงที่ไม่มี dynamic parent class constructor
เว็บทางการของ Brut (https://brutrb.com/overview.html) ก็มี เนื้อหาที่น่าสนใจ อยู่เยอะเหมือนกัน
ผมลองล็อกอินในเว็บตัวอย่างแล้ว แต่หลังจาก ยืนยันตัวตนด้วย github ก็เจอ error ทันที
ตอนนี้ผมยังไม่ได้ใช้ Ruby แต่ สนใจโปรเจ็กต์นี้จนกด Star ไว้แล้ว โปรเจ็กต์นี้อาจกลายเป็นจุดเริ่มต้นที่ทำให้ผมได้ลองใช้ Ruby จริงๆ ก็ได้
โดยเฉพาะการเลือก Phlex นี่ถูกใจมาก ส่วนตัวสงสัยว่า framework นี้จะเข้ากันได้ดีกับ ไลบรารี Datastar js และการใช้งาน SSE (server-sent events) ของไลบรารีนั้นด้วยหรือไม่ ขอบคุณ