گیا: فریمورکی که خودش رو کامپایل میکنه و غیب میشه
خلاصهٔ کاملتر
گیا (Gea) یه فریمورک واکنشی جاوااسکریپت برای ساخت رابط کاربریه که رویکردش «کامپایلر-محور»ه؛ یعنی بهجای virtual DOM، کد JSX تو رو موقع بیلد به قالبهای رشتهای HTML تبدیل میکنه و فقط همون گرههایی از DOM رو که واقعاً به دادهی تغییرکرده وابستهان بهروز میکنه. به گفتهی سازنده، اینجوری نه diffing داری نه overhead ای بابت reconciliation.
نکتهی اصلیای که پروژه روش مانور میده حجم خروجیه. تو یه بیلد پروداکشن hello-world با Vite، گیا فقط ۱۲۱ بایت جاوااسکریپت brotli میفرسته، در حالی که Solid حدود ۳.۶ کیلوبایت، Svelte حدود ۸.۵، Vue حدود ۲۰.۷ و React حدود ۵۰.۸ کیلوبایته. یعنی تو حالت ساده، خود فریمورک عملاً از باندل غیب میشه.
البته hello-world فقط ثابت میکنه کامپایلر میتونه ناپدید بشه. سازنده میگه برای اپ واقعی یه todo تعاملی با state واکنشی و فیلتر و مدیریت ورودی رو مقایسه کرده: گیا حدود ۴.۹ کیلوبایت brotli میشه، Solid ۵.۷، Svelte ۱۳.۷ و React ۵۱.۵. پس runtime هم موقع کار کردن سبک میمونه.
فلسفهی گیا اینه که نباید مدل برنامهنویسی جدیدی یاد بگیری. خبری از signal، hook، dependency array یا دستور مخصوص فریمورک نیست. store ها کلاسان، کامپوننتها کلاسیان با یه متد template() که JSX برمیگردونه، و مقدارهای محاسبهشده هم getter ان. کافیه this.count++ رو بنویسی و DOM خودش آپدیت میشه:
class CounterStore extends Store {
count = 0
increment() { this.count++ }
decrement() { this.count-- }
}به گفتهی سازنده تنها «جادو» زیر کاپوته: پلاگین Vite کد معمولی تو رو موقع کامپایل تحلیل میکنه و واکنشپذیری رو خودش سیمکشی میکنه؛ نه setter صدا میزنی، نه مقدار رو تو signal میپیچی. props هم مثل جاوااسکریپت رفتار میکنه: آبجکت و آرایه همون proxy واکنشی والدن و دوطرفهان، ولی مقدارهای ساده کپی میشن.
گیا بستههای جانبی هم داره: @geajs/ui برای کامپوننتهای دسترسپذیر روی Zag.js، @geajs/mobile برای رابط موبایل و @geajs/ssr برای رندر سمت سرور. سازنده ادعا میکنه تو js-framework-benchmark سریعترین فریمورک کامپایلشدهست با میانگین وزنی ۱.۰۲ که خیلی نزدیک به جاوااسکریپت خام دستنویسه.
نکات کلیدی:
- گیا یه فریمورک واکنشی کامپایلر-محوره، بدون virtual DOM و بدون diffing
- بیلد hello-world فقط ۱۲۱ بایت brotli و یه todo تعاملی حدود ۴.۹ کیلوبایته
- بهجای signal و hook، با کلاس، تابع، getter و this.count++ کار میکنی
- پلاگین Vite موقع بیلد واکنشپذیری رو خودکار سیمکشی میکنه
- بستههای ui، mobile، ssr و روتر tree-shakable هم داره




