- ชุดเครื่องมือ Reactive GUI ข้ามแพลตฟอร์มที่เรียบง่าย
- ความเรียบง่าย: เพิ่มเข้าโปรเจ็กต์ได้อย่างง่ายดายและเริ่มสร้าง UI ได้ทันที ไม่ต้องใช้เครื่องมือเพิ่มเติมหรือขั้นตอนสร้างโค้ด เพียงเขียนโค้ด Go ก็สามารถสร้างแอปพลิเคชัน Native GUI เป็นไบนารีแบบ self-contained ได้
- ข้ามแพลตฟอร์ม: ใช้วิดเจ็ตเนทีฟเมื่อเป็นไปได้ และระหว่างคอมไพล์จะเลือกแบ็กเอนด์ที่เหมาะสมที่สุดกับแพลตฟอร์มที่กำลังใช้งานโดยอัตโนมัติ ปัจจุบันมีแบ็กเอนด์ให้ใช้งาน 2 แบบคือแบบที่อิง FLTK และแบบที่อิง Cocoa
- ตอบสนองอัตโนมัติ: อัปเดต UI โดยอัตโนมัติเมื่อสถานะของแอปพลิเคชันเปลี่ยนไป มีฟังก์ชันเรนเดอร์ที่ไม่มีผลข้างเคียง และใช้ฮุก
UseState เพื่อจัดการสถานะของแอปพลิเคชัน
- รองรับวิดเจ็ตหลากหลาย: Spot มี UI control พื้นฐานให้ใช้งานหลากหลาย เช่น ปุ่ม เลเบล ช่องกรอกข้อความ สไลเดอร์ ดรอปดาวน์ เป็นต้น
คำถามที่พบบ่อย (FAQs)
"ตอบสนองอัตโนมัติ" หมายถึงอะไร?
- ใน Spot คำว่า ตอบสนองอัตโนมัติ หมายถึง UI จะอัปเดตเองโดยอัตโนมัติเมื่อสถานะของแอปพลิเคชันเปลี่ยนแปลง โดยทำผ่านการสร้าง component tree แบบ immutable ขึ้นมาใหม่เมื่อสถานะเปลี่ยน แล้วเปรียบเทียบกับสถานะก่อนหน้าเพื่อกำหนดว่าควรอัปเดต UI control ใดบ้าง
"วิดเจ็ตเนทีฟ" ที่ Spot ใช้คืออะไร?
- ปัจจุบัน Spot ใช้แบ็กเอนด์ Cocoa บน macOS และใช้แบ็กเอนด์ที่อิง FLTK บนทุกแพลตฟอร์มอื่น โดยสามารถเลือกใช้ FLTK บน Mac ได้เช่นกัน และมีแผนจะรองรับ Windows ให้ดียิ่งขึ้นในอนาคต
สามารถสร้างฮุกของตัวเองได้หรือไม่?
- ได้ เช่นเดียวกับ React คุณสามารถสร้างฮุกของตัวเองได้ โดยสร้างฟังก์ชันที่รับ
*spot.RenderContext เป็นอาร์กิวเมนต์ตัวแรก และใช้มันเพื่อ "hook" เข้ากับ lifecycle ของ Spot
จะเขียนคอมโพเนนต์แบบกำหนดเองได้อย่างไร?
- ใน Spot มีหลายวิธีในการแยก UI ออกเป็นคอมโพเนนต์ วิธีหลักคือการสร้าง struct ที่ implements อินเทอร์เฟซ
spot.Component ซึ่งอินเทอร์เฟซนี้มีเมธอดเดียวคือ Render(ctx *spot.RenderContext) spot.Component
สามารถใช้ไลบรารีวิดเจ็ตอื่นนอกเหนือจากที่มีให้ได้หรือไม่?
- ได้ โดยสร้าง struct ที่ implements อินเทอร์เฟซ
spot.Component และจัดการวิดเจ็ตเนทีฟเอง
สามารถใช้แบ็กเอนด์อื่นนอกจาก Cocoa หรือ FLTK ได้หรือไม่?
- ขณะนี้รองรับเพียงสองแบ็กเอนด์นี้เท่านั้น หากต้องการเพิ่มแบ็กเอนด์อื่น คุณสามารถส่ง PR ได้
spot/ui กับ spot ต่างกันอย่างไร?
spot คือแพ็กเกจหลักที่ให้โมเดลแบบตอบสนองอัตโนมัติและความสามารถในการเรนเดอร์ โดยไม่ผูกกับแบ็กเอนด์ และสามารถใช้ร่วมกับชุดคอนโทรลใดก็ได้ที่ implements อินเทอร์เฟซ spot.Control
spot/ui ให้ชุด GUI control ข้ามแพลตฟอร์มแบบสำเร็จรูปที่ใช้ร่วมกับ spot ได้
"คอมโพเนนต์" กับ "คอนโทรล" ต่างกันอย่างไร?
- ใน Spot คอมโพเนนต์ คือหน่วยเชิงตรรกะของแอปพลิเคชันที่มี business logic และสถานะอยู่ภายใน คอมโพเนนต์ทั้งหมดประกอบขึ้นจากคอมโพเนนต์อื่น และท้ายที่สุดจะถูกเรนเดอร์เป็น "คอนโทรล" หนึ่งตัวหรือมากกว่า
- คอนโทรล คือคอมโพเนนต์ชนิดพิเศษที่ถูก mount ลงใน UI tree และแสดงองค์ประกอบภาพบนหน้าจอ
ใน Spot คำว่า "make", "render", "build", "mount", "update" หมายถึงอะไร?
- Make: กระบวนการสร้างอินสแตนซ์คอมโพเนนต์ใหม่ ทำได้โดยอ้างอิงอินสแตนซ์ของ struct ที่ implements อินเทอร์เฟซ
spot.Component หรือเรียก spot.Make ด้วยฟังก์ชันเรนเดอร์
- Render: กระบวนการนำสถานะของคอมโพเนนต์ไปใช้กับ building block เพื่อคืนค่าเป็นอินสแตนซ์คอมโพเนนต์อื่น ทำได้โดยเรียกเมธอด
Render บนอินสแตนซ์คอมโพเนนต์
- Build: กระบวนการสร้าง UI tree ใหม่จากอินสแตนซ์คอมโพเนนต์ โดยเรนเดอร์คอมโพเนนต์แบบเรียกซ้ำเพื่อสร้าง control tree
- Mount: กระบวนการสร้าง UI control จริงจาก control tree (เสมือน) ทำได้โดยเรียก
Mount บนโหนดของ tree หรือเรียก spot.Mount ด้วยอินสแตนซ์คอมโพเนนต์หรือฟังก์ชันเรนเดอร์
- Update: กระบวนการอัปเดต control tree ที่ถูก mount แล้ว ทำได้โดยเรียก
Update บนโหนดของ tree
ความสามารถที่ Spot ยังไม่รองรับในตอนนี้
- เลย์เอาต์อัตโนมัติ
- หลายหน้าต่าง
- กล่องโต้ตอบแบบโมดัล
- หน้าต่างที่ปรับขนาดได้
- แถบเมนู
- วิดเจ็ตแบบกำหนดเอง
- การเข้าถึงวิดเจ็ตเนทีฟ
- ลากและวาง
- การทำให้รองรับหลายภาษา
รายการ UI control ที่รองรับ
- Button: ปุ่มแบบเรียบง่ายสำหรับเริ่มการทำงาน (Fl_Button, NSButton)
- Checkbox: คอนโทรลสำหรับเลือกหนึ่งในสองตัวเลือกที่แยกจากกัน (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
- ComboBox: เมนูดรอปดาวน์ที่สามารถป้อนข้อความได้ (ComboBox, NSComboBox)
- Dial: คอนโทรลสถานะแบบวงกลม (Fl_Dial, NSProgressIndicator (with
NSCircular style))
- Dropdown: เมนูดรอปดาวน์สำหรับเลือกหนึ่งตัวเลือกจากหลายตัวเลือก (Fl_Choice, NSComboBox)
- Image: คอนโทรลรูปภาพ (Image, NSImageView)
- Label: เลเบลข้อความธรรมดาที่ไม่สามารถแก้ไขได้ (Fl_Box, NSTextField)
- ListBox: คอนโทรลแบบเลื่อนได้ที่ให้เลือกหนึ่งหรือหลายรายการจากรายการที่กำหนด (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
- ProgressBar: คอนโทรลแถบความคืบหน้าสำหรับแสดงความคืบหน้าของงานที่ใช้เวลานาน (Fl_Progress, NSProgressIndicator)
- Slider: คอนโทรลป้อนข้อมูลแบบสไลเดอร์แนวนอน (Fl_Slider, NSSlider)
- Spinner: คอนโทรลป้อนตัวเลขพร้อมปุ่มขึ้น/ลง (Fl_Spinner, NSTextField+NSStepper)
- TextField: คอนโทรลป้อนข้อความแบบบรรทัดเดียว (Fl_Input, NSTextField)
- TextView/TextEditor: กล่องข้อความอเนกประสงค์สำหรับดู/แก้ไขเนื้อหาข้อความหลายบรรทัด (Text, NSTextView)
- Window: คอนโทรลที่แสดงหน้าต่าง (ระดับบนสุด) บนหน้าจอ (Fl_Window, NSWindow)
ความเห็นของ GN⁺
- Spot ช่วยให้พัฒนาแอปพลิเคชัน GUI ข้ามแพลตฟอร์มด้วยภาษา Go ได้ง่ายขึ้น โดยเฉพาะการนำโมเดลแบบตอบสนองอัตโนมัติมาใช้ ทำให้นักพัฒนาสามารถโฟกัสที่ลอจิกของแอปพลิเคชันได้โดยไม่ต้องกังวลเรื่องการอัปเดต UI
- ขณะนี้ยังมีฟีเจอร์จำนวนมากที่ยังไม่รองรับ จึงอาจมีข้อจำกัดเมื่อต้องพัฒนาแอปพลิเคชันที่ซับซ้อน โดยเฉพาะหากต้องการความสามารถอย่างเลย์เอาต์อัตโนมัติหรือหลายหน้าต่าง ก็ควรพิจารณาชุดเครื่องมืออื่น
- ความเรียบง่ายและการรองรับข้ามแพลตฟอร์มของ Spot อาจมีประโยชน์มากสำหรับโปรเจ็กต์ขนาดเล็กหรือการพัฒนาต้นแบบ แต่สำหรับแอปพลิเคชันขนาดใหญ่ก็อาจมีข้อจำกัดด้านความสามารถ
- หากชุมชนและเอกสารของ Spot พัฒนาไปมากขึ้น นักพัฒนาจำนวนมากก็น่าจะเข้าถึงและใช้งานได้ง่ายขึ้น โดยเฉพาะถ้ามีตัวอย่างเกี่ยวกับการสร้าง custom hook และคอมโพเนนต์เพิ่มขึ้น
- ความสามารถในการขยายแบ็กเอนด์ของ Spot เป็นเรื่องที่น่าสนใจ โดยเฉพาะหากมีการเพิ่มการรองรับ Windows ที่ดีกว่านี้ ก็อาจทำให้นักพัฒนาจำนวนมากขึ้นนำไปใช้ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สรุปรวมความคิดเห็นจาก Hacker News