🚀 SEO на SPA: як подружити JavaScript з Google та не втрачати органічний трафік

SPA SEO

Вступ: У чому проблема SEO на SPA?

Single Page Application (SPA) — це швидко, інтерактивно і красиво для користувачів. Але Google все ще не вміє повністю ефективно обробляти JavaScript (заявляє, що вміє, але цей процес на практиці вимагає набагато більше ресурсів і може призводити до непередбачуваних наслідків). Як наслідок — ваші ідеальні сторінки не потрапляють в індекс, або потрапляють і так само швидко звідти вилітають, а бізнес втрачає трафік після кожного Google Core Update.

Більше того — Google наразі є єдиною з небагатьох пошукових систем, хто може впоратись з SPA:

  • DuckDuckGo — базується на індексах Bing і не має власного потужного рендерингу JavaScript.
  • Bing — покращив підтримку JavaScript, але все ще має проблеми з рендерингом складних SPA.
  • Yahoo — використовує індекси Bing, тому успадковує його обмеження.
  • Baidu — погано працює з JavaScript і часто не індексує динамічно згенерований контент.
  • Yandex — має покращену підтримку JavaScript у порівнянні з іншими, але не завжди правильно обробляє SPA.
  • Naver та інші локальні пошуковики (наприклад, Seznam у Чехії) — зазвичай мають слабку підтримку рендерингу JavaScript.

Додайте до цього Gemini, ChatGPT, Claude, Mistral, Perplexity, які теж не вміють гратись в JS, і проблема органічного трафіку стане комплексною.

Тому у цій статті ми покроково розглянемо, як виправити типові SEO-проблеми SPA, зберегти органічний трафік і навіть покращити ранжування (на прикладі Google).

📌 1. Як Google бачить ваш SPA-сайт?

Googlebot проходить дві стадії обробки сторінки:

  1. Перша хвиля: отримує лише HTML-код (часто порожній шаблон без контенту).
  2. Друга хвиля (Delayed JS-rendering): завантажує і виконує JavaScript. Це може статися через години, дні або взагалі не статися.

Проблема

Не всі сторінки доходять до другого етапу. Це може бути пов’язано з:

  • Повільним JavaScript.
  • Високим навантаженням сервера.
  • Googlebot просто не має ресурсів рендерити контент.

Приклад проблеми

SPA

Google отримує порожній div, без будь-якого текстового контенту.
Іноді Googlebot навіть не дочекається рендерингу JS.

📌 2. Втрата трафіку після Google Core Update

У березні після Google Core Update, піддослідний SPA-сайт втратив понад 50% трафіку. SSR-версія навпаки — залишилась стабільною.

Чому так сталося?

Аналіз логів Googlebot показав:

  • Бот заходив лише один раз і отримував порожню сторінку.
  • JS-контент він рендерити вже не повертався.

SEO-метрики (LCP, CLS, FID) стали критичними для JS-рендерингу. Повільні SPA-сторінки втратили трафік практично одразу.

📌 3. Як перевірити, що Googlebot бачить SPA-контент?

Інструменти для перевірки

  • Google Search Console (інструмент Inspect URL):
    search.google.com/search-console/inspect
  • Chrome DevTools (Command+Option+C (Mac), або Control+Shift+C (Windows, Linux, ChromeOS)
  • Puppeteer (рендер сторінок):
// Puppeteer-скрипт, щоб перевірити, як бачить контент Googlebot
const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  // Емуляція Googlebot
  await page.setUserAgent('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
  await page.goto('https://your-spa-site.com', {waitUntil: 'networkidle0'});
  const html = await page.content();
  console.log(html);
  await browser.close();
})();

Перевірте, чи є ваш контент у виведеному HTML.

📌 4. Як вирішити SEO-проблему SPA: реальні методи

✅ 4.1 Pre-rendering

Популярні інструменти:

// Приклад конфігурації Rendertron (Express middleware)
const express = require('express');
const app = express();
const rendertron = require('rendertron-middleware');
app.use(rendertron.makeMiddleware({
  proxyUrl: 'https://render-tron.appspot.com/render'
}));
app.use(express.static('dist'));
app.listen(8080);

✅ 4.2 SSR та Hybrid Rendering

Найкраще рішення — перейти на Next.js, Nuxt.js або Remix:

  • Next.js (React)
  • Nuxt.js (Vue)
  • Remix (React)

Next.js дозволяє легко комбінувати:

  • SSR (Server-Side Rendering)
  • SSG (Static Site Generation)
  • ISR (Incremental Static Regeneration)

✅ 4.3 Dynamic Rendering

Google рекомендує цей підхід для складних SPA, але не всі кейси вирішуються.

Докладніше від Google:
developers.google.com/...​rendering-with-rendertron

📌 5. Корисні ресурси та посилання

🟢 Висновок

SPA може бути SEO-friendly, якщо ви правильно налаштуєте процеси рендерингу. Google щороку дедалі вимогливіше ставиться до швидкості та стабільності рендерингу сторінок.

Інвестуючи у SSR/SSG або використовуючи pre-rendering, ви отримуєте більш стабільний органічний трафік і менше проблем після чергового Google Core Update.

✨ Напишіть в коментарях, чи стикалися ви з проблемами SEO для SPA, і як ви їх вирішували?

👍ПодобаєтьсяСподобалось7
До обраногоВ обраному5
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Не стикався з проблемами SEO в SPA. Але стикався з тим, що соціальні мережі не обробляють JavaScript. Вони працюють тільки з HTML.

Якщо для вас важливо, щоб Facebook, LinkedIn, Telegram та інші соціальні мережі створювали прев’ю сторінки (назву, опис, зображення) при публікації посилання в них, то варто повноцінно рендерити HTML сторінки на стороні серверу (SSR, SSG).

щоб Facebook, LinkedIn, Telegram та інші соціальні мережі створювали прев’ю сторінки (назву, опис, зображення) при публікації посилання в них, то варто повноцінно рендерити HTML сторінки на стороні серверу (SSR, SSG).

Не обовʼязково.

Якщо виконати ось ці умови:

* ogp.me
* developer.x.com/...​tes/cards/overview/markup

та більшість соцмереж зможе показати назву сторінки, опис та зображення.

Ось приклад зі сторінки, яку ви читаєте зараз:

<meta property="og:title" content="🚀 SEO на SPA: як подружити JavaScript з Google та не втрачати органічний трафік">
<meta property="og:type" content="article">
<meta property="og:url" content="https://dou.ua/forums/topic/53176/">
<meta property="og:site_name" content="DOU">
<meta property="og:image" content="https://s.dou.ua/img/announces/1743516217690.png">

<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@doucommunity">
<meta name="twitter:url" content="https://dou.ua/forums/topic/53176/">
<meta name="twitter:title" content="🚀 SEO на SPA: як подружити JavaScript з Google та не втрачати органічний трафік">
<meta name="twitter:image" content="https://s.dou.ua/img/announces/1743516217690.png">

OG-теги не працюватимуть, якщо вони генеруються на стороні браузера за допомогою JavaScript.

HTML відразу повинен їх містити.

Півроку тому цілеспрямовано тестував це.

Хіба щодо X (Twitter) не знаю — з ним не тестував.

Дивно що людина досі не розуміє що таке яндекс і чому він в пості зайвий

Підписатись на коментарі