معماری فرانتاند با Next.js و حاکمیت لایه کلاینت
معماری فرانتاند مبتنی بر Next.js App Router، React Server Components، قراردادهای دیزاینتوکن، کامپوننتهای هدلس، layoutهای منطقی و چرخههای رندر تایپشده
معماری مسیر به عنوان قرارداد وضعیت فرانتاند
مسیریابی با App Router، پوستههای پایدار و وضعیت قابل بازسازی در URL
فرانتاند بالغ، routing را فقط یک ساختار پوشهای یا مجموعهای از لینکها نمیبیند. معماری مسیر مشخص میکند layout محصول چطور زنده میماند، ناوبری چطور حس فوری پیدا میکند، بخشهای dynamic کند چطور بازخورد loading میدهند و کدام بخشهای رابط باید در URL قابل آدرسدهی باشند. در Next.js، App Router این لایه معماری را با layoutها، route segmentها، loading boundaryها، streaming و لینکهای prefetch-aware شفاف میکند.
اصل انضباط اینجاست که تصمیم بگیریم چه چیزی باید وارد قرارداد route شود و چه چیزی state موقتی UI باقی بماند. فیلترها، تبها، صفحهبندی و context دامنهای که کاربر باید بتواند share، restore یا revisit کند، بهتر است از مسیرهای typed و search params عبور کنند. تعاملهای کوتاهعمر میتوانند local بمانند. این جداسازی از state پنهان کلاینت جلوگیری میکند، ناوبری را قابل بازیابی نگه میدارد، با layoutهای پایدار و prefetch سرعت ادراکشده را بالا میبرد و با زیاد شدن صفحات، فهم معماری فرانتاند را سادهتر میکند.
این نگاه حتی شیوه دیباگ و توسعه محصول را هم بهتر میکند. وقتی وضعیتهای مهم داخل مسیر و URL قابل بازسازی باشند، QA میتواند یک حالت دقیق صفحه را با یک لینک گزارش کند، رفتار کاربر در analytics قابل فهمتر میشود و کاربر بعد از refresh یا share کردن لینک، همان نمای فیلترشده را از دست نمیدهد. در این مدل، route یک قرارداد پایدار محصول است: layout پیوستگی تجربه را حفظ میکند، loading boundary اعتماد کاربر را هنگام کندی نگه میدارد و URL state از گم شدن context جلوگیری میکند.
سیستم دیزاین به عنوان یک «قوانین تغییرناپذیر طراحی»
حاکمیت دیزاینتوکنها با Tailwind CSS
در مهندسی فرانتاند مدرن، رابط کاربری دیگر مجموعهای از CSSهای پراکنده یا تصمیمهای لحظهای توسعهدهنده نیست. لایه نمایش باید تحت حاکمیت یک سیستم دیزاین با قوانین تغییرناپذیر باشد: رنگ، فاصله، radius، تایپوگرافی، سایه، motion و وضعیت کامپوننتها باید از یک قرارداد مرکزی دیزاینتوکن عبور کنند. Tailwind CSS در این مدل ابزار اجرای قرارداد است، نه محلی برای انتخابهای پراکنده و سلیقهای.
هدف این است که visual drift قبل از شروع مهار شود. تغییر یک token مرکزی باید به شکل هماهنگ روی دکمهها، کارتها، بجها، stateها، themeها و layoutهای واکنشگرا اعمال شود. این ساختار میان تصمیم طراحی و کد production یک پل قابل اتکا میسازد، آنتروپی CSS را پایین نگه میدارد و مسیر رندر مرورگر را سبکتر میکند؛ چون استایلها declarative، قابل پیشبینی و در زمان build بهینه میشوند.
حاکمیت کامپوننتهای پایهای و معماری هدلس
حاکمیت منطق تعامل با Base UI و Radix UI
یک کامپوننت فرانتاند فقط ظاهر بصری نیست. Dialog، Popover، Select، Drawer و Dropdown همگی مسئولیتهای رفتاری پنهان دارند: مدیریت فوکوس، ناوبری کیبورد، وضعیتهای ARIA، بستن با Escape، کلیک بیرون، state کنترلشده و کنترلنشده، portal، قفلکردن scroll و چرخه عمر قابل پیشبینی. نوشتن این primitiveها از صفر، لایه نمایش را به مجموعهای از edge caseهای دسترسیپذیری، flowهای ناسازگار کیبورد و باگهای رفتاری تبدیل میکند؛ باگهایی که معمولاً فقط بعد از تعامل واقعی کاربر با رابط خودشان را نشان میدهند.
معماری هدلس مالکیت تعامل را از بیان بصری جدا میکند. Base UI و Radix UI هسته رفتار را تامین میکنند؛ Tailwind و دیزاینتوکنها پوسته ظاهری را میسازند. این جداسازی یک قرارداد تمیز ایجاد میکند: primitiveها مالک invariantهای دسترسیپذیری و تعامل هستند، و لایه محصول مالک زبان بصری، تراکم، motion و بیان برند است. بنابراین میتوان ظاهر کامپوننتها، themeها و الگوهای پیچیده UI را تغییر داد، بدون اینکه منطق فوکوس، semanticهای screen reader یا صحت stateها بشکند. نتیجه، توسعه سریعتر، باگهای نامرئی کمتر و سیستم کامپوننتی است که با رشد رابط کاربری همچنان قابل اعتماد میماند.
مدیریت وضعیت سرور با TanStack Query
مدیریت حافظه کش و چرخههای Server-State با TanStack Query
یکی از خطاهای رایج در معماری فرانتاند این است که دادههای سرور مثل state محلی کامپوننت مدیریت شوند. state محلی فقط به سوالهایی مثل باز یا بسته بودن یک منو جواب میدهد؛ اما server state سوالهای سختتری دارد: داده چه زمانی واکشی شده، هنوز fresh هست یا stale، چند کامپوننت مصرفکننده دارد، آیا باید retry شود، و هنگام برگشت فوکوس تب یا وصل شدن دوباره شبکه چه رفتاری باید داشته باشد. TanStack Query برای همین یک لایه اختصاصی مدیریت وضعیت سرور روی کلاینت میسازد.
اصل انضباط در این لایه، قرارداد Query Key است. هر منبع سرور یک هویت پایدار میگیرد؛ بنابراین چند کامپوننت میتوانند یک نتیجه cacheشده را به اشتراک بگذارند، درخواستهای همزمان dedupe شوند، داده قبلی هنگام revalidation روی صفحه باقی بماند و دادههای بیاستفاده بعد از gcTime از حافظه خارج شوند. staleTime مشخص میکند داده چه زمانی واجد شرایط refetch پسزمینه است، و رفتارهایی مثل refetchOnWindowFocus یا reconnect باعث میشوند رابط کاربری بدون loadingهای خالی و تکراری، با سرور همگام بماند.
معماری رندرینگ هوشمند React و کامپایل تایپ با TypeScript
مرزبندی RSC، Hydration حداقلی و قراردادهای Typed Runtime
پرفورمنس مدرن فرانتاند با انتقال همهچیز به مرورگر به دست نمیآید؛ از تصمیم دقیق درباره محل اجرای هر بخش رابط کاربری ساخته میشود. با React Server Components و مرزبندی رندر در Next.js، پوستههای ثابت، نماهای دادهمحور و منطق امن سمت سرور نزدیک به منبع داده اجرا میشوند، و فقط جزیرههای واقعاً تعاملی وارد باندل کلاینت میشوند. نتیجه، first paint سریعتر، JavaScript کمتر و مدل ذهنی شفافتر برای تعاملی شدن UI است.
TypeScript نیمه دوم این معماری است. propsهایی که از مرز server/client عبور میکنند، خروجی server actionها، stateهای چندحالته UI و قراردادهای داده در سطح route قبل از runtime کامپایل و کنترل میشوند؛ نه اینکه کاربر در production خطا را کشف کند. به همین دلیل refactor امنتر میشود: یک کامپوننت فقط وقتی از سرور به کلاینت منتقل میشود که وابستگیها، props قابل serialize و نیاز واقعی به تعامل کاملاً مشخص باشند. رندرینگ در این نگاه یک pipeline کنترلشده است، نه مجموعهای از re-renderهای اتفاقی.
آماده ورود به فاز ۳: معماری سرور و لایههای دفاعی بکاند هستید؟
در فاز بعدی به کپسولهسازی جهشهای داده با Server Actions، درگاههای تایپشده Hono، اعتبارسنجی تدافعی Zod در لبه سرور و چرخههای عمر امن نشستها خواهیم پرداخت.