GPUIX؛ اپ دسکتاپ با React روی GPU
خلاصهٔ کاملتر
GPUIX یه پکیج تازهست که React رو به GPUI وصل میکنه، همون فریمورک رابط کاربری GPU-محور که تیم Zed برای ادیتورش ساخته. ایدهٔ اصلی توی مستندات پروژه ساده گفته شده: با React و TypeScript اپ دسکتاپ بنویس، ولی رندر رو بده دست Metal یا DirectX یا Vulkan. نه Electron توی کاره، نه WebView. پکیج @gpuix/react هم رندرر بومی پلتفرم خودت رو میاره، پس برای نصب به Rust toolchain احتیاجی نیست.
زیر کاپوت یه پروتکل mutation-محور کار میکنه. reconciler ریاکت تغییرات هر commit رو جمع میکنه و یکجا به سمت Rust میفرسته، اونجا یه درخت نگهدارنده (RetainedTree) بهروز میشه و GPUI هر فریم از روش المانهای واقعی رو میسازه و با Taffy چیدمان flexbox میگیره. فقط المانهای تغییرکرده از مرز FFI رد میشن. روی دسکتاپ این پل napi-rs هست و توی مرورگر همون کد Rust از طریق wasm-bindgen بالا میاد.
المانهای میزبان بومی هستن، نه شبیهسازی HTML: ، ، ، ، ، و . مستندات یه تلهٔ مهم رو هم علامت زده، اینکه GPUI رنگ رو از والد به ارث نمیبره، پس هر بدون color سیاه رندر میشه و روی پسزمینهٔ تیره گم میشه. برای تایپچک شدن این تگها هم باید jsxImportSource رو توی TypeScript تنظیم کنی.
برای لیستهای بلند هست که ردیفها رو فقط نزدیک viewport میسازه و ارتفاع هر ردیف رو موقع ورود اندازه میگیره، پس ردیفها لازم نیست همارتفاع باشن. انیمیشن هم با motion.div انجام میشه: مقدار هدف یک بار از ریاکت میره پایین و بقیهٔ فریمها رو خود Rust حساب میکنه، بدون رندر دوبارهٔ ریاکت. فعلاً فقط چند مقدار عددی مثل عرض، ارتفاع، شفافیت و گردی گوشه پشتیبانی میشن.
محدودیتهاش هم صریح گفته شده. اسکرول تودرتو پشتیبانی نمیشه چون GPUI همون رویداد چرخ ماوس رو به هر دو ناحیه میده و لیست داخلی حرکت رو میدزده. spring و keyframe و انیمیشن خروج هنوز نیومدن. hot reload با bun --hot پنجره و دستگاه گرافیکی رو نگه میداره ولی useState و فوکوس ریست میشن، چون این یه remount هست نه React Fast Refresh. روی لینوکس هم گزینهٔ focus: false نادیده گرفته میشه.
نکات کلیدی:
- GPUIX رابط بین React و GPUI هست، همون فریمورک UI ادیتور Zed
- رندر مستقیم با Metal، DirectX و Vulkan؛ بدون Electron و بدون WebView
- پروتکل mutation-محور: napi-rs روی دسکتاپ، wasm-bindgen توی مرورگر، چیدمان با Taffy
- المانهای بومی ، ، ، و انیمیشن با motion.div
- اسکرول تودرتو پشتیبانی نمیشه و hot reload با bun --hot حالت useState رو نگه نمیداره




