Shirei: رابط گرافیکی کراسپلتفرم با خود Go
خلاصهٔ کاملتر
Shirei یه فریمورک رابط گرافیکی کراسپلتفرم برای Goه با یه ادعای ساده: رابط کاربری رو با خود Go مینویسی، نه با HTML و جاوااسکریپت. سازندهاش میگه واقعاً کراسپلتفرمه — یه کدبیس، خروجیهای یکشکل روی مکاواس، ویندوز و لینوکس — و اتفاقاً سادهترین راه برای ساختن یه برنامهٔ گرافیکی خودبسندهٔ لینوکسیه که به هیچ وابستگیای احتیاج نداره. اسمش هم از تلفظ ژاپنی «Simple Layout» درآمده.
انگیزهاش از تجربه میاد: به گفتهٔ نویسنده، API از نوع immediate mode تنها راه عاقلانه برای برنامهنویسی GUIه، ولی کتابخانهای که همینجوری کار کنه پیدا نمیشه — یکی ازت میخواد بکاند خودت رو پیاده کنی، یکی داستان کراسپلتفرم درستوحسابی نداره، یکی هم متن غیرلاتین رو درست پشتیبانی نمیکنه.
نکتهٔ ظریفی که روش تأکید میکنه اینه که immediate mode یعنی چی. میگه مسئله این نیست که UI هر فریم از نو رندر بشه؛ مسئله اینه که تو هر فریم صرفاً بر اساس داده توصیف میکنی UI باید چه شکلی باشه. به نظر او دلیل بردن React هم همین بوده: لازم نیست خودت ویجتها رو نگه داری یا وضعیتشون رو دنبال کنی، فقط میگی «تو این لحظه اینجا یه دکمه میخوام، برچسبش این باشه، و وقتی کلیک شد این کار انجام بشه».
سؤالهایی مثل «این دکمه قبلاً وجود داشت؟» یا «وقتی دیگه لازمش نداری چی به سرش میاد؟» اصلاً مطرح نمیشن — و به گفتهٔ نویسنده همین بهترین بخش ماجراست. اضافه میکنه APIای که فقط اجازه بده چیزها رو «بکشی» ولی خودت مسئول نگهداشتن وضعیت همون چیزها باشی، به درد نمیخوره.
مثال شروع سریعش دقیقاً همین سبک رو نشون میده: یه شمارنده که مقدارش یه متغیر معمولی Goه و دکمه بهشکل یه شرط ساده نوشته میشه — اگه کلیک شده باشه، بدنهٔ if اجرا میشه.
var count int
func RootView() {
Container(Attrs(Row, CrossMid, Pad(20), Gap(10)), func() {
Label(fmt.Sprintf("Counter: %d", count))
if Button(SymIPlus, "Increment") {
count++
}
})
}از نظر امکانات، خروجی یه برنامهٔ اجرایی واقعیه (نه صفحهٔ وب) با حجم باینری معمولاً حدود ۱۰ مگابایت. فریمورک کامله و بدون boilerplate میشه شروع کرد، پشتیبانی کاملی از متن بینالمللی داره — شکلدهی پیچیده، چیدمان دوسویه، دسترسی به فونتهای سیستم و IME برای زبانهای شرق آسیا — و چیدمان و استایلش انعطافپذیره، یعنی مثل وب محدود به یه مجموعهٔ استاندارد از ویجتها نیستی و میتونی مال خودت رو بسازی.
یه ادعای جالب دیگه هم داره: APIاش هم برای آدمها هم برای ایجنتهای هوش مصنوعی راحت یاد گرفته میشه، و نویسنده پیشنهاد میکنه اگه ایدهٔ برنامهٔ کوچیکی داری که وقت نوشتنش رو نداشتی، از مدلهای جدید بخوای با Shirei بسازنش. چند برنامهٔ نمونه هم توی مخزن هست که پیشنهاد میکنه اگه فقط یکی رو نگاه میکنی، سراغ haystack برو. مستنداتی برای آموزش، صدا، هویت کانتینرها و کشیدنورهاکردن هم موجوده.
نکات کلیدی:
- UI رو با خود Go توصیف میکنی؛ نه HTML، نه جاوااسکریپت، نه صفحهٔ وب پنهانشده پشت پنجره
- API واقعاً immediate modeه: نگهداشتن ویجتها و همگامکردن وضعیتشون با داده به عهدهٔ تو نیست
- خروجی یه باینری بومی حدود ۱۰ مگابایت با ظاهر یکشکل روی مک، ویندوز و لینوکس
- پشتیبانی جدی از متن بینالمللی: شکلدهی پیچیده، چیدمان دوسویه، فونت سیستم و IME
- چیدمان انعطافپذیره و میتونی ویجتهای خودت رو بسازی، نه اینکه به یه ست استاندارد محدود باشی