Octane: مدل ذهنی ریاکت رو نگه دار، قوانین کمتر
خلاصهٔ کاملتر
Octane یه فریمورک UI هست که عمداً روی مدل ذهنی ریاکت سوار شده: همون کامپوننتهای تابعی، همون هوکها. تو مستندات رسمیش اومده که فقط یه مجموعهٔ کوچیک از قانونها عوض شده، اونم دقیقاً جاهایی که کامپایلر یا خود مرورگر میتونن بخش بیشتری از کار رو به عهده بگیرن.
بزرگترین تفاوت به هوکها برمیگرده. Octane هر هوک رو با محل تعریفش تو سورس میشناسه، نه با ترتیب اجراش؛ برای همین یه هوک میتونه پشت یه شرط یا بعد از یه return زودهنگام بشینه بدون اینکه استیت هوک دیگهای جابهجا شه. تنها استثنا هوک اسلاتمحور داخل حلقهٔ معمولی جاوااسکریپته که چون همهٔ تکرارها یه محل مشترک دارن، کامپایلر ارور میده. آرایهٔ وابستگی هم دیگه اجباری نیست؛ اگه ننویسیش، کامپایلر از روی چیزهایی که کالبک کپچر کرده خودش درش میاره:
useEffect(() => {
syncRoom(room.id);
}); // inferred from syncRoom and room.idسمت ایونتها، هندلرها همون Event واقعی مرورگر رو میگیرن، نه رپر مصنوعی. یعنی برای هر تغییر متن باید از onInput استفاده کنی، چون change بومی معمولاً موقع blur فایر میشه، و دیگه پلیفیلی به اسم onChange مصنوعی وجود نداره. با این حال value و checked کنترلشده مثل ریاکت رفتار میکنن، پس مهاجرت اکثر فیلدهای متنی در حد عوض کردن یه کلمهست:
// React
<input value={text} onChange={(event) => setText(event.currentTarget.value)} />
// Octane
<input value={text} onInput={(event) => setText(event.currentTarget.value)} />ترنزیشنها هستن ولی بدون time slicing: آپدیتها تو یه microtask دسته میشن و هر رندر تا آخر اجرا میشه — خبری از lane، نقطهٔ yield و هیدریشن انتخابی نیست. در عوض کامپایلر آبشارهای use() رو خودش میشکنه و درخواستهایی که بتونه مستقل بودنشون رو ثابت کنه با هم شروع میشن. پرامیسی هم که حین رندر ساخته میشه نیازی به cache() نداره، چون کامپایلر هر ساختی که به یه use() میرسه رو بر اساس ورودی واقعیش ممویز میکنه.
یه سری API هم عمداً حذف شدن: کامپوننت کلاسی، Server Components و RSC، خود cache()، فراخوانی دوگانهٔ StrictMode، Profiler، SuspenseList و forwardRef/createRef — چون ref تو Octane یه prop معمولیه. خطاها هم بهجای error boundary کلاسی با بلوک @try/@catch یا کامپوننت ErrorBoundary جمع میشن. تو مستندات دو تا شکاف باز هم صادقانه گفته شده: تحلیل استقلال درخواستها از مرز ماژول رد نمیشه، و آپدیت داخل ترنزیشن محتوای تازهرسیده رو پلهپله نشون میده.
نکات کلیدی:
- هوک با محل تعریفش شناخته میشه، نه ترتیب اجرا؛ پس شرط و return زودهنگام مشکلی نداره
- آرایهٔ وابستگی اختیاریه و کامپایلر از روی کپچرها استنتاجش میکنه
- useState و useReducer آیتم سوم اختیاری دارن که آخرین استیت زمانبندیشده رو میخونه
- ایونتها بومیان: onInput جای onChange برای فیلدهای متنی
- class/className به سبک clsx ترکیب میشن و آرایه رو با فاصله میچسبونن، نه ویرگول
- کامپوننت کلاسی، RSC، cache() و forwardRef اصلاً وجود ندارن




