Panduan React SEO

React renders client-side oleh default, so crawler see sebuah empty shell until JavaScript berjalan. Di sini's bagaimana Google sebenarnya memproses React apps, yang rendering strategy untuk pick, dan cara perbaiki routing, metadata, dan render-timeout duplicate-konten trap.

Pertama kali diterbitkan: 26 Jun 2026 · Terakhir diperbarui: 3 Agu 2026 · Lanjutan

React adalah tidak buruk untuk SEO — tetapi rendering sisi klien oleh default adalah. Out dari box (CRA, Vite + React), server ships sebuah empty shell dan browser membangun halaman, so crawler see tidak ada apa pun until JavaScript berjalan. Google dapat render React melalui -nya Web rendering Service, tetapi rendering adalah queued, delayed, dan dapat time out — Gary Illyes memiliki ditampilkan render timeouts leaving boilerplate-hanya halaman itu mendapatkan marked sebagai duplicates. AI-crawler rendering contracts vary oleh provider, so CSR-hanya konten menambahkan sebuah coverage risk. perbaiki adalah rendering strategy: SSR atau SSG (sebagian besar easily Berikutnya.js atau Remix) puts konten di awal HTML, hydrated dengan hydrateRoot (tidak createRoot) so server dan client output match persis. lalu gunakan History API routing, nyata <a href> tautan, correct kode status, dan versi-appropriate metadata: React 19 hoists <title>/<meta>/<link> natively, jika tidak react-helmet-async (tidak pernah unmaintained original react-helmet).

TL;DR — React’s SEO masalah tidak React — ini adalah rendering sisi klien oleh default. CRA dan Vite + React ship sebuah empty shell dan bangun DOM di browser, so mentah HTML sebuah crawler fetches memiliki tanpa konten. Google dapat render ini melalui Web rendering Service (evergreen Chromium), tetapi rendering adalah queued secara terpisah, dapat menjadi delayed, dan dapat time out — Gary Illyes memiliki terdokumentasi render timeouts leaving boilerplate-hanya halaman itu lalu mendapatkan flagged sebagai duplicates. Bing renders JS lebih sedikit reliably; AI-crawler rendering varies oleh provider. perbaiki adalah rendering strategy: SSR atau SSG (sebagian besar easily Berikutnya.js atau Remix) puts konten di awal HTML — dan jika Anda’re hydrating server-dirender markup, gunakan hydrateRoot (tidak createRoot) dan treat apa pun server/client mismatch sebagai sebuah bug, tidak sebuah warning untuk suppress. lalu gunakan History API routing (tidak hash URLs) dan nyata <a href> tautan. untuk <head> metadata: React 19 hoists <title>/<meta>/<link> natively; pada React 18 atau untuk advanced perlu, gunakan react-helmet-async (tidak pernah unmaintained original react-helmet). Set correct HTTP kode status. ada Tidak peringkat bonus untuk SSR — ini hanya membuat konten reliably dapat diindeks. untuk umum rendering mechanics, see JavaScript SEO dan headless CMS topics.

Apa sebenarnya membuat React hard untuk SEO

React adalah sebuah component-based JavaScript library, dan out dari box — buat React App, Vite + React — ini berjalan client-side. server mengembalikan sebuah near-empty document (famously hanya sebuah <div id="root"></div>) plus sebuah bundle dari JavaScript, dan browser executes itu JavaScript untuk construct DOM. Contrast itu dengan sebuah server-dirender halaman (WordPress, sebuah Rails app), di mana penuh HTML — konten, heading, tautan — arrives di very pertama respons.

So pertanyaan itu decides semuanya adalah: apa di mentah HTML sebelum apa pun JavaScript berjalan? untuk sebuah default React app, jawaban adalah “hampir tidak ada apa pun.” (terjemahan) “hampir tidak ada apa pun.” Right-click → View Sumber pada sebuah CRA app dan Anda’ll see shell, tidak konten. itu’s persis apa sebuah crawler mendapatkan pada -nya pertama fetch.

untuk menjadi precise tentang di mana responsibility sebenarnya sits: React library tidak CSR-hanya. React DOM ships client rendering (createRoot), server rendering (streaming dan static APIs), dan hydration APIs — library mendukung semua dari ini. empty-shell masalah adalah sebuah property dari default toolchain (buat React App, Vite + React dengan Tidak server), yang wires up hanya client APIs dan tidak ada apa pun itu renders untuk HTML pada server. Tukar toolchain — Berikutnya.js, Remix, atau React’s own server-rendering APIs — dan yang sama library ships penuh HTML pada pertama respons.

ini adalah React-spesifik application dari lebih luas JavaScript SEO masalah — go di sana untuk umum failure modes (parity, interaction, state, timing). Di sini I’ll focus pada apa spesifik untuk React dan cara perbaiki ini.

Bagaimana Google sebenarnya memproses sebuah React app

Google menangani JavaScript di three phases: crawl → render → indeks. Googlebot fetches URL, dirender DOM adalah dibangun kemudian oleh Web rendering Service (WRS) — sebuah evergreen versi dari Chromium, yang sama mesin sebagai Chrome — dan lalu dirender output mendapatkan terindeks dan -nya tautan extracted. Bukti untuk klaim ini Google processes JavaScript pages through crawling, rendering, and indexing using its Web Rendering Service. Cakupan: Google Search rendering behavior. Tingkat keyakinan: tinggi · Diverifikasi: Google: JavaScript SEO basics

penting nuance adalah ketika rendering happens. rendering adalah resource-intensive, so ini adalah queued secara terpisah dari awal crawl. Martin Splitt described flow plainly: “we lakukan an HTTP request, dan we mendapatkan sesuatu back … some barebone HTML dan all it melakukan adalah load itu JavaScript dan jalankan itu JavaScript. Lalu, ini HTML … goes menjadi rendering. Rendering berjalan JavaScript — boom!, a lot dari konten happens itu tidak di sana sebelum.” (terjemahan) “kami melakukan sebuah HTTP permintaan, dan kami mendapatkan sesuatu back … beberapa barebone HTML dan semua ini melakukan adalah muat JavaScript dan jalankan JavaScript. lalu, ini HTML … goes ke rendering. rendering berjalan JavaScript — boom!, sebuah lot dari konten happens itu tidak di sana sebelum.” untuk sebuah CSR React halaman, ** “boom” (terjemahan) “boom” adalah Anda entire halaman** — none dari ini ada until itu render langkah berjalan.

sebuah caveat worth carrying: jangan di atas-indeks pada old “dua waves dari indexing” (terjemahan) “dua waves dari pengindeksan” model. Splitt himself walked ini back, calling wave “an oversimplification.” (terjemahan) “sebuah oversimplification.” practical takeaway tidak “ada a formal Wave 2 dengan didefinisikan timing” (terjemahan) “ada sebuah formal Wave 2 dengan didefinisikan timing” — ini adalah itu rendering adalah sebuah distinct, deferrable, fallible langkah, dan CSR puts 100% dari Anda konten pada wrong side dari ini.

Dua lebih facts tentang renderer itu bite React apps secara khusus:

  • ini adalah stateless. Googlebot melakukan tidak retain localStorage, sessionStorage, atau cookies antara halaman memuat. apa pun konten atau routing itu bergantung pada client-side state adalah invisible untuk crawler.
  • ini dapat memberikan up. renderer enforces sebuah timeout. jika Anda main konten memuat slowly — besar bundles, waterfalls dari API panggilan — rendering dapat finish sebelum Anda konten arrives, dan Google indeks incomplete halaman.

render-timeout trap (dan mengapa ini membuat duplicates)

«This failure mode is rarely explained well, and it’s the most damaging one for React apps. Gary Illyes described it directly: “I have a bunch of emails in my inbox where the issue is that the centerpiece took forever to load, so rendering timed out … and we were left with a bunch of pages that only had the boilerplate. With only the boilerplate, those pages are dups.” » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh tiga, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

Walk melalui apa itu berarti untuk sebuah CSR React app. Anda header, nav, dan footer adalah boilerplate itu memuat fast. Anda sebenarnya halaman konten — bagian itu membuat setiap URL unique — adalah fetched dan dirender oleh JavaScript, dan ini memuat slowly. rendering times out. Google adalah left dengan header + nav + footer pada setiap URL. Now setiap halaman looks identical, dan Google marks them sebagai duplicates dari setiap lainnya di Search Console.

«Illyes’s own fix is the actionable bit: “Try to restructure the js calls such that the content (including marginal boilerplate) loads first and see if that helps.” But the more durable answer is to not depend on the render step for your main content at all — which means SSR or SSG. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh lima, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

rendering strategies untuk React

ini adalah single sebagian besar impactful decision. options, roughly worst untuk best untuk SEO:

  • CSR (default React). server mengirim shell; browser membangun semuanya. konten adalah delayed oleh render queue dan exposed untuk timeout. Worst untuk SEO. Fine untuk authenticated dashboards Anda tidak ingin terindeks anyway.
Bukti untuk klaim ini Client-only React rendering constructs UI in the browser; server rendering APIs produce HTML before browser hydration. Cakupan: React rendering mechanics; SEO impact depends on what the initial response contains. Tingkat keyakinan: tinggi · Diverifikasi: React: hydrateRoot React: Server APIs
  • Pre-rendering. bangun-time rendering tanpa sebuah penuh SSR kerangka kerja — alat like react-snap atau sebuah prerender service crawl Anda app dan save static HTML. Lebih ringan-weight; berfungsi untuk simpler, mostly-static situs.
  • SSG (Static situs Generation). HTML dibangun setelah di deploy time dan disajikan sebagai static files. Fastest, konten selalu present di mentah HTML. Limited untuk highly dynamic atau per-pengguna konten; besar situs mendapatkan slow membangun.
  • SSR (rendering sisi server). server executes React per permintaan dan mengirim penuh HTML. konten immediately tersedia untuk crawler; selalu fresh. Costs sebuah Node.js server dan slightly lebih tinggi TTFB.
  • Hybrid / ISR (Incremental Static Regeneration). sebuah Berikutnya.js fitur itu regenerates static halaman di background — static speed dengan periodic freshness.
Strategykonten di awal HTML?SEO riskBest untuk
CSR (mentah React)TidakHighestLogged-di dashboards, tidak-terindeks apps
Pre-renderingYa (bangun time)rendahkecil, mostly-static situs
SSGYa (bangun time)LowestBlogs, docs, marketing
SSRYa (per permintaan)rendahFresh, dynamic konten
ISR / hybridYarendahkonten itu perubahan hourly/daily

«And one strategy to skip on new builds: dynamic rendering — detecting the crawler user-agent and serving it a pre-rendered version while users get CSR. Google now calls it “a workaround and not a long-term solution” that “creates additional complexities and resource requirements,” and recommends server-side rendering, static rendering, or hydration instead. (Bing recommended dynamic rendering back in 2018, but that guidance is dated — since 2019 Bingbot renders via Microsoft Edge / Chromium, and SSR/SSG is the right call there too.) » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian empat puluh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

ada sebuah myth worth killing di sini: SSR adalah tidak sebuah peringkat boost. sebagai John Mueller put ini, “there are no SEO ranking bonuses for implementing it one way or another” (terjemahan) “tidak ada SEO peringkat bonuses untuk implementing ini satu cara atau lainnya” — berbeda rendering metode adalah “just different ways of making the content indexable.” (terjemahan) “hanya berbeda cara dari membuat konten dapat diindeks.” SSR’s nilai adalah reliable indexability (dan sering better Core Web Vitals dari sebuah lebih cepat pertama Contentful Paint), tidak sebuah magic peringkat lever.

Hydration harus match persis — itu’s sebuah bug boundary, tidak sebuah SEO technique

SSR dan SSG keduanya hand browser HTML itu sudah memiliki Anda konten di ini. React lalu memiliki untuk attach untuk itu markup pada client, dan itu’s sebuah berbeda API dari sebuah plain client render:

  • createRoot renders React ke sebuah DOM node dari scratch — Tidak existing markup yang diharapkan. gunakan ini untuk CSR-hanya apps.
  • hydrateRoot attaches React untuk HTML itu react-dom/server sudah generated, dan expects client’s pertama render untuk produce output identical untuk apa server dikirim. jika Anda’re SSR/SSG, Anda ingin hydrateRoot, tidak createRoot — calling createRoot pada server-dirender markup berarti React discards ini dan re-renders dari scratch, throwing away tepat SEO benefit Anda siapkan SSR/SSG untuk mendapatkan.
Bukti untuk klaim ini hydrateRoot attaches React to HTML previously generated by React on the server; the initial client output should match the server output. Cakupan: hydration Tingkat keyakinan: tinggi · Diverifikasi: hydrateRoot

Mismatches antara server dan client output adalah sebuah nyata risk di React apps melakukan SEO memperbaiki — sebuah Date.now() di sebuah judul, sebuah locale-dependent format, sebuah if (typeof window !== 'undefined') branch. React’s own docs adalah blunt tentang apa happens lalu: ini warns tentang mismatches di development, tetapi “there are no guarantees that attribute differences will be patched up in case of mismatches.” (terjemahan) “tidak ada jaminan itu attribute differences akan menjadi patched up di case dari mismatches.” guidance adalah untuk treat mismatches sebagai bugs dan perbaiki them — tidak untuk suppress warning dan assume konten parity. untuk SEO secara khusus: jangan assume Anda dirender konten dan metadata match apa server dikirim hanya karena halaman looks right di browser. Diff server HTML terhadap post-hydration DOM secara langsung ( View Sumber vs. Inspect Element periksa dari testing bagian di bawah adalah fast versi dari ini) alih-alih trusting sebuah bersih console.

React Router dan struktur URL

React Router menangani navigation di browser tanpa server round-trips, yang adalah fine untuk SEO jika configured correctly:

  • gunakan History API, tidak hash routing. BrowserRouter menggunakan pushState dan produces bersih, dapat di-crawl URLs (/products). HashRouter produces /#/products, dan Google cannot reliably resolve hash-based URLs — old AJAX-crawling scheme itu dibuat them berfungsi adalah deprecated. gunakan History API.
  • ** server harus tangani itu URLs too.** dengan History API routing, setiap “halaman” (terjemahan) “halaman” perlu sebuah nyata URL server dapat respond untuk — critical untuk SSR, dan necessary so sebuah direct hit atau refresh pada /products tidak 404.
  • <Link> renders sebuah nyata anchor. React Router’s <Link> component outputs sebuah <a href>, yang adalah dapat di-crawl. Navigation dibangun pada onClick handlers tanpa sebuah anchor adalah tidak dapat di-crawl — Google hanya mengikuti nyata <a href> tautan.

Managing metadata: react-helmet, react-helmet-async, dan React 19’s native tags

melalui React 18, React tidak pernah diperbarui document <head> pada route perubahan natively — setiap route’s <title>, deskripsi meta, canonical, dan Open Graph / Twitter tags memiliki untuk menjadi set oleh sebuah library. React 19 changed itu: components dapat render <title>, <meta>, dan <link> tags secara langsung, dan React hoists them untuk <head> pada -nya own — berfungsi dengan client-hanya apps, streaming SSR, dan server Components alike. React 19.2 adalah saat ini stable rilis sebagai dari pertengahan 2026, so ini now applies untuk apa pun app pada sebuah saat ini React versi.

itu berarti right jawaban bergantung pada Anda React versi dan apa Anda sebenarnya perlu:

  • React 19, standalone app, hanya basic tags. Render <title>/<meta>/<link> di Anda components secara langsung — Tidak library needed.
  • React 19, tetapi Anda perlu htmlAttributes/bodyAttributes, SSR context serialization, onChangeClientState, prioritizeSeoTags, atau titleTemplate. Native hoisting tidak cover ini — gunakan react-helmet-async. -nya own docs panggil ini out secara langsung: tanpa itu spesifik perlu, Anda dapat tidak perlu package di semua pada React 19.
  • React 18 atau sebelumnya, standalone app. Native hoisting tidak exist namun — gunakan react-helmet-async. ini adalah actively maintained (major versi 3, dan ini detects Anda React versi di runtime) dan mendukung SSR.
  • ** original react-helmet.** jangan gunakan ini, pada apa pun React versi. ini adalah unmaintained — Tidak rilis since 2020 — dan memiliki known bugs di bawah React 18’s concurrent rendering.
  • Berikutnya.js apps. gunakan Berikutnya’s own Metadata API ( metadata export / generateMetadata di App Router) regardless dari React versi — jangan bolt pada Helmet, dan jangan rely pada native React tag hoisting either. kerangka kerja owns document di sebuah Berikutnya.js app.

Satu reliability aturan carries di atas dari JavaScript SEO umumnya, dan applies Tidak penting yang dari di atas Anda gunakan: HTML-tingkat metadata beats JS-injected metadata. sebuah canonical tag injected oleh client-side JavaScript adalah far lebih sedikit reliable daripada satu present di server-dirender HTML — yang adalah lainnya argument untuk SSR/SSG.

AI crawler membuat ini urgent

2026 wrinkle: rendering perilaku untuk GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, dan lainnya agents adalah provider- dan versi-spesifik. sebuah CSR React app ships setiap crawler yang sama empty shell pertama Googlebot fetch sees, dan saat ini provider documentation melakukan tidak establish satu shared render langkah itu akan fill ini di. sebagai generative mesin become sebuah bigger penemuan surface, SSR/SSG berhenti menjadi sebuah Google-hanya concern: mentah HTML maximizes coverage tanpa assuming sebuah universal crawler limitation. ( CMS headless topic covers ini AI-crawler reality di lebih depth.)

Testing apa Google sebenarnya sees

jangan trust Anda browser — Anda DevTools Inspector menampilkan dirender DOM (post-JavaScript), yang adalah persis apa sebuah crawler-tanpa-JS melakukan tidak see. gunakan right alat:

«- View Source vs. Inspect Element. View Source is the raw HTML (what crawlers get before JS). Inspect Element is the rendered DOM. If content is in Inspect but missing from View Source, it’s JavaScript-dependent.

  • URL Inspection Tool (Search Console) — the most authoritative check. Run a live test and look at the rendered HTML, the screenshot, and the page resources / console messages to see what Google actually rendered and what failed to load.
  • Rich Results Test — a quick rendered-HTML check without verifying the site.
  • Disable JavaScript in DevTools and reload — a fast simulation of a crawler that doesn’t execute JS (and a decent proxy for what AI crawlers see).
  • Search Console Coverage report — “Discovered, currently not indexed” can signal a render queue backlog; clusters of duplicate pages can signal the render-timeout boilerplate trap.
  • JS-rendering crawlers — Ahrefs Site Audit and Screaming Frog (JS-rendering mode) render pages at scale so you can diff raw vs. rendered across the whole site. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian lima puluh delapan, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

Berikutnya.js dan Remix ( practical jawaban)

jika SEO penting dan Anda’re pada mentah CSR React, migrating untuk sebuah kerangka kerja itu renders pada server adalah biasanya right move. Berikutnya.js adalah purpose-dibangun untuk ini — SSR dan SSG out dari box, ISR, App Router, sebuah dibangun-di Metadata API, automatic code splitting, dan image optimization. Remix adalah web-standards alternative, dibangun pada fetch/permintaan/respons dengan SSR oleh default dan sebuah strong progressive-enhancement story. Berikutnya.js mendapatkan -nya own deep dive — I’m mempertahankan ini brief di sini pada purpose. poin untuk React SEO adalah lebih sempit: kerangka kerja ada untuk move Anda konten out dari browser-hanya render langkah dan ke awal HTML.

React adalah baik untuk SEO ketika Anda treat rendering sebagai sebuah architecture decision alih-alih sebuah afterthought. Pick SSR atau SSG untuk apa pun itu perlu untuk peringkat, pertahankan tautan dan routing honest, manage metadata per route, dan let Google’s own alat — tidak Anda browser — tell Anda apa sebenarnya dirender.

Tambahkan catatan pakar

Sematkan kutipan pakar

Orang baru? Buat profilnya yang belum diklaim di /admin/experts/ → Sematkan kutipan pakar terlebih dahulu.