با کامپوننتهای سرور ریاکت، تحول توسعه وب را بررسی کنید و تأثیر آن بر رندر سمت سرور، عملکرد و تجربه توسعهدهنده را بیاموزید.
کامپوننتهای سرور ریاکت: تکامل رندر سمت سرور
چشمانداز توسعه وب در حال تغییر مداوم است و پارادایمهای جدیدی برای حل چالشهای قدیمی ظهور میکنند. سالهاست که توسعهدهندگان برای دستیابی به تعادل کامل بین تجربیات کاربری غنی و تعاملی و بارگذاری سریع و کارآمد صفحات تلاش کردهاند. رندر سمت سرور (SSR) یکی از پایههای اصلی در دستیابی به این تعادل بوده است و با ظهور کامپوننتهای سرور ریاکت (RSC)، ما شاهد تکامل قابل توجهی در این تکنیک بنیادی هستیم.
این پست به بررسی جزئیات کامپوننتهای سرور ریاکت میپردازد، تاریخچه رندر سمت سرور را ردیابی میکند، مشکلاتی را که RSC قصد حل آنها را دارد درک میکند و پتانسیل تحولآفرین آن را برای ساخت اپلیکیشنهای وب مدرن و با کارایی بالا بررسی میکند.
پیدایش رندر سمت سرور
قبل از پرداختن به تفاوتهای ظریف کامپوننتهای سرور ریاکت، درک زمینه تاریخی رندر سمت سرور بسیار مهم است. در روزهای اولیه وب، تقریباً تمام محتوا در سرور تولید میشد. هنگامی که یک کاربر صفحهای را درخواست میکرد، سرور به صورت پویا HTML را میساخت و آن را به مرورگر ارسال میکرد. این روش زمان بارگذاری اولیه عالی را ارائه میداد، زیرا مرورگر محتوای کاملاً رندر شده را دریافت میکرد.
با این حال، این رویکرد محدودیتهایی داشت. هر تعامل اغلب به بارگذاری مجدد کامل صفحه نیاز داشت که منجر به تجربه کاربری کمتر پویا و اغلب نامناسب میشد. معرفی جاوا اسکریپت و فریمورکهای سمت کلاینت، بار رندر را به سمت مرورگر منتقل کرد.
ظهور رندر سمت کلاینت (CSR)
رندر سمت کلاینت، که توسط فریمورکهایی مانند React، Angular و Vue.js محبوب شد، نحوه ساخت اپلیکیشنهای تعاملی را متحول کرد. در یک اپلیکیشن CSR معمولی، سرور یک فایل HTML حداقلی را به همراه یک بسته بزرگ جاوا اسکریپت ارسال میکند. سپس مرورگر این جاوا اسکریپت را دانلود، تجزیه و اجرا میکند تا رابط کاربری را رندر کند. این رویکرد امکانپذیر میسازد:
- تعامل غنی: رابطهای کاربری پیچیده و تعاملات یکپارچه کاربر بدون بارگذاری مجدد کامل صفحه.
- تجربه توسعهدهنده: یک گردش کار توسعه سادهتر برای ساخت اپلیکیشنهای تکصفحهای (SPA).
- قابلیت استفاده مجدد: کامپوننتها میتوانند به طور مؤثر در بخشهای مختلف اپلیکیشن ساخته و استفاده شوند.
علیرغم مزایای آن، CSR چالشهای خاص خود را به همراه داشت، به ویژه در مورد عملکرد بارگذاری اولیه و بهینهسازی موتورهای جستجو (SEO).
چالشهای رندر خالص سمت کلاینت
- زمان بارگذاری اولیه کند: کاربران باید منتظر بمانند تا جاوا اسکریپت دانلود، تجزیه و اجرا شود تا محتوای معناداری را ببینند. این اغلب به عنوان مشکل "صفحه سفید" شناخته میشود.
- مشکلات SEO: اگرچه خزندههای موتورهای جستجو بهبود یافتهاند، اما هنوز هم ممکن است در ایندکس کردن محتوایی که به شدت به اجرای جاوا اسکریپت وابسته است، با مشکل مواجه شوند.
- عملکرد در دستگاههای ضعیف: اجرای بستههای بزرگ جاوا اسکریپت میتواند برای دستگاههای با قدرت کمتر سنگین باشد و منجر به کاهش تجربه کاربری شود.
بازگشت رندر سمت سرور (SSR)
برای مقابله با معایب CSR خالص، رندر سمت سرور، اغلب در رویکردهای ترکیبی، بازگشتی دوباره داشت. تکنیکهای مدرن SSR با هدف:
- بهبود عملکرد بارگذاری اولیه: با پیشرندر کردن HTML در سرور، کاربران محتوا را بسیار سریعتر میبینند.
- تقویت SEO: موتورهای جستجو میتوانند به راحتی HTML پیشرندر شده را بخزند و ایندکس کنند.
- دسترسیپذیری بهتر: محتوا حتی اگر جاوا اسکریپت بارگیری یا اجرا نشود، در دسترس است.
فریمورکهایی مانند Next.js در دسترستر و عملیتر کردن SSR برای اپلیکیشنهای ریاکت پیشگام شدند. Next.js ویژگیهایی مانند getServerSideProps
و getStaticProps
را ارائه داد که به توسعهدهندگان امکان میداد صفحات را به ترتیب در زمان درخواست یا زمان ساخت، پیشرندر کنند.
مشکل 'هیدراتاسیون' (Hydration)
در حالی که SSR به طور قابل توجهی بارگذاری اولیه را بهبود بخشید، یک مرحله حیاتی در این فرآیند هیدراتاسیون بود. هیدراتاسیون فرآیندی است که طی آن جاوا اسکریپت سمت کلاینت، HTML رندر شده توسط سرور را "در دست میگیرد" و آن را تعاملی میکند. این شامل موارد زیر است:
- سرور HTML را ارسال میکند.
- مرورگر HTML را رندر میکند.
- مرورگر بسته جاوا اسکریپت را دانلود میکند.
- بسته جاوا اسکریپت تجزیه و اجرا میشود.
- جاوا اسکریپت شنوندگان رویداد را به عناصر HTML از قبل رندر شده متصل میکند.
این "رندر مجدد" در کلاینت میتواند یک گلوگاه عملکرد باشد. در برخی موارد، جاوا اسکریپت سمت کلاینت ممکن است بخشهایی از رابط کاربری را که قبلاً به طور کامل توسط سرور رندر شده بودند، دوباره رندر کند. این کار اساساً تکراری است و میتواند منجر به موارد زیر شود:
- افزایش بار مفید (Payload) جاوا اسکریپت: توسعهدهندگان اغلب مجبورند بستههای بزرگ جاوا اسکریپت را به کلاینت ارسال کنند تا کل اپلیکیشن را "هیدراته" کنند، حتی اگر فقط بخش کوچکی از آن تعاملی باشد.
- تقسیمبندی گیجکننده باندل: تصمیمگیری در مورد اینکه کدام بخشهای اپلیکیشن نیاز به هیدراتاسیون دارند میتواند پیچیده باشد.
معرفی کامپوننتهای سرور ریاکت (RSC)
کامپوننتهای سرور ریاکت، که ابتدا به عنوان یک ویژگی آزمایشی معرفی شدند و اکنون بخش اصلی فریمورکهای مدرن ریاکت مانند Next.js (App Router) هستند، یک تغییر پارادایم را نشان میدهند. به جای ارسال تمام کد ریاکت شما به کلاینت برای رندر، RSC به شما این امکان را میدهد که کامپوننتها را به طور کامل در سرور رندر کنید و فقط HTML ضروری و حداقل جاوا اسکریپت را ارسال کنید.
ایده اصلی پشت RSC تقسیم اپلیکیشن شما به دو نوع کامپوننت است:
- کامپوننتهای سرور (Server Components): این کامپوننتها منحصراً در سرور رندر میشوند. آنها دسترسی مستقیم به منابع سرور (پایگاه داده، سیستم فایل، APIها) دارند و نیازی به ارسال به کلاینت ندارند. آنها برای واکشی دادهها و رندر محتوای استاتیک یا نیمهپویا ایدهآل هستند.
- کامپوننتهای کلاینت (Client Components): اینها کامپوننتهای سنتی ریاکت هستند که در کلاینت رندر میشوند. آنها با دستورالعمل
'use client'
مشخص میشوند. آنها میتوانند از ویژگیهای تعاملی ریاکت مانند مدیریت وضعیت (useState
،useReducer
)، افکتها (useEffect
) و شنوندگان رویداد استفاده کنند.
ویژگیها و مزایای کلیدی RSC
RSC اساساً نحوه ساخت و تحویل اپلیکیشنهای ریاکت را تغییر میدهد. در اینجا برخی از مزایای کلیدی آن آورده شده است:
-
کاهش حجم بسته جاوا اسکریپت: از آنجا که کامپوننتهای سرور به طور کامل در سرور اجرا میشوند، کد آنها هرگز به کلاینت ارسال نمیشود. این به طور چشمگیری میزان جاوا اسکریپتی را که مرورگر باید دانلود و اجرا کند کاهش میدهد، که منجر به بارگذاری اولیه سریعتر و عملکرد بهتر، به ویژه در دستگاههای تلفن همراه میشود.
مثال: کامپوننتی که دادههای محصول را از پایگاه داده واکشی کرده و نمایش میدهد، میتواند یک کامپوننت سرور باشد. فقط HTML حاصل ارسال میشود، نه جاوا اسکریپت برای واکشی و رندر دادهها. -
دسترسی مستقیم به سرور: کامپوننتهای سرور میتوانند مستقیماً به منابع بکاند مانند پایگاه داده، سیستم فایل یا APIهای داخلی دسترسی داشته باشند بدون اینکه نیاز به افشای آنها از طریق یک نقطه پایانی API جداگانه باشد. این کار واکشی دادهها را ساده کرده و پیچیدگی زیرساخت بکاند شما را کاهش میدهد.
مثال: کامپوننتی که اطلاعات پروفایل کاربر را از یک پایگاه داده محلی واکشی میکند، میتواند این کار را مستقیماً در داخل کامپوننت سرور انجام دهد و نیاز به فراخوانی API از سمت کلاینت را از بین ببرد. -
حذف گلوگاههای هیدراتاسیون: از آنجا که کامپوننتهای سرور در سرور رندر میشوند و خروجی آنها HTML استاتیک است، نیازی نیست که کلاینت آنها را "هیدراته" کند. این بدان معناست که جاوا اسکریپت سمت کلاینت فقط مسئول کامپوننتهای کلاینت تعاملی است که منجر به تجربه تعاملی روانتر و سریعتر میشود.
مثال: یک طرحبندی پیچیده که توسط یک کامپوننت سرور رندر شده است، بلافاصله پس از دریافت HTML آماده خواهد بود. فقط دکمهها یا فرمهای تعاملی درون آن طرحبندی که به عنوان کامپوننت کلاینت مشخص شدهاند، به هیدراتاسیون نیاز دارند. - عملکرد بهبود یافته: با انتقال رندر به سرور و به حداقل رساندن جاوا اسکریپت سمت کلاینت، RSC به زمان تعاملی شدن سریعتر (TTI) و عملکرد کلی بهتر صفحه کمک میکند.
-
تجربه توسعهدهنده بهبود یافته: جداسازی واضح بین کامپوننتهای سرور و کلاینت، معماری را ساده میکند. توسعهدهندگان میتوانند راحتتر در مورد اینکه واکشی داده و تعامل باید در کجا اتفاق بیفتد، استدلال کنند.
مثال: توسعهدهندگان میتوانند با اطمینان منطق واکشی داده را در کامپوننتهای سرور قرار دهند، با علم به اینکه بسته کلاینت را حجیم نخواهد کرد. عناصر تعاملی به صراحت با'use client'
مشخص میشوند. - هممکانی کامپوننت: کامپوننتهای سرور به شما این امکان را میدهند که منطق واکشی داده را با کامپوننتهایی که از آن استفاده میکنند، در یک مکان قرار دهید، که منجر به کد تمیزتر و سازمانیافتهتر میشود.
نحوه کار کامپوننتهای سرور ریاکت
کامپوننتهای سرور ریاکت از یک فرمت سریالسازی ویژه برای ارتباط بین سرور و کلاینت استفاده میکنند. هنگامی که یک اپلیکیشن ریاکت با استفاده از RSC درخواست میشود:
- رندر در سرور: سرور کامپوننتهای سرور را اجرا میکند. این کامپوننتها میتوانند دادهها را واکشی کنند، به منابع سمت سرور دسترسی داشته باشند و خروجی خود را تولید کنند.
- سریالسازی: به جای ارسال رشتههای HTML کاملاً شکلگرفته برای هر کامپوننت، RSC توصیفی از درخت ریاکت را سریالسازی میکند. این توصیف شامل اطلاعاتی در مورد اینکه کدام کامپوننتها باید رندر شوند، چه پراپهایی دریافت میکنند و در کجا به تعامل سمت کلاینت نیاز است، میباشد.
- اتصال در سمت کلاینت: کلاینت این توصیف سریالسازی شده را دریافت میکند. سپس زمان اجرای ریاکت در کلاینت از این توصیف برای "اتصال" رابط کاربری استفاده میکند. برای کامپوننتهای سرور، HTML استاتیک را رندر میکند. برای کامپوننتهای کلاینت، آنها را رندر کرده و شنوندگان رویداد و منطق مدیریت وضعیت لازم را متصل میکند.
این فرآیند سریالسازی بسیار کارآمد است و به جای ارسال رشتههای کامل HTML که ممکن است نیاز به پردازش مجدد توسط کلاینت داشته باشند، فقط اطلاعات ضروری در مورد ساختار و تفاوتهای UI را ارسال میکند.
مثالهای عملی و موارد استفاده
بیایید یک صفحه محصول معمولی در یک فروشگاه اینترنتی را برای نشان دادن قدرت RSC در نظر بگیریم.
سناریو: صفحه محصول یک فروشگاه اینترنتی
یک صفحه محصول معمولاً شامل موارد زیر است:
- جزئیات محصول (نام، توضیحات، قیمت)
- تصاویر محصول
- نظرات مشتریان
- دکمه افزودن به سبد خرید
- بخش محصولات مرتبط
با کامپوننتهای سرور ریاکت:
-
جزئیات محصول و نظرات (کامپوننتهای سرور): کامپوننتهای مسئول واکشی و نمایش جزئیات محصول (نام، توضیحات، قیمت) و نظرات مشتریان میتوانند کامپوننتهای سرور باشند. آنها میتوانند مستقیماً از پایگاه داده برای اطلاعات محصول و دادههای نظرات کوئری بزنند. خروجی آنها HTML استاتیک است که بارگذاری اولیه سریع را تضمین میکند.
// components/ProductDetails.server.jsx async function ProductDetails({ productId }) { const product = await getProductFromDatabase(productId); const reviews = await getReviewsForProduct(productId); return (
{product.name}
{product.description}
Price: ${product.price}
Reviews
-
{reviews.map(review =>
- {review.text} )}
- تصاویر محصول (کامپوننتهای سرور): کامپوننتهای تصویر نیز میتوانند کامپوننتهای سرور باشند و URLهای تصویر را از سرور واکشی کنند.
-
دکمه افزودن به سبد خرید (کامپوننت کلاینت): دکمه "افزودن به سبد خرید" که نیاز به مدیریت وضعیت خود دارد (مثلاً بارگذاری، تعداد، افزودن به سبد)، باید یک کامپوننت کلاینت باشد. این به آن اجازه میدهد تا تعاملات کاربر را مدیریت کند، برای افزودن آیتمها به سبد خرید فراخوانیهای API انجام دهد و رابط کاربری خود را بر اساس آن بهروز کند.
// components/AddToCartButton.client.jsx 'use client'; import { useState } from 'react'; function AddToCartButton({ productId }) { const [quantity, setQuantity] = useState(1); const [isAdding, setIsAdding] = useState(false); const handleAddToCart = async () => { setIsAdding(true); // فراخوانی API برای افزودن آیتم به سبد خرید await addToCartApi(productId, quantity); setIsAdding(false); alert('آیتم به سبد خرید اضافه شد!'); }; return (
setQuantity(parseInt(e.target.value, 10))} min="1" />); } export default AddToCartButton; - محصولات مرتبط (کامپوننت سرور): بخشی که محصولات مرتبط را نمایش میدهد نیز میتواند یک کامپوننت سرور باشد و دادهها را از سرور واکشی کند.
در این تنظیمات، بارگذاری اولیه صفحه فوقالعاده سریع است زیرا اطلاعات اصلی محصول در سرور رندر میشود. فقط دکمه تعاملی "افزودن به سبد خرید" برای عملکرد به جاوا اسکریپت سمت کلاینت نیاز دارد که به طور قابل توجهی حجم بسته کلاینت را کاهش میدهد.
مفاهیم و دستورالعملهای کلیدی
درک دستورالعملها و مفاهیم زیر هنگام کار با کامپوننتهای سرور ریاکت بسیار مهم است:
-
دستورالعمل
'use client'
: این کامنت ویژه در بالای یک فایل، یک کامپوننت و تمام فرزندان آن را به عنوان کامپوننتهای کلاینت مشخص میکند. اگر یک کامپوننت سرور یک کامپوننت کلاینت را وارد کند، آن کامپوننت وارد شده و فرزندانش نیز باید کامپوننتهای کلاینت باشند. -
کامپوننتهای سرور به طور پیشفرض: در محیطهایی که از RSC پشتیبانی میکنند (مانند Next.js App Router)، کامپوننتها به طور پیشفرض کامپوننتهای سرور هستند مگر اینکه به صراحت با
'use client'
مشخص شوند. - پاس دادن پراپها (Props): کامپوننتهای سرور میتوانند پراپها را به کامپوننتهای کلاینت پاس دهند. با این حال، پراپهای اولیه (رشتهها، اعداد، بولینها) به طور کارآمد سریالسازی و پاس داده میشوند. اشیاء پیچیده یا توابع نمیتوانند مستقیماً از کامپوننتهای سرور به کلاینت پاس داده شوند و توابع نمیتوانند از کامپوننتهای کلاینت به سرور پاس داده شوند.
-
عدم وجود وضعیت (State) یا افکتهای (Effects) ریاکت در کامپوننتهای سرور: کامپوننتهای سرور نمیتوانند از هوکهای ریاکت مانند
useState
،useEffect
یا کنترلکنندههای رویداد مانندonClick
استفاده کنند زیرا در کلاینت تعاملی نیستند. -
واکشی داده: واکشی داده در کامپوننتهای سرور معمولاً با استفاده از الگوهای استاندارد
async/await
انجام میشود و مستقیماً به منابع سرور دسترسی پیدا میکند.
ملاحظات جهانی و بهترین شیوهها
هنگام اتخاذ کامپوننتهای سرور ریاکت، در نظر گرفتن پیامدهای جهانی و بهترین شیوهها ضروری است:
-
کش کردن در CDN: کامپوننتهای سرور، به ویژه آنهایی که محتوای استاتیک را رندر میکنند، میتوانند به طور مؤثر در شبکههای تحویل محتوا (CDN) کش شوند. این تضمین میکند که کاربران در سراسر جهان پاسخهای سریعتر و از نظر جغرافیایی نزدیکتر دریافت کنند.
مثال: صفحات لیست محصولات که به طور مکرر تغییر نمیکنند، میتوانند توسط CDNها کش شوند که به طور قابل توجهی بار سرور را کاهش داده و تأخیر را برای کاربران بینالمللی بهبود میبخشد. -
بینالمللیسازی (i18n) و محلیسازی (l10n): کامپوننتهای سرور میتوانند برای i18n قدرتمند باشند. شما میتوانید دادههای مختص منطقه را بر اساس هدرهای درخواست کاربر (مثلاً
Accept-Language
) در سرور واکشی کنید. این بدان معناست که محتوای ترجمه شده و دادههای محلیسازی شده (مانند ارز، تاریخ) میتوانند قبل از ارسال صفحه به کلاینت، در سرور رندر شوند.
مثال: یک وبسایت خبری جهانی میتواند از کامپوننتهای سرور برای واکشی مقالات خبری و ترجمههای آنها بر اساس زبان شناسایی شده مرورگر یا آدرس IP کاربر استفاده کند و از همان ابتدا مرتبطترین محتوا را تحویل دهد. - بهینهسازی عملکرد برای شبکههای متنوع: با به حداقل رساندن جاوا اسکریپت سمت کلاینت، RSC ذاتاً در اتصالات شبکه کندتر یا کمتر قابل اعتماد، که در بسیاری از نقاط جهان رایج است، عملکرد بهتری دارد. این با هدف ایجاد تجربیات وب فراگیر همسو است.
-
احراز هویت و مجوزدهی: عملیات حساس یا دسترسی به دادهها را میتوان مستقیماً در کامپوننتهای سرور مدیریت کرد و اطمینان حاصل کرد که بررسیهای احراز هویت و مجوزدهی کاربر در سرور انجام میشود و امنیت را افزایش میدهد. این برای اپلیکیشنهای جهانی که با مقررات حریم خصوصی متنوع سروکار دارند، بسیار مهم است.
مثال: یک اپلیکیشن داشبورد میتواند از کامپوننتهای سرور برای واکشی دادههای خاص کاربر فقط پس از احراز هویت کاربر در سمت سرور استفاده کند. - بهبود تدریجی (Progressive Enhancement): در حالی که RSC یک رویکرد قدرتمند سرور-محور ارائه میدهد، هنوز هم تمرین خوبی است که بهبود تدریجی را در نظر بگیرید. اطمینان حاصل کنید که قابلیتهای حیاتی حتی اگر جاوا اسکریپت به تأخیر بیفتد یا با شکست مواجه شود، در دسترس هستند، که کامپوننتهای سرور به تسهیل آن کمک میکنند.
- ابزارها و پشتیبانی فریمورک: فریمورکهایی مانند Next.js از RSC استقبال کردهاند و ابزارهای قوی و مسیر روشنی برای پذیرش آن ارائه میدهند. اطمینان حاصل کنید که فریمورک انتخابی شما پشتیبانی و راهنمایی کافی برای پیادهسازی مؤثر RSC را فراهم میکند.
آینده رندر سمت سرور با RSC
کامپوننتهای سرور ریاکت فقط یک بهبود تدریجی نیستند؛ آنها نمایانگر بازاندیشی اساسی در مورد نحوه معماری و تحویل اپلیکیشنهای ریاکت هستند. آنها شکاف بین توانایی سرور در واکشی کارآمد دادهها و نیاز کلاینت به رابطهای کاربری تعاملی را پر میکنند.
این تکامل با هدف:
- سادهسازی توسعه فول-استک: با اجازه دادن به تصمیمگیری در سطح کامپوننت در مورد اینکه رندر و واکشی داده در کجا رخ دهد، RSC میتواند مدل ذهنی را برای توسعهدهندگانی که اپلیکیشنهای فول-استک میسازند، ساده کند.
- فراتر بردن مرزهای عملکرد: تمرکز بر کاهش جاوا اسکریپت سمت کلاینت و بهینهسازی رندر سرور، همچنان مرزهای عملکرد وب را به جلو میبرد.
- فعالسازی الگوهای معماری جدید: RSC درها را به روی الگوهای معماری جدید باز میکند، مانند رابطهای کاربری جریانی (streaming UI) و کنترل دقیقتر بر روی اینکه چه چیزی در کجا رندر میشود.
در حالی که پذیرش RSC هنوز در حال رشد است، تأثیر آن غیرقابل انکار است. فریمورکهایی مانند Next.js پیشگام هستند و این استراتژیهای رندر پیشرفته را برای طیف وسیعتری از توسعهدهندگان در دسترس قرار میدهند. با بلوغ اکوسیستم، میتوان انتظار داشت که اپلیکیشنهای نوآورانهتری با این پارادایم قدرتمند جدید ساخته شوند.
نتیجهگیری
کامپوننتهای سرور ریاکت یک نقطه عطف مهم در سفر رندر سمت سرور هستند. آنها بسیاری از چالشهای عملکردی و معماری را که اپلیکیشنهای وب مدرن با آن دست و پنجه نرم کردهاند، برطرف میکنند و راهی به سوی تجربیات سریعتر، کارآمدتر و مقیاسپذیرتر ارائه میدهند.
با اجازه دادن به توسعهدهندگان برای تقسیم هوشمندانه کامپوننتهای خود بین سرور و کلاینت، RSC ما را قادر میسازد تا اپلیکیشنهایی بسازیم که هم بسیار تعاملی و هم فوقالعاده کارآمد هستند. همانطور که وب به تکامل خود ادامه میدهد، کامپوننتهای سرور ریاکت آمادهاند تا نقش محوری در شکلدهی آینده توسعه فرانتاند ایفا کنند و راهی سادهتر و قدرتمندتر برای ارائه تجربیات کاربری غنی در سراسر جهان ارائه دهند.
پذیرش این تغییر نیازمند یک رویکرد متفکرانه به معماری کامپوننت و درک روشنی از تمایز بین کامپوننتهای سرور و کلاینت است. با این حال، مزایای آن از نظر عملکرد، تجربه توسعهدهنده و مقیاسپذیری، آن را به یک تکامل قانعکننده برای هر توسعهدهنده ریاکت که به دنبال ساخت نسل بعدی اپلیکیشنهای وب است، تبدیل میکند.