SSR در ری اکت و نکست جی اس چیست ؟ ( رندر سمت سرور در ری اکت )
وقتی صحبت از توسعه وب اپلیکیشنها میشه، سرعت و بهینه سازی نقش کلیدی دارن. مخصوصاً وقتی میخوایم اپلیکیشن هایی بسازیم که به سرعت محتوا رو به کاربران نشون بدن و برای موتورهای جستجو هم دوستداشتنی باشن!
اینجاست که «رندر سمت سرور» (SSR) وارد ماجرا میشه. SSR در React و Next.js به ما این امکان رو میده که کدهای جاوااسکریپت رو قبل از رسیدن به مرورگر کاربر، روی سرور اجرا کنیم و یک HTML کامل تحویل مرورگر بدیم.
این کار نه تنها باعث میشه صفحات وب ما سریعتر لود بشن، بلکه به بهبود سئوی سایت هم کمک بزرگی میکنه. اما دقیقاً SSR چطور کار میکنه و چرا باید تو پروژه های خودمون بهش فکر کنیم؟ این مقاله رو همراه فِرانت اِندی باشید چون قراره همه چیز رو براتون روشن کنه 🙂
قبل از اینکه بریم سراغ SSR در ری اکت جازه بدید مدل های مختلف رندرینگ در ری اکت و Next.js رو باهمدیگه یاد بگیریم و بدونیم به جز SSR چه مدل های رندر دیگه ای تو ری اکت و Next.js داریم ..
مدلهای مختلف رندرینگ در React و Next.js
در توسعه وب اپلیکیشنها با React و Next.js، سه مدل اصلی رندرینگ وجود داره: رندر سمت کلاینت (CSR)، رندر سمت سرور (SSR)، و رندر استاتیک (SSG).
رندر سمت کلاینت (CSR): در این مدل که پیشفرض React هست، کل اپلیکیشن در مرورگر کاربر اجرا میشه. HTML اولیه خالیه و محتوا با اجرای جاوااسکریپت تولید میشه.
این روش برای اپلیکیشنهای SPA مناسبه اما بهینه سازی SEO و زمان لود اولیه ممکنه ضعیف باشه. اگه با مدل رندرینگ CSR آشنا نیستید پیشنهاد میکنم مقاله CSR در ری اکت رو مطالعه کنید.رندر سمت سرور (SSR): در این مدل، محتوای صفحه قبل از ارسال به مرورگر روی سرور تولید میشه. این باعث میشه صفحات سریعتر لود بشن و SEO بهتری داشته باشن. با این حال، فشار بیشتری به سرور وارد میشه و هزینه ها ممکنه بالاتر برن.
رندر استاتیک (SSG): در SSG، صفحات در زمان ساخت (build time) رندر میشن و به صورت استاتیک ذخیره میشن. این روش برای وب سایت های ثابت و محتوا محور (مثل وبلاگها) عالیه، اما محتوای داینامیک بروزرسانی سخت تری داره.
رندر ترکیبی (Hybrid Rendering): Next.js امکان ترکیب این مدلها رو فراهم میکنه. میتونید بعضی صفحات رو با SSR، بعضی رو با SSG، و بقیه رو با CSR پیاده کنید، که انعطاف پذیری بیشتری در بهینه سازی اپلیکیشن میده.
مقدمه ای بر SSR در ری اکت :رندر سمت سرور چرا مهمه ؟!
قبل از اینکه بریم سراغ جزئیات، بیاید ببینیم چرا اصلاً SSR (رندر سمت سرور) اهمیت داره. وقتی کاربر وارد یک سایت میشه، سرعت لود شدن صفحه میتونه تجربه اون رو کاملاً تغییر بده. فکر کنید وارد سایتی میشید که دیر بالا میاد؛ احتمالاً خیلی زود صفحه رو می بندید و سراغ گزینه بعدی میرید. SSR دقیقاً این مشکل رو هدف قرار داده و با لود سریعتر صفحات به بهبود تجربه کاربری کمک میکنه.
چطور SSR توی React و Next.js کار میکنه؟
ری اکت ذاتاً بهعنوان یک کتابخانه جاوااسکریپتی، از رندر سمت کلاینت (CSR) استفاده میکنه. یعنی کد جاوااسکریپت تو مرورگر کاربر اجرا میشه و بعد محتوای صفحه ساخته میشه. حالا وقتی از SSR استفاده میکنیم، این فرآیند تغییر میکنه. در SSR، محتوای صفحه روی سرور رندر میشه و یک HTML کامل و آماده به مرورگر کاربر فرستاده میشه.
نکست جی اس (Next.js) که یک فریمورک محبوب برای ری اکت هست، این فرآیند رو خیلی ساده کرده. این فریمورک به ما این امکان رو میده که انتخاب کنیم کدها کجا رندر بشن: سمت سرور یا سمت کلاینت. این انعطاف پذیری باعث میشه اپلیکیشن های قوی و بهینه ای بسازیم.
اگه با نکست جی اس آشنا نیستید پیشنهاد میکنم مقاله Next.js چیست رو مطالعه کنید.
مزایای استفاده از SSR در Next.js و React چیه ؟
از مهمترین مزایای Server Side Rendering ( SSR ) میشه به موارد زیر اشاره کرد:
- بهبود سرعت لود صفحه: چون محتوای HTML آماده به مرورگر فرستاده میشه، صفحه سریعتر لود میشه. این به معنی تجربه کاربری بهتره.
- بهبود SEO: موتورهای جستجو معمولاً صفحات HTML کامل رو بهتر میخونن. با SSR، شانس ما برای گرفتن رتبه بهتر تو گوگل بیشتر میشه.
- تجربه کاربری بهتر: کاربران بخصوص در دستگاههای با سرعت اینترنت پایین، لود سریع صفحات رو حس میکنن و این حس مثبتی ایجاد میکنه.
چالشها و محدودیتهای SSR
استفاده از SSR فقط خوبی نداره؛ چالش های خاص خودش رو هم داره. مثلاً:
- هزینه بالاتر سرور: چون محتوای صفحه روی سرور رندر میشه، فشار بیشتری به سرور وارد میشه و هزینه های میزبانی ممکنه بالاتر بره.
- پیچیدگی بیشتر کد: مدیریت اپلیکیشنی که هم از SSR و هم از CSR ( Client Side Rendering ) استفاده میکنه، نیاز به برنامه نویسی پیچیده تری داره. باید دقت کنیم که همه چیز به درستی کار کنه و باگ های ناخواسته ایجاد نشه.
کی از SSR استفاده کنیم و کی نه؟
انتخاب بین SSR و CSR بستگی به نیاز پروژه داره. اگر پروژهای داریم که SEO براش مهمه یا لود سریع اولیه برای کاربر اهمیت داره، SSR گزینه مناسبیه. اما اگر اپلیکیشنی داریم که بیشتر تعاملات بعد از لود اولیه اتفاق میفته (مثل یک داشبورد پیچیده)، CSR میتونه کافی باشه و حتی بهتر عمل کنه.
پیادهسازی SSR با استفاده از fetch
در نسخه جدید Next.js
در نسخههای جدید Next.js، میتونیم به سادگی از fetch
در Server Components برای دریافت داده ها استفاده کنیم. این روش از قابلیت های بومی سرور در Next.js استفاده میکنه تا دادهها رو پیش از ارسال به مرورگر فراخوانی کنه و محتوای بهینهشده به کاربر ارائه بده.
نمونه کد پیاده سازی یک کامپوننت SSR در Next.js
در این مثال ساده، از fetch
برای دریافت دادهها در یک کامپوننت سمت سرور استفاده میکنیم و در نهایت یک کامپوننت SSR خواهیم داشت :
// app/page.jsx
export default async function HomePage() {
// استفاده از fetch برای دریافت دادهها از API
const response = await fetch('https://api.example.com/data', {
cache: 'no-store', // غیرفعال کردن کش برای دریافت جدیدترین دادهها
});
const data = await response.json();
return (
صفحه اصلی با SSR و fetch
دادهها: {JSON.stringify(data)}
);
}
- استفاده از
fetch
:
اینجا ازfetch
برای فراخوانی دادهها از یک API استفاده میکنیم. این روش به ما این امکان رو میده که دادهها رو قبل از ارسال به مرورگر، در سرور دریافت و پردازش کنیم. - گزینه
cache: 'no-store'
:
این گزینه تضمین میکنه که هر بار درخواست جدیدی به سرور ارسال بشه و داده های تازه دریافت بشن، که برای مواردی که به دادههای داینامیک نیاز داریم بسیار مناسبه.
تو صفحات SSR نمیتونیم از هوک ها استفاده کنیم!
اگه با هوک ها آشنا نیستی، پیشنهاد میکنم مقاله هوک در ری اکت رو مطالعه کنی چون یکی از مهمترین مزایای ری اکت، همین هوک ها هستن!
خب، مسئله اینه که هوک ها برای مدیریت حالتها (State) و افکتها (Effects) در مرورگر طراحی شدن. وقتی کدی توی سرور اجرا میشه، نیازی به چیزهایی مثل useEffect
نداریم، چون این هوک ها به تعاملات و تغییرات تو مرورگر مربوط میشن. سرور فقط میخواد محتوای HTML رو آماده کنه و بفرسته؛ پس دیگه نیازی به این هوک ها نیست.
پس در جریان باشید که تو کامپوننت های SSR دیگه خبری از هوک های پرکاربرد مثل useEffect یا useState و .. نیست.
جمعبندی
SSR در نکست جی اس و ری اکت یکی از تکنیک های قدرتمند برای بهینهسازی وب اپلیکیشنهاست، بهخصوص وقتی سرعت و سئو برامون اهمیت دارن.
استفاده از فریمورک هایی مثل Next.js این فرآیند رو ساده تر کرده و امکانات زیادی در اختیارمون گذاشته. البته باید بین مزایا و چالش های این روش تعادل برقرار کنیم تا بهترین تصمیم رو برای پروژه هامون بگیریم.
تو بخش زیر هم میتونی سوالات پرتکرار ما Front-End Developer ها درمورد SSR در ری اکت و نکست جی اس رو بخونی 🙂
SSR یعنی رندر کردن محتوای صفحه توی سرور و فرستادن یه HTML کامل به مرورگر کاربر. این کار باعث میشه صفحه خیلی سریعتر برای کاربر لود بشه و سئوی بهتری داشته باشیم. این یعنی اگه بخوایم سایتمون تو گوگل بهتر دیده بشه و سریع لود بشه، SSR میتونه حسابی کمک کنه.
تو CSR (رندر سمت کلاینت)، همه چی تو مرورگر اتفاق میوفته. یعنی جاوااسکریپت اجرا میشه و تازه صفحه رو میسازه. ولی تو SSR، سرور از قبل صفحه رو میسازه و به مرورگر میفرسته. نتیجه؟ SSR برای سئو و سرعت بهتره، ولی CSR برای اپلیکیشن هایی که تعاملات زیادی دارن، میتونه مناسب تر باشه. ( مثال داشبورد ها یا فرم هایی که تعاملات پیچیده دارن )
موتورهای جستجو، مثل گوگل، عاشق اینن که محتوای صفحه رو سریع و بدون دردسر ببینن. با SSR، محتوا از همون اول آماده و کامل تو HTML هست و این کار باعث میشه گوگل راحت تر صفحه مارو ایندکس کنه. ولی تو CSR، چون محتوا بعد از اجرای جاوااسکریپت لود میشه، ممکنه سئو ضعیف بشه.
نه بابا! استفاده از SSR بستگی به نوع پروژه داره. اگه سایت خبری، فروشگاه آنلاین، یا هر چیزی که محتواش برای سئو مهمه داری، SSR خوبه. ولی اگه یه اپلیکیشن سنگین با تعاملات زیاد مثل داشبورد داری، شاید CSR بهتر باشه.
آره، چون سرور باید محتوای صفحه رو رندر کنه و به مرورگر بفرسته، منابع بیشتری مصرف میشه. این یعنی ممکنه هزینه های میزبانی بالا بره، مخصوصاً اگه ترافیک سایتت زیاد باشه.
تو نسخه های جدید Next.js میتونیم با fetch
داده های داینامیک رو از API بگیریم و قبل از اینکه صفحه به کاربر برسه، رندرش کنیم. این کار باعث میشه داده ها سریع و آماده باشن. خیلی راحت و بهینه!
خب، یکی از مشکلاتش پیچیدگی کده. مثلاً مدیریت حالت های پیچیده میتونه سخت باشه. یه مشکل دیگه اینه که اگه صفحه خیلی بزرگ و سنگین باشه، رندر سمت سرور میتونه کند بشه. باید حسابی بهینه سازی کنیم.
آره، و این دقیقاً یکی از جذابیت های Next.js هست. میتونی بعضی صفحات رو با SSR و بقیه رو با CSR بسازی. اینجوری بهترین حالت رو برای هر بخش سایتت داری و کاربرها هم تجربه خوبی دارن.
میتونی از کش سرور استفاده کنی تا درخواستهای تکراری رو سریعتر جواب بدی و فشار روی سرور کمتر بشه. تو Next.js راههایی برای مدیریت کش وجود داره که میتونه به بهینه سازی کمک کنه. کش همیشه دوست خوب ماست!
نه به خودی خود، ولی باید حواست باشه که داده های ناامن به مرورگر نفرستی. مثلاً اگه از دادههایی استفاده میکنی که کاربر وارد میکنه، باید حتماً اونها رو اعتبارسنجی و پاکسازی کنی تا حملات XSS اتفاق نیفته.
درباره احمد احمدنژاد
من یه برنامه نویس و توسعه دهنده وب هستم که عاشق دنیای صفر و یکم❤️
نوشتههای بیشتر از احمد احمدنژاد
دیدگاهتان را بنویسید