Fresh 2.3: صفر جاوااسکریپت، View Transitions و WebSocket بومی
خلاصهٔ کاملتر
Fresh 2.3 با بیش از ۱۰۰ کامیت از ۲۰ مشارکتکننده منتشر شد. این نسخه چند تغییر اساسی داره که هر کدوم بهتنهایی ارزش بررسی دارن.
وعده «صفر جاوااسکریپت» تا حالا یه کم دروغ بود! Fresh همیشه ادعا میکرد صفحهها JS نمیفرستن مگه اینکه لازم باشه، ولی در عمل یه اسکریپت کوچیک bootstrap همیشه سمت کلاینت ارسال میشد. حالا Fresh قبل از اینکه چیزی inject کنه، چک میکنه آیا صفحه واقعاً از islands یا partials استفاده میکنه یا نه. اگه نه، صفحه کاملاً بدون JS لود میشه.
پشتیبانی بومی از View Transitions هم یکی از قابلیتهای جذاب این نسخهست. وقتی کاربر بین صفحهها ناوبری میکنه، انتقالها داخل متد startViewTransition مرورگر پیچیده میشن و با CSS معمولی میشه انیمیشنشون رو کاملاً سفارشی کرد. مرورگرهایی که این قابلیت رو ندارن، به حالت عادی partial updates برمیگردن.
WebSocket حالا بهصورت توکار تو Fresh وجود داره. میشه با app.ws() یه endpoint وبسوکت ساخت یا داخل routeهای فایلمحور با ctx.upgrade() کار کرد. برای سناریوهای پیچیدهتر مثل چت روم، حالت bare هم هست که کنترل کامل socket رو بهت میده.
یکپارچهسازی با Vite هم بهشدت بهتر شده. تبدیل CJS به ESM و جایگزینی process.env حالا مستقیم توسط Vite انجام میشه و دو پاس Babel از روند build حذف شدن. پکیجهایی مثل Radix UI الان بدون هیچ تنظیم اضافهای کار میکنن. یه مشکل آزاردهنده هم رفع شده: فایلهای موقت ادیتور دیگه dev server رو crash نمیکنن.
دو میدلور امنیتی جدید به Fresh اضافه شدن. اول CSP nonce injection که برای هر ریکوئست یه nonce یکتا تولید میکنه و به اسکریپتهای inline اضافه میکنه. دوم IP filtering که میتونی باهاش دسترسی رو بر اساس رنجهای IP مجاز یا مسدود محدود کنی.
پشتیبانی از Temporal API هم اضافه شده که امکان سریالایز کردن اشیاء تاریخ/زمان پیچیده رو بین route ها و island ها فراهم میکنه. گزینه staticDir حالا یه آرایه قبول میکنه تا بشه چندین پوشه استاتیک داشت. loading indicator ها هم دیگه فقط روی کلیک لینکها کار نمیکنن، بلکه روی submit فرمها هم فعال هستن و حتی میشه به ازای هر دکمه یه indicator جداگانه داشت. اپلیکیشنهایی که پشت reverse proxy مثل nginx یا Caddy قرار دارن هم میتونن با trustProxy واقعیترین اطلاعات URL کلاینت رو بگیرن.
برای ساخت پروژه جدید هم حالا میشه از deno create استفاده کرد که با Deno 2.7 به بعد کار میکنه. تیم Fresh روی ارتقا به Vite 8 با Rolldown و همچنین قابلیت prerender در زمان build کار میکنه که بهت اجازه میده Fresh رو بهعنوان یه static site generator هم بهکار ببری.
نکات کلیدی:
- صفر JS واقعی: صفحههایی بدون island یا partials دیگه هیچ اسکریپتی لود نمیکنن
- View Transitions برای انتقالهای روان بین صفحهها با CSS سفارشی
- WebSocket بومی با سه حالت مختلف (managed، bare، و app-level)
- بهبود چشمگیر یکپارچهسازی Vite و حذف وابستگی به Babel
- دو میدلور امنیتی جدید: CSP nonce و IP filtering
- staticDir حالا آرایه قبول میکنه
- Loading indicator روی form submission هم کار میکنه
- پشتیبانی از trustProxy برای اپهای پشت load balancer




