- Bộ công cụ GUI reactive đa nền tảng, đơn giản
- Đơn giản: Có thể thêm dễ dàng vào dự án và bắt tay xây dựng UI ngay. Không cần công cụ bổ sung hay bước sinh mã. Chỉ cần viết mã Go là có thể tạo ứng dụng GUI native dưới dạng binary tự chứa
- Đa nền tảng: Sử dụng widget native khi có thể, và khi biên dịch sẽ tự động chọn backend phù hợp nhất với nền tảng đang chạy. Hiện cung cấp hai triển khai backend: dựa trên FLTK và dựa trên Cocoa
- Phản ứng: Tự động cập nhật UI khi trạng thái ứng dụng thay đổi. Cung cấp hàm render không có tác dụng phụ và dùng hook
UseState để quản lý trạng thái ứng dụng
- Hỗ trợ widget phong phú: Spot cung cấp sẵn nhiều control UI như nút bấm, nhãn, nhập văn bản, thanh trượt, danh sách thả xuống, v.v.
Câu hỏi thường gặp (FAQs)
"Phản ứng" nghĩa là gì?
- Trong Spot, phản ứng có nghĩa là UI sẽ tự động được cập nhật khi trạng thái ứng dụng thay đổi. Điều này được thực hiện bằng cách xây dựng lại cây component bất biến khi trạng thái đổi, rồi so sánh với trạng thái trước đó để xác định control UI nào cần được cập nhật.
"Widget native" mà Spot sử dụng là gì?
- Hiện tại Spot dùng backend Cocoa trên macOS, và backend dựa trên FLTK trên mọi nền tảng khác. Tùy chọn có thể dùng FLTK cả trên Mac. Trong tương lai có kế hoạch hỗ trợ tốt hơn cho Windows.
Có thể tự triển khai hook của riêng mình không?
- Có, giống như React, bạn có thể tự triển khai hook của riêng mình. Chỉ cần tạo một hàm nhận
*spot.RenderContext làm đối số đầu tiên, và thông qua đó có thể "hook" vào vòng đời của Spot.
Làm thế nào để viết component tùy chỉnh?
- Trong Spot có một vài cách để tách UI thành các component. Cách chính là tạo một struct triển khai interface
spot.Component. Interface này chỉ có một phương thức là Render(ctx *spot.RenderContext) spot.Component.
Có thể dùng thư viện widget khác với thư viện được cung cấp không?
- Có, được. Chỉ cần tạo một struct triển khai interface
spot.Component và quản lý widget native.
Có thể dùng backend khác ngoài Cocoa hoặc FLTK không?
- Hiện tại chỉ hỗ trợ hai backend này. Nếu muốn thêm backend khác, bạn có thể gửi PR.
Khác biệt giữa spot/ui và spot là gì?
spot là gói lõi cung cấp mô hình phản ứng và khả năng render. Nó không phụ thuộc backend và có thể dùng với bất kỳ bộ control nào triển khai interface spot.Control.
spot/ui cung cấp một bộ control GUI đa nền tảng dựng sẵn có thể dùng cùng với spot.
Khác biệt giữa "component" và "control" là gì?
- Trong Spot, component là đơn vị logic của ứng dụng, bao gồm business logic và trạng thái. Mọi component đều được cấu thành từ các component khác và cuối cùng sẽ được render thành một hoặc nhiều "control".
- Control là một loại component đặc biệt được mount vào cây UI và biểu diễn phần tử trực quan trên màn hình.
Trong Spot, các thuật ngữ "make", "render", "build", "mount", "update" có nghĩa là gì?
- Make: Quá trình tạo một instance component mới. Thực hiện bằng cách tham chiếu đến instance của struct triển khai interface
spot.Component, hoặc gọi spot.Make bằng một hàm render.
- Render: Quá trình áp dụng trạng thái của component vào các khối xây dựng để trả về một instance component khác. Thực hiện bằng cách gọi phương thức
Render trên instance component.
- Build: Quá trình tạo một cây UI mới từ instance component. Thực hiện bằng cách render đệ quy các component để tạo cây control.
- Mount: Quá trình tạo các control UI thực tế từ cây control (ảo). Thực hiện bằng cách gọi
Mount trên nút cây, hoặc gọi spot.Mount bằng instance component hay hàm render.
- Update: Quá trình cập nhật cây control đã được mount. Thực hiện bằng cách gọi
Update trên nút cây.
Những tính năng Spot hiện chưa hỗ trợ
- Bố cục tự động
- Nhiều cửa sổ
- Hộp thoại modal
- Cửa sổ có thể thay đổi kích thước
- Thanh menu
- Widget tùy chỉnh
- Truy cập widget native
- Kéo và thả
- Quốc tế hóa
Danh sách control UI được hỗ trợ
- Button: Nút bấm đơn giản để khởi tạo hành động (Fl_Button, NSButton)
- Checkbox: Control chọn một trong hai tùy chọn loại trừ lẫn nhau (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
- ComboBox: Menu thả xuống có thể nhập văn bản (ComboBox, NSComboBox)
- Dial: Control trạng thái dạng tròn (Fl_Dial, NSProgressIndicator (with
NSCircular style))
- Dropdown: Menu thả xuống để chọn một trong nhiều tùy chọn (Fl_Choice, NSComboBox)
- Image: Control hình ảnh (Image, NSImageView)
- Label: Nhãn văn bản đơn giản, không thể chỉnh sửa (Fl_Box, NSTextField)
- ListBox: Control có thể cuộn, cho phép chọn một hoặc nhiều mục từ danh sách cho trước (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
- ProgressBar: Control thanh tiến trình để trực quan hóa tiến độ của tác vụ chạy lâu (Fl_Progress, NSProgressIndicator)
- Slider: Control nhập liệu thanh trượt ngang (Fl_Slider, NSSlider)
- Spinner: Control nhập số có nút tăng/giảm (Fl_Spinner, NSTextField+NSStepper)
- TextField: Control nhập văn bản một dòng (Fl_Input, NSTextField)
- TextView/TextEditor: Hộp văn bản đa dụng để xem/chỉnh sửa nội dung văn bản nhiều dòng (Text, NSTextView)
- Window: Control biểu diễn cửa sổ (cấp cao nhất) trên màn hình (Fl_Window, NSWindow)
Ý kiến của GN⁺
- Spot giúp việc phát triển ứng dụng GUI đa nền tảng bằng ngôn ngữ Go trở nên dễ dàng hơn. Đặc biệt, việc áp dụng mô hình phản ứng giúp nhà phát triển có thể tập trung vào logic ứng dụng mà không phải bận tâm đến việc cập nhật UI.
- Hiện còn khá nhiều tính năng chưa được hỗ trợ, nên khi phát triển ứng dụng phức tạp có thể sẽ gặp hạn chế. Đặc biệt nếu cần các tính năng như bố cục tự động hay nhiều cửa sổ thì nên cân nhắc công cụ khác.
- Sự đơn giản và hỗ trợ đa nền tảng của Spot có thể rất hữu ích cho các dự án nhỏ hoặc phát triển nguyên mẫu. Tuy vậy, với ứng dụng quy mô lớn thì có thể sẽ có giới hạn về tính năng.
- Nếu cộng đồng và tài liệu của Spot tiếp tục phát triển, sẽ có thêm nhiều nhà phát triển dễ dàng tiếp cận và sử dụng hơn. Đặc biệt sẽ rất tốt nếu có thêm ví dụ về cách viết hook và component tùy chỉnh.
- Khả năng mở rộng backend của Spot là điểm khá thú vị. Đặc biệt, nếu có thêm hỗ trợ tốt hơn cho Windows thì sẽ có nhiều nhà phát triển sử dụng hơn.
1 bình luận
Ý kiến trên Hacker News
Tóm tắt các bình luận trên Hacker News
.appvà Windowsexemà không cần tự giải quyết vấn đề quản lý gói theo từng nền tảng, container và ký ứng dụng.