Panduan Berikutnya.js SEO
cara membuat sebuah Berikutnya.js situs dapat di-crawl, dapat diindeks, dan rankable — dua routers, rendering modes (SSG/SSR/ISR/server Components), App Router Metadata API, sitemap.ts, robots.ts, berikutnya/image, berikutnya/tautan, dan mistakes itu diam-diam break ini.
Berikutnya.js solves hardest JavaScript SEO masalah oleh default — jika Anda gunakan ini right. App Router's server Components dan SSG/ISR put konten di HTML so ada Tidak render-queue delay; native Metadata API resolves judul, canonicals, dan Open Graph pada server; sitemap.ts dan robots.ts adalah file conventions. kerangka kerja memberikan Anda infrastructure tetapi menulis none dari Anda tags untuk Anda. failures adalah predictable: missing metadataBase, Tidak priority pada LCP image, metadata exported dari sebuah Client Component (silently melakukan tidak ada apa pun), dan 404 views returning 200.
TL;DR — Berikutnya.js adalah satu dari best kerangka kerja untuk SEO ketika Anda gunakan ini right. bangun Anda halaman pada server atau di bangun time (tidak entirely di browser), set sebuah unique judul, deskripsi, dan canonical pada setiap halaman, dan gunakan dibangun-di
next/imagedannext/linkcomponents. Berikutnya.js memberikan Anda semua alat — tetapi ini tidak akan tulis Anda SEO tags untuk Anda.
Apa Berikutnya.js SEO adalah
Berikutnya.js adalah sebuah popular kerangka kerja dibangun pada React untuk membuat situs web dan web apps. Karena ini adalah React di bawah hood, sebuah lot dari halaman dapat menjadi dibangun dengan JavaScript — dan itu’s di mana SEO pertanyaan come di. Berikutnya.js SEO adalah hanya practice dari membuat sure mesin pencari dapat crawl, render, dan indeks sebuah Berikutnya.js situs, dan menggunakan kerangka kerja’s dibangun-di fitur untuk melakukan itu well.
baik news: Berikutnya.js dapat bangun Anda halaman ahead dari time atau pada server, so mesin pencari mendapatkan finished HTML right away. itu menghindari biggest risk dengan JavaScript situs — konten itu hanya menampilkan up setelah scripts jalankan. (untuk lebih luas picture, see JavaScript SEO.)
satu big decision: di mana halaman mendapatkan dibangun
Ketika seseorang — atau Googlebot — menanyakan untuk sebuah halaman, di mana melakukan finished HTML come dari? Berikutnya.js memberikan Anda sebuah sedikit options:
- di bangun time (Static / SSG) — halaman adalah dibangun ke sebuah plain HTML file ahead dari time. Fast, dan mesin pencari mendapatkan semuanya immediately.
- pada server, per permintaan (SSR) — server membangun penuh halaman setiap time. juga penelusuran-friendly, dan selalu fresh.
- sebuah mix (ISR) — static halaman itu refresh pada sebuah timer. sebuah baik default untuk sebagian besar konten.
- di browser (Client-Side / CSR) — server mengirim sebuah near-empty shell dan JavaScript fills ini di. ini adalah risky satu untuk SEO; hindari ini untuk Anda main konten.
modern App Router menggunakan server Components oleh default, yang berarti Anda konten ends up di HTML secara otomatis — sebuah great starting poin untuk SEO.
sederhana checklist
- Memberikan setiap halaman sebuah unique judul dan deskripsi.
- Set sebuah canonical URL pada setiap halaman.
- gunakan
next/imagecomponent untuk images (ini berhenti halaman dari jumping sekitar sebagai images muat, dan membuat them lebih kecil). - gunakan
next/linkuntuk tautan internal (ini membuat nyata tautan Google dapat ikuti). - jangan put Anda main konten behind rendering sisi klien.
- buat sitemap dan sebuah robots.txt (Berikutnya.js memiliki sederhana file-based cara untuk melakukan keduanya). Bukti untuk klaim ini Next.js App Router supports special metadata files for sitemap and robots output. Cakupan: Next.js App Router file conventions. Tingkat keyakinan: tinggi · Diverifikasi: Next.js: Metadata files
hal orang mendapatkan wrong
“Next.js handles SEO automatically.” (terjemahan) “Berikutnya.js menangani SEO secara otomatis.” ini tidak — tidak bagian itu penting. Berikutnya.js memberikan Anda machinery (sebuah metadata sistem, sitemap dan robots conventions, sebuah image component), tetapi Anda masih memiliki untuk tulis Anda judul, deskripsi, dan canonicals yourself. Bukti untuk klaim ini Next.js provides metadata APIs, but developers supply page-specific metadata values. Cakupan: Next.js App Router metadata and generateMetadata APIs. Tingkat keyakinan: tinggi · Diverifikasi: Next.js: Metadata and OG images setiap halaman perlu -nya own. sebuah situs di mana setiap halaman shares satu judul, atau memiliki Tidak canonical, adalah paling umum cara sebuah Berikutnya.js bangun underperforms.
ingin deeper versi — dua routers, Metadata API, metadataBase, LCP
image trick, dan mistakes itu diam-diam break pengindeksan? Switch untuk Advanced
tab.
TL;DR — Berikutnya.js solves hardest JavaScript SEO masalah oleh default ketika Anda gunakan ini right. App Router defaults untuk server Components dan mendukung SSG/SSR/ISR — semua dari yang ship dirender HTML, so ada Tidak render-queue delay. Set metadata dengan native Metadata API (
metadata/generateMetadata), dan remembermetadataBaseatau Anda canonicals dan OG images go relative. gunakanapp/sitemap.tsdanapp/robots.ts, pre-bangun dynamic routes dengangenerateStaticParams, setprioritypada LCP image, dan pertahankan tautan sebagai nyatanext/linkanchors. halaman Router adalah juga SEO-capable melaluinext/head. failures adalah predictable — dan sebagian besar dari them tidak Berikutnya.js’s fault, mereka’re yours.
Di mana Berikutnya.js fits
Berikutnya.js adalah sebuah React kerangka kerja, so semuanya di JavaScript SEO applies. Apa membuat ini worth -nya own guide adalah itu Berikutnya.js ships pertama-class jawaban untuk sebagian besar JS-SEO masalah: server rendering, static generation, sebuah metadata sistem, dan sitemap/robots conventions. hard bagian tidak apakah Google dapat baca ini — Google memiliki dirender JavaScript untuk tahun — ini adalah choosing right rendering mode dan tidak leaving SEO basics unwired. ini adalah sebuah specialized case dari CMS headless SEO: CMS barely penting, frontend’s rendering decisions decide semuanya.
Satu framing untuk pertahankan straight: “ini adalah a Berikutnya.js site” (terjemahan) “ini adalah sebuah Berikutnya.js situs” tidak tell Anda bagaimana apa pun single URL adalah delivered. rendering mode, caching, dan server/Client Component boundaries adalah set per route (sometimes per segment) — sebuah project dapat mix sebuah static marketing halaman, sebuah SSR product halaman, dan sebuah Client Component dashboard. jangan extrapolate satu route’s perilaku untuk “itu seluruh app” (terjemahan) “ seluruh app”; test spesifik URL.
Dua routers, dua sets dari mechanics
Berikutnya.js memiliki dua routers, dan mereka tangani SEO differently:
- halaman Router ( older model) — data fetching melalui
getStaticProps/getServerSideProps; metadata melalui<Head>darinext/head(ataunext-seopackage); Tidak server Components. - App Router (v13+, saat ini dan recommended approach) — React server Components
oleh default; native Metadata API (
metadataexport /generateMetadata); file conventions untukapp/sitemap.tsdanapp/robots.ts;generateStaticParamsuntuk dynamic routes. Bukti untuk klaim ini The App Router uses Server Components and supports generateStaticParams plus metadata file conventions. Cakupan: Current Next.js App Router behavior; route rendering can become dynamic based on APIs used. Tingkat keyakinan: tinggi · Diverifikasi: Next.js: Server and Client Components Next.js: generateStaticParams
Keduanya dapat peringkat well. App Router memberikan Anda sebuah cleaner, integrated metadata sistem (Tidak
next/head juggling) dan server Components out dari box, yang adalah mengapa I’d reach untuk ini
pada sebuah baru bangun. tetapi “App Router atau Anda tidak dapat lakukan SEO” (terjemahan) “App Router atau Anda dapat’t melakukan SEO” adalah sebuah myth — plenty dari halaman Router
situs peringkat fine.
rendering modes dan apa setiap berarti untuk SEO
«How Google handles JavaScript is a three-phase pipeline — crawl, then a deferred render wave, then index. “All pages with a 200 HTTP status code are sent to the rendering queue.” The whole game in Next.js is choosing a mode that puts your content in the HTML before that render wave, so there’s nothing to wait for. Bukti untuk klaim ini Google crawls, renders, and indexes JavaScript pages, and successful pages can enter the rendering queue. Cakupan: Google Search processing, not a promise that a URL will be indexed. Tingkat keyakinan: tinggi · Diverifikasi: Google: JavaScript SEO basics » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian dua puluh tujuh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
- Static situs Generation (SSG) — halaman pre-dirender di bangun time. HTML adalah
immediately tersedia dengan Tidak render-queue risk. Best untuk konten itu tidak perubahan
setiap minute.
generateStaticParams()(App Router) /getStaticPaths()(halaman Router) decides yang dynamic routes mendapatkan pre-dibangun. - Incremental Static Regeneration (ISR) — static halaman itu revalidate setelah sebuah set
interval (
export const revalidate = 3600). crawler mendapatkan static HTML dengan rendah TTFB dan konten tetap fresh. sebuah strong default — dengan satu trap: setelah window expires berikutnya permintaan (possibly Googlebot) masih mendapatkan stale halaman; fresh versi menyajikan pada permintaan setelah itu. untuk genuinely volatile data (prices, stock), SSR adalah safer. - rendering sisi server (SSR) — HTML dirender per permintaan. crawler mendapatkan fully
dirender HTML immediately; tradeoff adalah server latency, so watch TTFB dan LCP.
export const dynamic = 'force-dynamic'atau menggunakan permintaan-time APIs (cookies, headers) opts sebuah route ke SSR. - React server Components (App Router default) — render pada server dan kirim HTML;
Tidak JavaScript ships untuk component itself. konten adalah di awal respons dengan Tidak
hydration kesenjangan. ini adalah best default untuk SEO. Interactivity lives di Client Components
marked
'use client'. - rendering sisi klien (CSR) — dirender entirely di browser. Googlebot dapat indeks
ini setelah render wave (median ~10 seconds, tetapi 90th percentile stretches untuk
hours), dan lainnya crawler — Bingbot, AI bot, social preview bot — dapat mendapatkan sebuah empty
halaman. di App Router, CSR adalah opt-di (
'use client'); di halaman Router, hindari fetching utama konten diuseEffect. jangan gunakan ini untuk konten Anda ingin diperingkatkan.
sebuah reminder I pertahankan coming back untuk: “Googlebot dapat render it” (terjemahan) “Googlebot dapat render ini” adalah tidak yang sama sebagai “Anda seharusnya membuat Googlebot render it.” (terjemahan) “Anda harus membuat Googlebot render ini.” rendering adalah expensive, deferred, dan tidak universal di seluruh crawler.
Metadata API (App Router)
Metadata API adalah server Component hanya — metadata resolves pada server sebelum
halaman renders, so ini lands di awal HTML. Export metadata dari layout.js atau
page.js:
export const metadata: Metadata = {
title: 'My Page',
description: 'Page description',
}atau, ketika tags bergantung pada fetched data, gunakan generateMetadata():
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return { title: post.title, description: post.description }
}fields itu penting untuk SEO:
title— mendukung sebuah string, sebuah template ('%s | Brand'), sebuah default, dan sebuah absolute override. atur template setelah di root layout dan per-halaman judul inherit ini.description,alternates.canonical( correct cara untuk set sebuah canonical di App Router),openGraph(images harus resolve untuk absolute URLs),twitter(juga digunakan oleh LinkedIn dan Slack previews), danrobots(indeks/ikuti plus googleBot-spesifik directives like max-snippet, max-image-preview).metadataBase— diperlukan untuk canonical dan OG image URLs untuk resolve correctly. Forgetting ini adalah single sebagian besar umum Berikutnya.js metadata bug: relative URLs leak ke Anda canonical dan Open Graph tags, breaking social previews dan muddying canonical sinyal.
sebuah judul-template contoh:
// app/layout.tsx
export const metadata: Metadata = {
metadataBase: new URL('https://example.com'),
title: { template: '%s | Brand Name', default: 'Brand Name' },
}
// app/blog/page.tsx
export const metadata: Metadata = { title: 'My Blog Post' }
// Output: <title>My Blog Post | Brand Name</title>Dua gotchas. pertama, metadata adalah shallowly digabungkan dari layout untuk halaman — sebuah nested
object like openGraph didefinisikan di sebuah child segment replaces parent’s entirely, so
sebuah halaman-tingkat openGraph: { title: 'Home' } diam-diam drops apa pun openGraph.images set di
layout. kedua — dan ini satu bites orang — metadata hanya berfungsi di server
Components. Export ini dari sebuah 'use client' file dan ini silently melakukan tidak ada apa pun.
«Streaming metadata. For dynamically rendered pages, generateMetadata can stream the
metadata after the initial HTML. Googlebot executes JavaScript and inspects the full DOM,
so streamed metadata works for Google. But Next.js detects “HTML-limited bots” —
Bingbot, Twitterbot, Slackbot, facebookexternalhit — and ships them blocking
metadata in the <head> instead. Per the Next.js docs, “streaming metadata is disabled
for bots and crawlers that expect metadata to be in the <head> tag.” This is automatic;
no configuration needed. It’s a detail almost no competing guide covers, and it’s why
streaming metadata isn’t a risk for the bots that can’t wait for it. Prerendered pages
are a different case entirely — metadata there resolves at build time, so there’s no
stream to worry about. This behavior is version-specific (current as of Next.js 16.2.10);
re-check the generateMetadata docs when you upgrade. And because delivery paths differ
by entry point, verify metadata two ways, not one: a direct/production request (curl -I
or View Source) and a client-side navigation to the same route — the head can update
differently between the two.
» (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian empat puluh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Metadata dengan berikutnya/head (halaman Router)
pada halaman Router, metadata lives di <Head> dari next/head:
import Head from 'next/head'
export default function Page() {
return (
<>
<Head>
<title>My Page | Brand</title>
<meta name="description" content="Description" />
<link rel="canonical" href="https://example.com/my-page" />
</Head>
{/* page content */}
</>
)
}Set judul dan deskripsi per halaman (tidak hanya di _app.js), dan put sebuah canonical pada
setiap halaman including paginated variants. next-seo package standardizes ini dengan sebuah
<NextSeo> component dan structured-data helpers. Migrating untuk App Router mostly
berarti trading next/head dan next-seo untuk native metadata export.
melakukan Anda perlu next-seo package? ini adalah sebuah ketiga-party plugin (tidak bagian dari Berikutnya.js
itself) — actively maintained, di v7.2,0 sebagai dari ini writing, tidak archived. -nya own docs
adalah jelas tentang di mana ini fits: untuk standard meta tags pada App Router, package’s
README recommends menggunakan Berikutnya.js’s dibangun-di generateMetadata/metadata export alih-alih
<NextSeo>; pada halaman Router, <NextSeo> adalah masih sebuah reasonable convenience layer
di atas next/head. satu App Router gunakan case package masih covers adalah -nya JSON-LD
helper components (ArticleJsonLd, FAQPageJsonLd, dan seterusnya. dengan useAppDir), yang beberapa
tim prefer di atas hand-rolling <script type="application/ld+json">. Bottom line: pada sebuah baru
App Router bangun, reach untuk native Metadata API pertama — package adalah opsional, tidak sebuah
requirement, dan -nya own maintainers say so.
Sitemaps
di App Router, app/sitemap.ts adalah sebuah file convention itu outputs /sitemap.xml:
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
return [
{ url: 'https://acme.com', lastModified: new Date(), priority: 1 },
{ url: 'https://acme.com/blog', lastModified: new Date(), priority: 0.8 },
]
}untuk besar situs, generateSitemaps() shards ke multiple files (Google’s limit adalah
50 000 URLs per sitemap), setiap disajikan di /.../sitemap/[id].xml. sitemap output juga
mendukung image sitemaps, video sitemaps, dan localized alternates.languages. pada
halaman Router, gunakan next-sitemap atau generate pages/sitemap.xml.js dengan
getServerSideProps.
robots.txt
app/robots.ts generates Anda robots file programmatically:
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: '*', allow: '/', disallow: '/private/' }],
sitemap: 'https://acme.com/sitemap.xml',
}
}Per-pengguna-agent aturan dan multiple sitemaps adalah didukung. halaman Router menggunakan sebuah static
public/robots.txt. aturan Anda cannot mendapatkan wrong pada either router: tidak pernah disallow Anda
JavaScript atau CSS — Google tidak akan render dari blocked files, dan pada sebuah JS kerangka kerja itu
dapat blank out halaman entirely.
berikutnya/image dan Core Web Vitals
next/image adalah satu dari strongest alasan untuk gunakan kerangka kerja untuk SEO. ini lazy-memuat
di bawah—fold images, memerlukan width/height (atau fill) so ini reserves space dan
mencegah layout shift / CLS, menyajikan WebP/AVIF secara otomatis, dan emits sebuah proper
srcset dari sizes prop. single sebagian besar penting CWV optimization adalah
priority prop pada Anda hero / di atas—fold image, yang preloads ini untuk sebuah lebih cepat LCP:
<Image src="/hero.jpg" width={1200} height={630} priority alt="Hero" />Forgetting priority pada LCP image adalah paling umum Berikutnya.js CWV mistake — dan CWV
masalah adalah widespread pada nyata Berikutnya.js situs (see Stats tab untuk Salt Agency
data). alt adalah diperlukan: empty untuk decorative images, descriptive untuk konten images.
berikutnya/tautan dan internal linking
next/link renders standard <a href> anchors di HTML, so Google mengikuti them
biasanya, dan ini menambahkan client-side navigation plus background prefetching dari di-viewport
tautan di production. SEO aturan adalah sederhana: gunakan next/link untuk tautan internal, dan tidak pernah
substitute sebuah onClick handler atau JavaScript navigation itu tidak produce sebuah nyata
anchor — itu tautan tidak dapat di-crawl. gunakan prefetch={false} pada rendah-nilai tautan untuk save
bandwidth jika Anda perlu.
Dynamic routes dan generateStaticParams
generateStaticParams() tells Berikutnya.js yang dynamic routes untuk pre-render di bangun time:
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map((post) => ({ slug: post.slug }))
}halaman dibangun ini cara adalah fully static HTML — best untuk SEO. Tanpa ini, dynamic routes adalah
dirender pada-demand (SSR) oleh default, yang adalah fine tetapi reintroduces server latency. Combine
ini dengan revalidate (ISR) untuk konten itu memperbarui regularly. pastikan semua penting
dynamic URLs adalah di generateStaticParams so tidak ada apa pun menunggu pada render queue.
data terstruktur (JSON-LD)
Metadata API memiliki Tidak structured-data field — Anda inject JSON-LD sebagai sebuah <script> di sebuah
server Component, yang mempertahankan ini di server-dirender HTML di zero client-bundle cost:
const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', /* … */ }
return <script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />artikel/BlogPosting, BreadcrumbList, Product, dan FAQPage adalah biasa jenis. Validate dengan Rich hasil Test setelah apa pun rendering perubahan.
umum Berikutnya.js SEO mistakes
Drawn dari nyata audits dan patterns di atas:
- Missing atau relative canonicals — sering dari sebuah forgotten
metadataBase, yang juga breaks OG image URLs. - Tidak
prioritypada LCP image — biggest CWV miss. - 404 views returning
200— gunakan dibangun-dinotFound()untuk mengembalikan nyata status; soft 404s adalah rampant pada Berikutnya.js situs. metadataexported dari sebuah Client Component — silently melakukan tidak ada apa pun; ini adalah server Component hanya.- CSR untuk utama konten — fetching critical konten di
useEffectberarti non-Google crawler mendapatkan empty halaman. - Hash (
#) routing alih-alih History API — itu views tidak secara terpisah dapat di-crawl. - Tidak exporting
generateStaticParams— dynamic routes render pada-demand alih-alih menjadi pre-dibangun. openGraphoverwritten oleh layout inheritance — child segments replace, tidak gabungkan.- Blocking JS/CSS di robots.txt atau melalui sebuah konten Security Policy itu berhenti Googlebot’s headless Chrome dari memuat scripts — test dengan pemeriksaan URL.
Deployment notes
Berikutnya.js adalah dibangun oleh Vercel; hosting di sana memberikan tight integration (edge CDN untuk static dan
ISR halaman, baik TTFB) tetapi tidak diperlukan. Define permanent redirects di redirects() di
next.config.js (mengembalikan 308, atau 301 dengan permanent: true) untuk reliable signaling untuk
crawler, set security dan caching headers melalui headers(), dan gunakan X-Robots-Tag respons
headers untuk path-based noindex aturan ketika per-halaman robots metadata adalah awkward.
Apa untuk periksa di mana. Cache state, kode status, redirects, dan streamed metadata jangan semua tampilkan up di yang sama test — sebuah route dapat look fine di satu periksa dan masih menjadi rusak di lainnya:
| periksa | Di mana untuk look | Mengapa ini dapat differ dari apa Anda see dirender |
|---|---|---|
| Cache/revalidation age | respons headers pada sebuah direct permintaan (curl -I) | ISR dapat sajikan stale halaman pada permintaan right setelah window expires |
| Direct HTTP status | curl -I pada production URL, tidak dirender UI | sebuah “tidak ditemukan” (terjemahan) “tidak ditemukan” view tanpa notFound() masih mengembalikan 200 |
| Redirect perilaku | sebenarnya context itu fires ini — redirect() di sebuah server tindakan, sebuah Route Handler, vs. sebuah client onClick | kode status dan respons path differ oleh invocation context, tidak hanya destination |
| Streamed metadata | Direct permintaan dan client-side navigation untuk yang sama route | Ordinary clients dapat mendapatkan streamed metadata; HTML-limited bot mendapatkan blocking metadata; dua paths tidak identical |
| Client-side transitions | Navigate di-app, lalu re-periksa <head> | sebuah route itu’s correct pada pertama muat dapat drift setelah sebuah client transition |
None dari ini adalah guaranteed oleh kerangka kerja — Berikutnya.js memberikan Anda mechanisms
(redirects(), notFound(), revalidation, streaming), tetapi cache keys, invalidation,
preview state, dan deployment configuration adalah masih Anda responsibility untuk mendapatkan right dan
untuk test di production, tidak hanya locally.
«One last note on dynamic rendering — serving prerendered HTML to bots and JavaScript to users. Google has deprecated it as a recommendation: “dynamic rendering was a workaround and not a long-term solution.” You don’t need it on Next.js anyway — SSR, SSG, ISR, and Server Components all put content in the HTML natively. Mention it so you recognize it in an audit; don’t build on it. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh enam, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
happy path: App Router + server Components + ISR + Metadata API (dengan
metadataBase) + next/image dengan priority. Mendapatkan itu right dan sebagian besar dari Berikutnya.js SEO adalah
handled.
AI summary
sebuah condensed take pada Advanced versi:
- Berikutnya.js solves sebagian besar JS-SEO masalah oleh default — jika Anda pick right rendering mode dan wire up basics. kerangka kerja memberikan Anda infrastructure; ini menulis none dari Anda tags.
- Dua routers: App Router (v13+, recommended) menggunakan server Components dan native
Metadata API; halaman Router menggunakan
next/head/next-seo. Keduanya dapat peringkat. - rendering modes: SSG dan server Components adalah best default (konten di HTML, Tidak render-queue delay). ISR adalah sebuah strong middle ground tetapi memiliki sebuah stale-pada-pertama-permintaan-setelah-revalidation trap. SSR untuk volatile data. CSR adalah risky — non-Google crawler dapat mendapatkan sebuah empty halaman.
- Metadata API (App Router):
metadataexport ataugenerateMetadata(), server Component hanya.metadataBaseadalah diperlukan atau canonicals dan OG images go relative.openGraphdi sebuah child segment replaces parent’s; metadata di sebuah'use client'file melakukan tidak ada apa pun. - Streaming metadata berfungsi untuk Google tetapi Berikutnya.js ships blocking metadata untuk HTML-limited bot (Bingbot, Twitterbot, Slackbot, facebookexternalhit) secara otomatis.
- File conventions:
app/sitemap.ts(dengangenerateSitemaps()untuk 50k+ URLs) danapp/robots.ts. tidak pernah block.js/.css. next/imagemencegah CLS, menyajikan WebP/AVIF; setprioritypada LCP image — top CWV win.next/linkrenders nyata dapat di-crawl<a href>anchors dan prefetches.generateStaticParamspre-membangun dynamic routes; tanpa ini mereka render pada-demand.- JSON-LD adalah injected sebagai sebuah
<script>di sebuah server Component (Tidak Metadata API field). - **
next-seopackage adalah opsional, tidak diperlukan.** ini adalah actively maintained ketiga-party software (v7.2,0, tidak archived), dan -nya own docs merekomendasikan dibangun-digenerateMetadata/metadataexport untuk App Router meta tags —<NextSeo>tetap berguna mainly pada halaman Router, atau untuk -nya JSON-LD helper components. - rendering mode adalah set per route, tidak per project — jangan assume satu URL’s perilaku dari lainnya’s; test spesifik route (direct permintaan dan client navigation keduanya).
- Top mistakes: missing
metadataBase, Tidak LCPpriority, 404s returning200(gunakannotFound()),metadatadi sebuah Client Component, CSR utama konten. - Dynamic rendering adalah deprecated — Anda tidak perlu ini; SSR/SSG/ISR/server Components cover ini.
Dokumentasi resmi
Utama-sumber documentation dari Berikutnya.js dan mesin pencari.
Berikutnya.js
- Metadata dan OG Images — App Router metadata sistem,
metadataBase, dan OG image generation. - generateMetadata API Reference — static
metadatavs.generateMetadata, streaming metadata, dan HTML-limited bot list. - sitemap.xml File Convention —
app/sitemap.ts,generateSitemaps(), image/video/localized sitemaps. - robots.txt File Convention —
app/robots.ts, per-pengguna-agent aturan, dan multiple sitemaps. - Learn: SEO — Berikutnya.js’s own SEO learning path (introductory; partly lebih lama dari App Router).
- memahami JavaScript SEO Basics — crawl → render → indeks pipeline, 200-status rendering queue, soft 404s di SPAs, canonicals, dan History API.
- Dynamic rendering (deprecated workaround) — mengapa Google deprecated ini dan apa untuk gunakan alih-alih (SSR, static rendering, hydration).
- di-Depth Guide untuk Bagaimana Google Search berfungsi — di mana rendering sits di crawl → indeks → sajikan.
Bing / Microsoft
- IndexNow / indexnow.org — push protocol untuk wire untuk sebuah Berikutnya.js publish/revalidation event.
Quotes dari sumber
pada—record statements dari Google, Berikutnya.js, dan Google reps. setiap tautan adalah sebuah deep tautan itu jumps untuk quoted passage pada sumber halaman.
Google — bagaimana JavaScript halaman adalah processed
«- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” — Google Search Central docs. Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian sembilan puluh lima, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Google — dynamic rendering adalah deprecated
«- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” — Google Search Central docs. Jump to quote
- “…creates additional complexities and resource requirements.” — Google Search Central docs. Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian sembilan puluh tujuh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Berikutnya.js — streaming metadata dan HTML-limited bot
«- “Streaming metadata is disabled for bots and crawlers that expect metadata to be in the <head> tag (e.g. Twitterbot, Slackbot, Bingbot).”
— Next.js docs, generateMetadata.
Jump to quote
» (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian sembilan puluh sembilan, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
John Mueller, Google (melalui mesin pencari Journal coverage)
- pada growing role dari JavaScript di SEO: “Anda going untuk jalankan menjadi significantly lebih JavaScript over itu berikutnya tahun daripada di itu 2-ish decades di SEO sebelum. Jika Anda keen pada teknis SEO, lalu past HTML Anda going untuk perlu untuk understand JS lebih dan lebih.” (terjemahan) “Anda’re going untuk jalankan ke significantly lebih JavaScript di atas berikutnya tahun daripada di 2-ish decades di SEO sebelum. jika Anda’re keen pada SEO teknis, lalu past HTML Anda’re going untuk perlu untuk memahami JS lebih dan lebih.” Baca coverage
Berikutnya.js SEO checklist
sebuah quick lulus untuk konfirmasi sebuah Berikutnya.js situs adalah dapat di-crawl, dapat diindeks, dan fast:
- Utama konten renders di HTML pada pertama permintaan (server Components / SSG / SSR / ISR) — tidak hanya setelah client-side JavaScript.
- Tidak penting halaman bergantung pada CSR untuk -nya main konten.
- setiap halaman memiliki sebuah unique judul dan deskripsi (gunakan judul
templatedi root layout). -
metadataBaseadalah set di root layout (App Router) so canonicals dan OG images adalah absolute. - sebuah canonical adalah set per halaman melalui
alternates.canonical(App Router) atau<link rel="canonical">(halaman Router) — tidak sebuah single shared homepage canonical. -
metadataadalah exported hanya dari server Components, tidak pernah sebuah'use client'file. -
generateStaticParamscovers semua penting dynamic routes. -
app/sitemap.ts(ataunext-sitemap) outputs sebuah saat ini sitemap;generateSitemaps()shards situs di atas 50k URLs. -
app/robots.ts/public/robots.txtada dan melakukan tidak block.jsatau.css. - Images gunakan
next/imagedenganwidth/heightataufill; LCP image memilikipriority; semua memilikialt. - tautan internal gunakan
next/link(nyata<a href>) — TidakonClick-hanya navigation. - 404 views panggil
notFound()dan mengembalikan nyata404(Tidak soft 404s). - JSON-LD adalah injected di sebuah server Component
<head>/body dan melewati Rich hasil Test. - Permanent redirects langsung di
redirects()dinext.config.js(308 /permanent).
mental models
1. rendering mode adalah product. sebelum debugging apa pun di sebuah Berikutnya.js situs, jawaban satu pertanyaan: bagaimana adalah ini route dirender? server Components / SSG / SSR / ISR put konten di HTML dan adalah rendah-risk; CSR adalah risky satu. Hampir setiap Berikutnya.js SEO masalah resolves untuk ini.
2. kerangka kerja memberikan infrastructure, tidak konten. Berikutnya.js ships Metadata API, sitemap/robots conventions, dan Image component — tetapi ini menulis none dari Anda judul, deskripsi, canonicals, atau data terstruktur. “Berikutnya.js menangani SEO secara otomatis” (terjemahan) “Berikutnya.js menangani SEO secara otomatis” adalah paling expensive myth di sini.
3. Satu sumber kebenaran untuk URLs.
Set metadataBase setelah dan bangun canonicals, OG images, dan sitemap entries dari ini
(absolute, tidak pernah relative). Satu base URL kills relative-canonical dan rusak-OG-image
class dari bugs.
4. server Components pertama, Client Components hanya di mana needed.
Default untuk server Components so konten dan metadata land di HTML. Reach untuk
'use client' hanya untuk interactivity — dan remember metadata dapat’t come dari sebuah Client
Component.
5. decision aturan untuk rendering. Mostly static (blogs, docs, marketing) → SSG (atau ISR pada sebuah timer). selalu-fresh / volatile (prices, stock) → SSR. perubahan hourly/daily, ingin static speed → ISR (mind stale-pertama-permintaan trap). Interactive, behind sebuah login, tidak terindeks → CSR adalah fine. Publik konten Anda ingin diperingkatkan → tidak pernah CSR.
Berikutnya.js SEO — cheat sheet
rendering modes
| Mode | Di mana HTML adalah dibangun | SEO | Best untuk | Watch out untuk |
|---|---|---|---|---|
| SSG | bangun time → static | ✅ Best | Mostly-static konten | Stale until rebuild |
| server Components | server (App Router default) | ✅ Best | sebagian besar konten | Interactivity perlu Client Components |
| ISR | Static + timed regen | ✅ baik | Hourly/daily konten | pertama permintaan post-revalidation adalah stale |
| SSR | server, per permintaan | ✅ baik | selalu-fresh data | Lebih tinggi TTFB / infra cost |
| CSR | di browser | ⚠️ Risky | Logged-di dashboards | Empty halaman untuk non-Google crawler |
App Router vs halaman Router
| fitur | App Router | halaman Router |
|---|---|---|
| Metadata | metadata / generateMetadata | next/head + next-seo |
| server Components | Default | Tidak tersedia |
| Streaming metadata (bot-aware) | Ya | Tidak |
| Sitemap | app/sitemap.ts | next-sitemap / manual |
| Robots | app/robots.ts | public/robots.txt |
| Canonical | alternates.canonical | <link rel="canonical"> di <Head> |
| data fetching | async server Components | getStaticProps / getServerSideProps |
Fast aturan
- Set
metadataBaseatau canonicals/OG images go relative. metadataadalah server Component hanya —'use client'exports melakukan tidak ada apa pun.- Child-segment
openGraphreplaces parent’s (Tidak gabungkan). prioritypada LCP image = top CWV win.- tautan internal =
next/link(nyata<a href>); TidakonClick-hanya nav. - 404 → panggil
notFound()(nyata404, tidak soft 404). - tidak pernah disallow
.js/.css. - Streaming metadata → blocking untuk Bingbot, Twitterbot, Slackbot, facebookexternalhit.
- Dynamic rendering: deprecated — gunakan SSR / SSG / ISR / server Components.
Quick memeriksa untuk sebuah Berikutnya.js bangun
sebuah sedikit command-line memeriksa sebelum Anda reach untuk sebuah penuh crawler.
adalah Anda konten di mentah HTML (atau hanya setelah JS berjalan)?
macOS / Linux:
# Raw HTML as the server sends it — the "first fetch", before any client JS
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your headline actually in the raw HTML? (empty result = CSR / JS-dependent)
grep -o "Your headline text" raw.html
# Did metadataBase do its job? Canonical and OG URLs should be absolute, not relative
grep -iE 'rel="canonical"|og:(url|image)' raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"
Select-String -Path raw.html -Pattern 'rel="canonical"','og:url','og:image'jika headline adalah missing dari raw.html tetapi menampilkan di Anda browser, itu route adalah
client-dirender. jika canonicals atau OG image URLs come out relative, Anda’ve forgotten
metadataBase.
Konfirmasi Anda tidak blocking JS/CSS (including Berikutnya.js _next directory)
macOS / Linux:
curl -sL https://example.com/robots.txt | \
grep -iE "disallow.*\.(js|css)|Disallow:\s*/_next"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/_next"apa pun match di sini adalah hampir selalu sebuah mistake — Google tidak akan render dari blocked files. sebuah plain
curl dapat’t jalankan JavaScript, so untuk dirender DOM gunakan pemeriksaan URL’s “View Crawled
Halaman → dirender HTML.” (terjemahan) “View di-crawl
halaman → dirender HTML.”
alat untuk auditing sebuah Berikutnya.js situs
- pemeriksaan URL (Google Search Console) — sumber kebenaran. Jalankan sebuah pengujian langsung,
lalu view dirender HTML, screenshot, dan halaman resources (apa dimuat vs.
apa adalah blocked) untuk catch CSR gaps dan blocked
_nextresources. - Rich hasil Test — konfirmasi JSON-LD dibuat ini ke dirender output setelah apa pun rendering perubahan.
- Lighthouse / Chrome DevTools — mengukur LCP, CLS, dan INP; periksa apakah Anda hero
image adalah preloaded (
priority). - Ahrefs situs Audit — melakukan crawl dengan JavaScript rendering, surfacing missing/relative canonicals, rusak metadata, rantai pengalihan, dan indexability issues di seluruh frontend.
- Screaming Frog SEO Spider — crawl dengan JS rendering pada/off untuk diff mentah vs. dirender HTML, dan bangun pre/post crawl comparisons untuk migrations.
- Bing Webmaster alat — Bing’s pemeriksaan URL dan di mana IndexNow submissions muncul.
Mistakes untuk hindari pada Berikutnya.js
Concrete patterns itu diam-diam break SEO pada nyata Berikutnya.js membangun — mencegah ini sebelum mereka ship, alih-alih debugging them setelah sebuah traffic drop.
Shipping tanpa metadataBase di root layout
Mengapa ini adalah wrong: tanpa metadataBase, alternates.canonical dan openGraph.images
resolve untuk relative paths alih-alih absolute URLs. sebuah relative canonical dapat confuse
canonicalization sinyal, dan relative OG image URLs break tautan previews pada social dan
messaging apps.
Apa untuk melakukan alih-alih: set metadataBase: new URL('https://example.com') setelah di
app/layout.tsx dan let setiap halaman inherit ini. periksa ini dengan grep -iE 'rel="canonical"|og:(url|image)' terhadap sebuah mentah HTML fetch — URLs seharusnya mulai dengan https://.
Overwriting sebuah layout’s openGraph dari sebuah child segment
Mengapa ini adalah wrong: metadata merges shallowly dari layout untuk halaman. sebuah halaman-tingkat
openGraph: { title: 'Home' } tidak gabungkan dengan layout’s openGraph.images — ini
replaces seluruh object, silently dropping images.
Apa untuk melakukan alih-alih: either repeat penuh openGraph object (images disertakan) di
setiap tingkat itu overrides ini, atau hanya override spesifik top-tingkat metadata fields Anda
sebenarnya perlu untuk perubahan, dan leave openGraph untouched di mana layout’s default adalah fine.
Exporting metadata dari sebuah Client Component
Mengapa ini adalah wrong: Metadata API adalah server Component hanya. tambahkan 'use client' untuk sebuah file
itu juga exports metadata dan export melakukan tidak ada apa pun — Tidak error, Tidak warning, hanya sebuah
halaman dengan Tidak judul atau deskripsi.
Apa untuk melakukan alih-alih: pertahankan metadata / generateMetadata exports di sebuah plain server
Component file (page.tsx atau layout.tsx tanpa 'use client'). jika sebuah halaman perlu client
interactivity, put itu di sebuah terpisah child component dan import ini — jangan tambahkan
'use client' untuk file itu owns metadata export.
Fetching utama konten di useEffect (atau relying pada penuh CSR)
Mengapa ini adalah wrong: konten dirender hanya di browser tidak di awal HTML. Google akan eventually render ini, tetapi median render delay adalah nyata dan 90th percentile stretches untuk hours — dan non-Google crawler (Bing, social preview bot, sebagian besar AI crawler) sering jangan render JavaScript di semua, so mereka see sebuah empty halaman.
Apa untuk melakukan alih-alih: default untuk server Components, SSG, ISR, atau SSR untuk apa pun Anda
ingin terindeks. Reserve 'use client' dan useEffect data-fetching untuk interactive UI itu
tidak perlu untuk menjadi dapat di-crawl — sebuah filter widget, tidak artikel body.
Returning 200 untuk sebuah “tidak ditemukan” (terjemahan) “tidak ditemukan” view
Mengapa ini adalah wrong: rendering sebuah “tidak ditemukan” (terjemahan) “tidak ditemukan” message tanpa calling notFound() mengembalikan sebuah
wajar 200 status. itu’s sebuah soft 404 — Google dapat indeks empty-konten halaman alih-alih
recognizing ini sebagai missing, dan soft 404s adalah satu dari paling umum dunia nyata Berikutnya.js SEO
masalah.
Apa untuk melakukan alih-alih: panggil dibangun-di notFound() function so route mengembalikan sebuah nyata
404. Konfirmasi dengan curl -I pada sebuah known-missing URL dan periksa kode status secara langsung,
tidak hanya apa renders di browser.
Skipping generateStaticParams pada penting dynamic routes
Mengapa ini adalah wrong: tanpa ini, dynamic routes fall back untuk pada-demand rendering (SSR), yang masih berfungsi untuk SEO tetapi menambahkan server latency untuk setiap pertama permintaan untuk itu URL — including Googlebot’s.
Apa untuk melakukan alih-alih: enumerate URLs itu penting (product halaman, blog posts,
category halaman) di generateStaticParams() so mereka’re pre-dibangun, dan pair ini dengan
revalidate (ISR) untuk konten itu perubahan setelah launch.
Uji pemahaman Anda: Berikutnya.js SEO
Five quick pertanyaan pada membuat sebuah Berikutnya.js situs dapat di-crawl, dapat diindeks, dan fast. Pick sebuah jawaban untuk setiap, lalu periksa.
Resources worth Anda time
My related writing
- JavaScript SEO: sebuah Definitive Guide — my penuh guide untuk rendering, DOM parity, canonicals di JS, sitemaps, dan rendering-mode trade-offs itu Berikutnya.js sits pada top dari. ini Berikutnya.js guide adalah kerangka kerja-spesifik layer pada top dari ini.
- Beginner’s Guide untuk SEO teknis — di mana rendering dan crawling fit di bigger picture.
My speaking
- JavaScript SEO — Ungagged 2019 (SlideShare) — my walkthrough dari bagaimana kerangka kerja terpisah frontend dari backend dan bagaimana Googlebot renders. (Standing disclaimer: dynamic-rendering recommendation di itu deck adalah now outdated — Google deprecated ini.)
dari sekitar industry
- Metadata dan OG Images (Berikutnya.js docs) — App Router metadata sistem,
metadataBase, dan OG image generation. - generateMetadata API Reference (Berikutnya.js docs) — static vs. dynamic metadata dan HTML-limited bot / streaming-metadata perilaku.
- sitemap.xml File Convention (Berikutnya.js docs) —
app/sitemap.ts,generateSitemaps(), dan localized/image sitemaps. - umum SEO Issues pada Berikutnya.js situs web (Salt Agency) — sebuah 50-situs audit study dengan nyata data pada soft 404s dan LCP failures.
- Bagaimana Google Menangani JavaScript Throughout pengindeksan Proses (Vercel) — render-timing data dari nextjs.org’s own server beacons.
- Menyelesaikan Berikutnya.js SEO Guide (Strapi) — sebuah thorough kerangka kerja-walkthrough covering rendering modes, metadata, dan data terstruktur.
- App Router vs halaman Router untuk SEO (Wisp) — sebuah focused perbandingan dari dua routers dari sebuah SEO angle.
- r/TechSEO — community untuk rendering/pengindeksan debugging.
Stats worth citing
- Render timing adalah biasanya fast, occasionally very slow. Vercel’s analysis dari 37 000+ server-beacon pairs pada nextjs.org ditemukan sebuah median render time dari ~10 seconds, tetapi sebuah 90th percentile dari ~3 hours dan sebuah 99th percentile dari ~18 hours — yang adalah persis mengapa Anda tidak ingin utama konten menunggu pada render queue. Sumber
- CWV dan soft 404s adalah widespread pada nyata Berikutnya.js situs. Salt Agency’s audit dari 50
Berikutnya.js situs ditemukan 41/50 returning soft 404s (404 views di sebuah
200status) dan hanya 3/50 passing LCP thresholds — sebuah reminder itu kerangka kerja’s CWV advantages hanya help jika Anda gunakannext/imagedenganprioritydan kembalikan nyata kode status. Sumber
Log perubahan
Diperbarui 18 Jul 2026.
Ringkasan editorial dan detail perubahan yang tercatat.Detail perubahan
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
Perbandingan lengkap tidak tersedia — tidak ada cuplikan sebelumnya yang diarsipkan untuk revisi ini.