
یه سناریوی واقعی که زیاد میبینم اینه:
تیم فنی با ذوق میگه «سایتمون SPA شده، کلی هم سریعتره، تجربه کاربری عالیه»…
بعد میرسیم به سئو و میبینیم بعضی صفحهها دیر ایندکس میشن، بعضیا اصلاً نمیآن تو نتایج، بعضیا با عنوان اشتباه دیده میشن، یا تغییرات محتوایی چند روز/چند هفته بعد اثر میذاره.
مشکل اینجا نیست که SPA بده. مشکل اینه که SPA اگر برای “رندر و کشف محتوا توسط گوگل” طراحی نشه، میتونه مثل یک سایت نیمهنامرئی رفتار کنه.
بیایم دقیق و کاربردی بازش کنیم.

در مدل سنتی (Multi-page)، هر URL معمولاً یک HTML کامل از سرور میگیره. یعنی وقتی کاربر یا گوگل میره /product/123، سرور همون صفحه رو با محتوای اصلی تحویل میده.
در SPA معمولاً اتفاق اینه:
بار اول یک پوسته (shell) و فایلهای JS میاد
بعد محتوا با جاوااسکریپت از API گرفته میشه و توی صفحه «تزریق» میشه
مسیرها (routeها) هم با JS عوض میشن، نه با بارگذاری کامل صفحه
این برای کاربر میتونه عالی باشه (روون، سریع، بدون رفرش).
ولی برای موتور جستجو… داستان حساستره.
گوگل برای اینکه محتوای SPA رو بفهمه، معمولاً مجبور میشه صفحه رو رندر کنه (یعنی مثل مرورگر اجراش کنه). اینجا چند نکته مهم داریم:

در مستندات Search Central توضیح داده میشه که پردازش صفحههای JSمحور شامل مرحلههایی مثل خزش HTML و بعد رندر با Web Rendering Service هست و این رندر میتونه به صف بره. یعنی ممکنه بین «دیدن HTML اولیه» تا «دیدن DOM نهایی» فاصله بیفته.
این همون جاییه که خیلیها حس میکنن «دو موج» اتفاق میافته:
موج اول = HTML خام
موج دوم = نسخه رندر شده (بعد از اجرای JS)
گوگل هم صریح میگه رندرینگ میتونه سنگین باشه و به همین دلیل، صف و تأخیر ممکنه وجود داشته باشه.
نتیجه عملی:
اگر محتوای حیاتی شما فقط بعد از JS لود میشه، تازگی محتوا (freshness) و سرعت ایندکس/بهروزرسانی میتونه ضربه بخوره.
بذار با یک مثال واقعی بگم:
شما صفحه دستهبندی دارید /category/charger
کاربر میاد، محصولات رو میبینه، فیلترها کار میکنن، همهچی عالی
ولی اگر View Source رو باز کنی، میبینی داخل HTML تقریباً هیچی نیست جز یه <div id="app"></div> و چندتا فایل JS
اینجا دو خطر جدی داریم:
چون محتوای اصلی بعداً با JS میاد و باید رندر بشه.
مثل:
عنوان (title) و متاها
canonical
دادههای ساختاریافته
لینکهای داخلی مهم
نه اینکه گوگل «هیچوقت» نبینه؛ بحث اینه که شما دارید ریسک میخرید.
خیلی از SPAها ناوبری رو با و دکمه و event هندل میسازن. کاربر کلیک میکنه و route عوض میشه…
ولی گوگل برای کشف URLها هنوز روی لینکهای واقعی حساب ویژه باز میکنه.
گوگل توی راهنمای لینکها خیلی شفاف میگه لینک باید به شکل قابل خزیدن و استاندارد (مثل <a href="...">) باشه تا بتونه کشف و دنبال بشه.
پس اگر ناوبری شما این شکلیه:
دکمههایی که URL واقعی ندارن
لینکهایی که با JS ساخته میشن و تو HTML اولیه نیستن
مسیرهایی که فقط بعد از تعامل کاربر ظاهر میشن
شما دارید کشف صفحات رو سخت میکنید.
نشونهاش:
View Source تقریباً هیچی نداره
ولی Inspect Element پر از محتواست
این یعنی محتوا وابسته به رندرینگ است.
کاربر اسکرول میکنه و آیتمها اضافه میشن، ولی:
صفحه ۲، ۳، ۴ URL ندارن
یا دارند ولی لینکپذیر نیستند
اینجا هم کشف و هم ایندکس مشکل میخوره (خصوصاً برای فروشگاهها و لیستها).
مثل:
/#/product/123
این مدل برای سئو معمولاً دردسرساز میشه چون ساختار URL و کشف صفحات محدود میشه.
مثلاً:
توضیحات محصول فقط بعد از کلیک روی تب “مشخصات” لود میشه
یا نظرات فقط بعد از اسکرول زیاد میاد
گوگل کاربر نیست؛ قرار نیست با صفحه مثل آدم تعامل کنه.
اگر API کند بشه، خطا بده، یا به User-Agent حساس باشه، ممکنه WRS محتوای کامل رو نگیره.

SSR یعنی سرور قبل از اینکه صفحه به مرورگر برسه، HTML کامل رو آماده میکنه.
برای سئو، این یعنی:
گوگل همون موج اول، محتوا رو میبینه
title/meta/canonical و لینکها سر جاشونه
ریسک صف رندر خیلی کمتر میشه
اگر فروشگاه، سایت محتوایی، لندینگهای مارکتینگ، دستهبندیهای رقابتی دارید… SSR معمولاً انتخاب طلاییه.
صفحات در زمان build تولید میشن.
برای بلاگها، مستندات، صفحات معرفی خدمات… فوقالعاده جواب میده.
همه چیز را SSR نکن.
واقعاً هم لازم نیست.
مدل حرفهای اینه:
صفحات سئویی و ورودی گوگل (category/product/article/landing) = SSR/SSG
بخشهای اپلیکیشنی پشت لاگین (dashboard/panel) = CSR (همون SPA)
اینطوری هم تیم فنی راضیه، هم سئو.
خود گوگل میگه Dynamic Rendering یک workaround هست و راهحل بلندمدت حساب نمیشه.
یعنی چی؟
یعنی شما برای botها یک نسخه رندرشده میفرستی، برای کاربرها SPA.
گاهی برای پروژههای بزرگ که تغییر معماری هزینه سنگین داره، به عنوان پل موقت استفاده میشه.
ولی اگر میتونی، از اول برو سمت SSR/SSG/Hybrid.
اگر View Source خالیه ولی Inspect پره → محتوا وابسته به JS است
اگر title و meta در Source نیستند → احتمال ریسک بالاتر
منو و لینکها را نگاه کن:
آیا <a href> واقعی داری؟
یا همه چیز و button است؟
اگر دستهبندی داری، حداقل باید:
عنوان دسته
متن کوتاه
چند آیتم نمونه یا اسکلت قابل فهم
در HTML اولیه باشد، نه صرفاً بعد از API.
دستهبندی و محصول: SSR یا Hybrid
فیلترها: قابل لینک شدن (URL پارامترها) و مدیریت canonical
infinite scroll: همراه با صفحهبندی و URL
SSG یا SSR
سرعت و CWV
لینکسازی داخلی واقعی و قابل خزیدن
صفحات عمومی و سئویی: SSR/SSG
داشبورد و بخشهای داخل حساب: CSR
مراقب routeهای عمومی باش که “خالی” نباشند
SSG/SSR کامل
کمترین JS ممکن برای محتوای اصلی
SPA بودن به خودی خود نه خوبه نه بد.
ولی اگر محتوای سئویی شما فقط بعد از JS و API دیده میشه، دارید روی «صف رندر گوگل» شرط میبندید؛ شرطی که زمانش دست شما نیست.
گوگل از یک طرف میگه ما میخزیم و ایندکس میکنیم و برای فهم صفحات رندر هم داریم،
از یک طرف هم واقعیت اینه که کشف و ایندکس پایدار هنوز عاشق ایناست:
HTML قابل فهم
لینکهای استاندارد و crawlable
معماری رندر مناسب (SSR/SSG/Hybrid)
و اگر گیر کردی، Dynamic Rendering فقط به عنوان مسکن موقت، نه درمان دائمی Google for Developers