4 คะแนน โดย GN⁺ 2024-05-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ชุดเครื่องมือ 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 ความคิดเห็น

 
GN⁺ 2024-05-26

ความคิดเห็นจาก Hacker News

สรุปรวมความคิดเห็นจาก Hacker News

  • น่าจะดีถ้าระบุแพลตฟอร์มที่รองรับไว้ใน README และขอเสนอให้เขียนในรูปแบบคล้ายเอกสารของ Flutter
  • อยากใช้ Go เพื่อสร้างเครื่องมือพัฒนาภายใน ตอนนี้กำลังใช้ Wails อยู่และพอใจมาก โปรเจกต์นี้ก็ดูน่าสนใจและน่าลองเข้าไปดู
  • คิดว่า Go สามารถมอบประสบการณ์ที่ดีสำหรับการพัฒนา UI แบบข้ามแพลตฟอร์มได้
    • การจัดการความซับซ้อนของการบิลด์เป็นความยากอย่างหนึ่งของการพัฒนาแบบข้ามแพลตฟอร์ม และ Go แทบจะขจัดปัญหานี้ออกไปได้
    • สงสัยว่าจะจัดการเลย์เอาต์แบบข้ามแพลตฟอร์มอย่างไรเมื่อขนาดของ native controls แตกต่างกันในแต่ละแพลตฟอร์ม
  • สงสัยว่าข้อดีของแนวทาง virtual control tree คืออะไร
    • อยากรู้ว่ามีข้อดีอะไรเมื่อเทียบกับการอัปเดตคอนโทรลที่แสดงต่อผู้ใช้โดยตรง
  • ตามหาสิ่งแบบนี้มาหลายปีแล้ว
    • แต่ต้องการรองรับ Windows เลยเปลี่ยนไปใช้ C++ และใช้ wxWidgets
  • ชื่นชมความพยายาม แต่แพลตฟอร์มข้ามระบบที่ไม่รองรับ Windows ก็น่าเสียดาย
  • ถ้ารู้จักโปรเจกต์นี้เมื่อ 3 สัปดาห์ก่อนก็คงดี
    • คิดว่า React หรือเฟรมเวิร์กแบบ React ที่พอร์ตมาเป็น Go จะมอบประสบการณ์พัฒนาที่ยอดเยี่ยมได้
  • Fltk รองรับ Windows
    • เลยสงสัยว่าเป็นเพราะใช้โซลูชันอื่นอยู่หรือไม่ จึงยังไม่รองรับ Windows
  • สงสัยว่าโค้ดนี้หมายความว่าต้องตั้งค่า GOMAXPROCS เป็นอย่างน้อย 2 หรือไม่
  • สงสัยว่าการบิลด์ข้ามแพลตฟอร์มทำงานอย่างไร
    • น่าจะดีถ้ามีคำสั่งที่สร้าง MacOS .app และ Windows exe ได้โดยไม่ต้องไปแก้เรื่องการจัดการแพ็กเกจของแต่ละแพลตฟอร์ม คอนเทนเนอร์ และปัญหาการเซ็นกำกับ