Tiếp theo.js SEO
Cách làm một Tiếp theo.js site crawlable, indexable, và rankable — đó hai routers, kết xuất modes (SSG/SSR/ISR/Máy chủ Components), đó App Router Metadata API, sitemap.ts, robots.ts, tiếp theo/image, tiếp theo/link, và đó mistakes đó âm thầm break điều này.
Ngôn ngữ
Tiếp theo.js solves đó hardest JavaScript SEO các vấn đề theo mặc định — nếu bạn dùng điều này right. Đó App Router Máy chủ Components và SSG/ISR put nội dung trong đó HTML so có không render-queue delay; đó native Metadata API resolves các tiêu đề, canonicals, và Open Graph on đó máy chủ; sitemap.ts và robots.ts là file conventions. Đó framework cho bạn đó infrastructure nhưng ghi none of của bạn tags cho bạn. Đó failures là dễ dự đoán: bị thiếu metadataBase, không priority on đó LCP image, metadata exported từ một Client Component (silently làm không có gì), và 404 views returning 200.
Tóm tắt — tiếp theo.js là một của best các framework Đối với SEO Khi bạn sử dụng nó right. Xây dựng của bạn các trang on máy chủ hoặc tại xây dựng time (không hoàn toàn trong trình duyệt), đặt unique tiêu đề, mô tả, và canonical on mỗi trang, và sử dụng được xây dựng-trong
next/imagevànext/linkcomponents. tiếp theo.js cho bạn all tools — nhưng nó sẽ không ghi của bạn SEO tags cho bạn.
Điều gì tiếp theo.js SEO là
tiếp theo.js là popular framework được xây dựng on React cho đang làm websites và web apps. vì nó React dưới hood, lot của trang có thể là được xây dựng với JavaScript — và đó nơi SEO các câu hỏi come trong. tiếp theo.js SEO là chỉ practice của đang làm sure các công cụ tìm kiếm có thể crawl, render, và chỉ mục tiếp theo.js trang web, và sử dụng framework được xây dựng-trong features để làm đó well.
good news: tiếp theo.js có thể xây dựng của bạn các trang ahead của time hoặc on máy chủ, so các công cụ tìm kiếm nhận finished HTML right away. đó tránh biggest risk với JavaScript các trang — nội dung đó chỉ hiển thị lên sau khi scripts chạy. (cho rộng hơn picture, see JavaScript SEO.)
một big decision: nơi trang nhận được xây dựng
Khi ai đó — hoặc Googlebot — asks Đối với một trang, nơi làm finished HTML come từ? tiếp theo.js cho bạn một vài options:
- Tại xây dựng time (Static / SSG) — trang là được xây dựng vào đơn giản HTML file ahead của time. Fast, và các công cụ tìm kiếm nhận mọi thứ immediately.
- On máy chủ, theo yêu cầu (SSR) — máy chủ xây dựng đầy đủ trang mỗi time. cũng tìm kiếm-friendly, và luôn fresh.
- ** mix (ISR)** — static các trang đó refresh on timer. good default cho phần lớn nội dung.
- Trong trình duyệt (Client-Side / CSR) — máy chủ gửi near-rỗng shell và JavaScript fills nó trong. Đây là risky một Đối với SEO; tránh nó cho của bạn main nội dung.
modern App Router dùng máy chủ Components theo mặc định, mà có nghĩ là của bạn nội dung ends lên trong HTML tự động — great starting point Đối với SEO.
đơn giản checklist
- Cho mỗi trang unique tiêu đề và mô tả.
- đặt canonical URL on mỗi trang.
- sử dụng
next/imagecomponent cho images (nó dừng trang từ jumping khoảng as images load, và làm them nhỏ hơn). - sử dụng
next/linkcho liên kết nội bộ (nó tạo thực links Google có thể follow). - không put của bạn main nội dung behind client-side kết xuất.
- Tạo sitemap và robots.txt (tiếp theo.js có đơn giản file-based ways để làm cả hai). Evidence for this claim Next.js App Router supports special metadata files for sitemap and robots output. Scope: Next.js App Router file conventions. Confidence: high · Verified: Next.js: Metadata files
điều mọi người nhận sai
“Next.js handles SEO automatically.” (bản dịch) «Tiếp theo.js xử lý SEO tự động.» Điều này không — không đó parts đó quan trọng. Tiếp theo.js cho bạn đó machinery (một metadata hệ thống, sitemap và robots conventions, an image component), nhưng bạn vẫn có để ghi của bạn các tiêu đề, các mô tả, và canonicals yourself. Evidence for this claim Next.js provides metadata APIs, but developers supply page-specific metadata values. Scope: Next.js App Router metadata and generateMetadata APIs. Confidence: high · Verified: Next.js: Metadata and OG images Mỗi trang cần của nó own. MỘT site nơi mỗi trang chia sẻ một tiêu đề, hoặc có không canonical, là đó hầu hết phổ biến way một Tiếp theo.js xây dựng underperforms.
Muốn deeper version — hai routers, Metadata API, metadataBase, LCP
image trick, và mistakes đó âm thầm break lập chỉ mục? Chuyển để Nâng cao
tab.
Tóm tắt — tiếp theo.js solves hardest JavaScript SEO các vấn đề theo mặc định Khi bạn sử dụng nó right. App Router defaults để máy chủ Components và hỗ trợ SSG/SSR/ISR — tất cả mà ship được kết xuất HTML, so có không render-queue delay. đặt metadata với native Metadata API (
metadata/generateMetadata), và remembermetadataBasehoặc của bạn canonicals và OG images go relative. sử dụngapp/sitemap.tsvàapp/robots.ts, pre-xây dựng dynamic routes vớigenerateStaticParams, đặtpriorityon LCP image, và giữ links as thựcnext/linkanchors. các trang Router là cũng SEO-capable quanext/head. failures là dễ dự đoán — và phần lớn của them không phải tiếp theo.js fault, họ’re yours.
nơi tiếp theo.js fits
tiếp theo.js là React framework, so mọi thứ trong JavaScript SEO áp dụng. Điều gì làm nó worth của nó own hướng dẫn là đó tiếp theo.js ships đầu tiên-class các câu trả lời để phần lớn JS-SEO các vấn đề: máy chủ kết xuất, static generation, metadata hệ thống, và sitemap/robots conventions. hard part không phải liệu Google có thể đọc nó — Google có được kết xuất JavaScript cho năm — nó chọn right kết xuất chế độ và không leaving SEO basics unwired. Đây là specialized case của headless CMS SEO: CMS barely matters, frontend kết xuất decisions quyết định mọi thứ.
Một cách diễn đạt để giữ straight: “this is a Next.js site” (bản dịch) «này là một Tiếp theo.js site» không tell bạn cách bất kỳ single URL là delivered. Kết xuất chế độ, bộ nhớ đệm, và Máy chủ/Client Component boundaries là set theo route (sometimes theo segment) — một project có thể mix một static marketing trang, an SSR sản phẩm trang, và một Client Component dashboard. không extrapolate một route behavior để “the whole app” (bản dịch) «đó toàn bộ app»; kiểm thử đó cụ thể URL.
Hai routers, hai sets của mechanics
tiếp theo.js có hai routers, và họ xử lý SEO differently:
- các trang Router ( older model) — dữ liệu fetching qua
getStaticProps/getServerSideProps; metadata qua<Head>từnext/head(hoặcnext-seopackage); không máy chủ Components. - App Router (v13+, hiện tại và được khuyến nghị approach) — React máy chủ Components
theo mặc định; native Metadata API (
metadataexport /generateMetadata); file conventions choapp/sitemap.tsvàapp/robots.ts;generateStaticParamscho dynamic routes. Evidence for this claim The App Router uses Server Components and supports generateStaticParams plus metadata file conventions. Scope: Current Next.js App Router behavior; route rendering can become dynamic based on APIs used. Confidence: high · Verified: Next.js: Server and Client Components Next.js: generateStaticParams
Cả hai có thể xếp hạng well. Đó App Router cho bạn một cleaner, integrated metadata hệ thống (không
next/head juggling) và Máy chủ Components out of đó box, mà là vì sao I’d reach cho điều này
on một new xây dựng. Nhưng “App Router or you can’t do SEO” (bản dịch) «App Router hoặc bạn không thể làm SEO» là một myth — plenty of Các trang Router
các trang xếp hạng fine.
Kết xuất modes và Điều gì mỗi có nghĩ là Đối với SEO
Cách Google xử lý JavaScript là một three-phase pipeline — crawl, thì một deferred render wave, thì chỉ mục. “All pages with a 200 HTTP status code are sent to the rendering queue.” (bản dịch) «All các trang với một 200 HTTP mã trạng thái là đã gửi để đó kết xuất queue.» Đó toàn bộ game trong Tiếp theo.js là chọn một chế độ đó diễn đạt nội dung của bạn trong đó HTML trước đó render wave, so có không có gì để chờ cho. Evidence for this claim Google crawls, renders, and indexes JavaScript pages, and successful pages can enter the rendering queue. Scope: Google Search processing, not a promise that a URL will be indexed. Confidence: high · Verified: Google: JavaScript SEO basics
- Static trang web Generation (SSG) — các trang pre-được kết xuất tại xây dựng time. HTML là
immediately khả dụng với không render-queue risk. Best cho nội dung đó không thay đổi
mỗi minute.
generateStaticParams()(App Router) /getStaticPaths()(các trang Router) decides mà dynamic routes nhận pre-được xây dựng. - Incremental Static Regeneration (ISR) — static các trang đó revalidate sau khi đặt
interval (
export const revalidate = 3600). Các crawler nhận static HTML với thấp TTFB và nội dung vẫn giữ fresh. mạnh default — với một trap: sau khi window expires tiếp theo yêu cầu (possibly Googlebot) vẫn nhận stale trang; fresh version phục vụ on yêu cầu sau khi đó. cho genuinely volatile dữ liệu (prices, stock), SSR là safer. - máy chủ-Side Kết xuất (SSR) — HTML được kết xuất theo yêu cầu. Các crawler nhận fully
được kết xuất HTML immediately; tradeoff là máy chủ latency, so watch TTFB và LCP.
export const dynamic = 'force-dynamic'hoặc sử dụng yêu cầu-time APIs (cookies, các header) opts route vào SSR. - React máy chủ Components (App Router default) — render on máy chủ và gửi HTML;
không JavaScript ships cho component itself. nội dung là trong ban đầu phản hồi với không
hydration khoảng trống. Đây là best default Đối với SEO. Interactivity lives trong Client Components
marked
'use client'. - Client-Side Kết xuất (CSR) — được kết xuất hoàn toàn trong trình duyệt. Googlebot có thể chỉ mục
nó sau khi render wave (median ~10 seconds, nhưng 90th percentile stretches để
hours), và khác các crawler — Bingbot, AI bots, social preview bots — có thể nhận rỗng
trang. Trong App Router, CSR là opt-trong (
'use client'); trong các trang Router, tránh fetching chính nội dung tronguseEffect. không sử dụng nó cho nội dung bạn muốn được xếp hạng.
MỘT reminder I giữ coming lại để: “Googlebot can render it” (bản dịch) «Googlebot có thể render điều này» không phải đó giống nhau as “you should make Googlebot render it.” (bản dịch) «bạn nên làm Googlebot render điều này.» Kết xuất là expensive, deferred, và không universal trên các crawler.
Metadata API (App Router)
Metadata API là máy chủ Component chỉ — metadata resolves on máy chủ trước khi
trang renders, so nó lands trong ban đầu HTML. Export metadata từ layout.js hoặc
page.js:
export const metadata: Metadata = {
title: 'My Page',
description: 'Page description',
}hoặc, Khi tags phụ thuộc on fetched dữ liệu, sử dụng generateMetadata():
export async function generateMetadata({ params }) {
const post = await getPost(params.slug)
return { title: post.title, description: post.description }
}các trường đó quan trọng Đối với SEO:
title— hỗ trợ string, template ('%s | Brand'), default, và absolute override. đặt template sau khi trong root layout và theo-trang các tiêu đề inherit nó.description,alternates.canonical( đúng way để đặt canonical trong App Router),openGraph(images phải resolve để absolute các URL),twitter(cũng được sử dụng by LinkedIn và Slack previews), vàrobots(chỉ mục/follow plus Googlebot-cụ thể directives như max-snippet, max-image-preview).metadataBase— bắt buộc cho canonical và OG image các URL để resolve correctly. Forgetting nó là single phần lớn phổ biến tiếp theo.js metadata bug: relative các URL leak vào của bạn canonical và Open Graph tags, breaking social previews và muddying canonical các tín hiệu.
tiêu đề-template ví dụ:
// 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>Hai gotchas. đầu tiên, metadata là shallowly đã hợp nhất từ layout để trang — nested
object như openGraph được định nghĩa trong child segment replaces parent hoàn toàn, so
trang-cấp độ openGraph: { title: 'Home' } âm thầm drops bất kỳ openGraph.images đặt trong
layout. thứ hai — và điều này một bites mọi người — metadata chỉ hoạt động trong máy chủ
Components. Export nó từ 'use client' file và nó silently làm không có gì.
Streaming metadata. Cho dynamically được kết xuất các trang, generateMetadata có thể stream đó
metadata sau đó ban đầu HTML. Googlebot executes JavaScript và inspects đó đầy đủ DOM,
so streamed metadata hoạt động cho Google. Nhưng Tiếp theo.js detects “HTML-limited bots” (bản dịch) «HTML-limited bots» —
Bingbot, Twitterbot, Slackbot, facebookexternalhit — và ships them blocking
metadata trong đó <head> thay vì. Theo đó Tiếp theo.js tài liệu, “streaming metadata is disabled
for bots and crawlers that expect metadata to be in the <head> tag.” (bản dịch) «streaming metadata là disabled cho bots và các crawler đó expect metadata để là trong đó thẻ head tag.» Này là tự động;
không configuration needed. đây là một detail gần như không competing hướng dẫn covers, và đây là vì sao
streaming metadata không một risk cho đó bots đó không thể chờ cho điều này. Prerendered các trang
là một khác nhau case hoàn toàn — metadata ở đó resolves tại xây dựng time, so có không
stream để worry về. Này behavior là version-cụ thể (hiện tại as of Tiếp theo.js 16.2.10);
re-kiểm tra đó generateMetadata tài liệu khi bạn upgrade. Và vì phân phối paths differ
by entry point, verify metadata hai ways, không một: một trực tiếp/production yêu cầu (curl -I
hoặc View Nguồn) và một client-side navigation để đó giống nhau route — đó head có thể cập nhật
differently giữa đó hai.
Metadata với tiếp theo/head (các trang Router)
On các trang Router, metadata lives trong <Head> từ 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 */}
</>
)
}đặt tiêu đề và mô tả theo trang (không chỉ trong _app.js), và put canonical on
mỗi trang including paginated variants. next-seo package standardizes điều này với
<NextSeo> component và structured-dữ liệu helpers. Migrating để App Router mostly
có nghĩ là trading next/head và next-seo cho native metadata export.
Làm bạn cần next-seo package? nó thứ ba-party plugin (không part của tiếp theo.js
itself) — actively maintained, tại v7.2,0 as của điều này writing, không archived. Của nó own tài liệu
là rõ ràng về nơi nó fits: cho tiêu chuẩn meta tags on App Router, package
README khuyến nghị sử dụng tiếp theo.js được xây dựng-trong generateMetadata/metadata export thay vì
<NextSeo>; on các trang Router, <NextSeo> là vẫn reasonable convenience layer
over next/head. một App Router sử dụng case package vẫn covers là của nó JSON-LD
helper components (ArticleJsonLd, FAQPageJsonLd, etc. với useAppDir), mà some
nhóm ưu tiên over hand-rolling <script type="application/ld+json">. Bottom line: on new
App Router xây dựng, reach cho native Metadata API đầu tiên — package là tùy chọn, không
requirement, và của nó own maintainers chẳng hạn so.
Sitemaps
Trong App Router, app/sitemap.ts là file convention đó 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 },
]
}cho lớn các trang, generateSitemaps() shards vào multiple files (Google limit là
50 000 các URL theo sitemap), mỗi phân phối tại /.../sitemap/[id].xml. sitemap output cũng
hỗ trợ image sitemaps, video sitemaps, và localized alternates.languages. On
các trang Router, sử dụng next-sitemap hoặc generate pages/sitemap.xml.js với
getServerSideProps.
robots.txt
app/robots.ts generates của bạn robots file programmatically:
export default function robots(): MetadataRoute.Robots {
return {
rules: [{ userAgent: '*', allow: '/', disallow: '/private/' }],
sitemap: 'https://acme.com/sitemap.xml',
}
}Theo-người dùng-agent rules và multiple sitemaps là supported. các trang Router dùng static
public/robots.txt. rule bạn không thể nhận sai on either router: không bao giờ disallow của bạn
JavaScript hoặc CSS — Google sẽ không render từ blocked files, và on JS framework đó
có thể blank out trang hoàn toàn.
tiếp theo/image và Core Web Vitals
next/image là một của strongest reasons để sử dụng framework Đối với SEO. nó lazy-loads
dưới—fold images, requires width/height (hoặc fill) so nó reserves space và
ngăn layout shift / CLS, phục vụ WebP/AVIF tự động, và emits proper
srcset từ sizes prop. single phần lớn quan trọng CWV optimization là
priority prop on của bạn hero / trên—fold image, mà preloads nó cho nhanh hơn LCP:
<Image src="/hero.jpg" width={1200} height={630} priority alt="Hero" />Forgetting priority on LCP image là phần lớn phổ biến tiếp theo.js CWV mistake — và CWV
các vấn đề là widespread on thực tiếp theo.js các trang (see Số liệu tab cho Salt Agency
dữ liệu). alt là bắt buộc: rỗng cho decorative images, descriptive cho nội dung images.
tiếp theo/link và liên kết nội bộ
next/link renders tiêu chuẩn <a href> anchors trong HTML, so Google follows them
thông thường, và nó adds client-side navigation plus background prefetching của trong-viewport
links trong production. SEO rule là đơn giản: sử dụng next/link cho liên kết nội bộ, và không bao giờ
substitute onClick handler hoặc JavaScript navigation đó không produce thực
anchor — những điều đó links không phải crawlable. sử dụng prefetch={false} on thấp-giá trị links để save
bandwidth nếu bạn cần.
Dynamic routes và generateStaticParams
generateStaticParams() tells tiếp theo.js mà dynamic routes để pre-render tại xây dựng time:
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map((post) => ({ slug: post.slug }))
}các trang được xây dựng điều này way là fully static HTML — best Đối với SEO. không có nó, dynamic routes là
được kết xuất on-demand (SSR) theo mặc định, mà là fine nhưng reintroduces máy chủ latency. Combine
nó với revalidate (ISR) cho nội dung đó cập nhật regularly. hãy đảm bảo all quan trọng
dynamic các URL là trong generateStaticParams so không có gì chờ on render queue.
Dữ liệu có cấu trúc (JSON-LD)
Metadata API có không structured-dữ liệu trường — bạn inject JSON-LD as <script> trong
máy chủ Component, mà giữ nó trong máy chủ-được kết xuất HTML tại zero client-bundle cost:
const jsonLd = { '@context': 'https://schema.org', '@type': 'Article', /* … */ }
return <script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />Bài viết/BlogPosting, BreadcrumbList, Sản phẩm, và FAQPage là thông thường types. Validate với Rich Kết quả Kiểm thử sau khi bất kỳ kết xuất thay đổi.
phổ biến tiếp theo.js SEO mistakes
Drawn từ thực audits và patterns trên:
- Bị thiếu hoặc relative canonicals — thường từ forgotten
metadataBase, mà cũng breaks OG image các URL. - Không
priorityon LCP image — biggest CWV miss. - 404 views returning
200— sử dụng được xây dựng-trongnotFound()để trả về thực status; soft 404s là rampant on tiếp theo.js các trang. metadataexported từ Client Component — silently làm không có gì; nó máy chủ Component chỉ.- CSR cho chính nội dung — fetching cốt yếu nội dung trong
useEffectcó nghĩ là non-Google các crawler nhận rỗng các trang. - Hash (
#) routing thay vì History API — những điều đó views không phải riêng crawlable. - không exporting
generateStaticParams— dynamic routes render on-demand thay vì là pre-được xây dựng. openGraphoverwritten by layout inheritance — child segments replace, không hợp nhất.- Blocking JS/CSS trong robots.txt hoặc qua nội dung Security Policy đó dừng Googlebot’s headless Chrome từ loading scripts — kiểm thử với URL Inspection.
Deployment notes
tiếp theo.js là được xây dựng by Vercel; hosting ở đó cho tight integration (edge CDN cho static và
ISR các trang, good TTFB) nhưng không phải bắt buộc. Define vĩnh viễn các chuyển hướng trong redirects() trong
next.config.js (trả về 308, hoặc 301 với permanent: true) cho reliable signaling để
các crawler, đặt security và bộ nhớ đệm các header qua headers(), và sử dụng X-Robots-Tag phản hồi
các header cho path-based noindex rules Khi theo-trang robots metadata là awkward.
Điều gì để kiểm tra nơi. bộ nhớ đệm state, các mã trạng thái, các chuyển hướng, và streamed metadata không all hiển thị lên trong giống nhau kiểm thử — route có thể look fine trong một kiểm tra và vẫn là hỏng trong một:
| kiểm tra | nơi để look | Vì sao nó có thể differ từ Điều gì bạn see được kết xuất |
|---|---|---|
| bộ nhớ đệm/revalidation age | phản hồi các header on trực tiếp yêu cầu (curl -I) | ISR có thể phục vụ stale trang on yêu cầu right sau khi window expires |
| Trực tiếp HTTP status | curl -I on production URL, không được kết xuất UI | ”không tìm thấy” view không có notFound() vẫn trả về 200 |
| chuyển hướng behavior | thực tế context đó fires nó — redirect() trong máy chủ Hành động, Route Handler, so với. client onClick | mã trạng thái và phản hồi path differ by invocation context, không chỉ đích |
| Streamed metadata | Trực tiếp yêu cầu và client-side navigation để giống nhau route | Ordinary clients có thể nhận streamed metadata; HTML-limited bots nhận blocking metadata; hai paths không phải giống hệt |
| Client-side transitions | Navigate trong-app, sau đó re-kiểm tra <head> | route đó đúng on đầu tiên load có thể drift sau khi client transition |
None của Đây là guaranteed by framework — tiếp theo.js cho bạn mechanisms
(redirects(), notFound(), revalidation, streaming), nhưng bộ nhớ đệm keys, invalidation,
preview state, và deployment configuration là vẫn của bạn responsibility để nhận right và
để kiểm thử trong production, không chỉ locally.
Một cuối cùng note on dynamic kết xuất — serving prerendered HTML để bots và JavaScript để người dùng. Google có deprecated điều này as một khuyến nghị: “dynamic rendering was a workaround and not a long-term solution.” (bản dịch) «dynamic kết xuất đã là một workaround và không một dài-term giải pháp.» Bạn không cần điều này on Tiếp theo.js anyway — SSR, SSG, ISR, và Máy chủ Components all put nội dung trong đó HTML natively. Mention điều này so bạn recognize điều này trong an audit; không xây dựng on điều này.
happy path: App Router + máy chủ Components + ISR + Metadata API (với
metadataBase) + next/image với priority. Nhận những điều đó right và phần lớn của tiếp theo.js SEO là
handled.
AI summary
condensed take on Nâng cao version:
- tiếp theo.js solves phần lớn JS-SEO các vấn đề theo mặc định — nếu bạn pick right kết xuất chế độ và wire lên basics. framework cho bạn infrastructure; nó ghi none của bạn tags.
- Hai routers: App Router (v13+, được khuyến nghị) dùng máy chủ Components và native
Metadata API; các trang Router dùng
next/head/next-seo. Cả hai có thể xếp hạng. - Kết xuất modes: SSG và máy chủ Components là best default (nội dung trong HTML, không render-queue delay). ISR là mạnh middle ground nhưng có stale-on-đầu tiên-yêu cầu-sau khi-revalidation trap. SSR cho volatile dữ liệu. CSR là risky — non-Google các crawler có thể nhận trang rỗng.
- Metadata API (App Router):
metadataexport hoặcgenerateMetadata(), máy chủ Component chỉ.metadataBaselà bắt buộc hoặc canonicals và OG images go relative.openGraphtrong child segment replaces parent; metadata trong'use client'file làm không có gì. - Streaming metadata hoạt động cho Google nhưng tiếp theo.js ships blocking metadata để HTML-limited bots (Bingbot, Twitterbot, Slackbot, facebookexternalhit) tự động.
- File conventions:
app/sitemap.ts(vớigenerateSitemaps()cho 50k+ các URL) vàapp/robots.ts. không bao giờ block.js/.css. next/imagengăn CLS, phục vụ WebP/AVIF; đặtpriorityon LCP image — top CWV win.next/linkrenders thực crawlable<a href>anchors và prefetches.generateStaticParamspre-xây dựng dynamic routes; không có nó họ render on-demand.- JSON-LD là injected as
<script>trong máy chủ Component (không Metadata API trường). - **
next-seopackage là tùy chọn, không bắt buộc.** nó actively maintained thứ ba-party software (v7.2,0, không archived), và của nó own tài liệu khuyến nghị được xây dựng-tronggenerateMetadata/metadataexport cho App Router meta tags —<NextSeo>vẫn hữu ích mainly on các trang Router, hoặc cho của nó JSON-LD helper components. - Kết xuất chế độ là đặt theo route, không theo project — không assume một URL’s behavior từ một; kiểm thử cụ thể route (trực tiếp yêu cầu và client navigation cả hai).
- Top mistakes: bị thiếu
metadataBase, không LCPpriority, 404s returning200(sử dụngnotFound()),metadatatrong Client Component, CSR chính nội dung. - Dynamic kết xuất là deprecated — bạn không cần nó; SSR/SSG/ISR/máy chủ Components cover nó.
Tài liệu chính thức
Chính-nguồn tài liệu từ tiếp theo.js và các công cụ tìm kiếm.
tiếp theo.js
- Metadata và OG Images — App Router metadata hệ thống,
metadataBase, và OG image generation. - generateMetadata API Reference — static
metadataso với.generateMetadata, streaming metadata, và HTML-limited bots list. - sitemap.xml File Convention —
app/sitemap.ts,generateSitemaps(), image/video/localized sitemaps. - robots.txt File Convention —
app/robots.ts, theo-người dùng-agent rules, và multiple sitemaps. - Learn: SEO — tiếp theo.js own SEO learning path (introductory; partly có trước App Router).
- Understand JavaScript SEO Basics — crawl → render → chỉ mục pipeline, 200-status kết xuất queue, soft 404s trong SPAs, canonicals, và History API.
- Dynamic Kết xuất (deprecated workaround) — Vì sao Google deprecated nó và Điều gì để sử dụng thay vì (SSR, static kết xuất, hydration).
- Trong-Depth Hướng dẫn để Cách Google Search Hoạt động — nơi kết xuất sits trong crawl → chỉ mục → phục vụ.
Bing / Microsoft
- IndexNow / indexnow.org — push giao thức để wire để tiếp theo.js publish/revalidation event.
Quotes từ nguồn
On—record statements từ Google, tiếp theo.js, và Google reps. mỗi link là deep link đó jumps để quoted passage on nguồn trang.
Google — Cách JavaScript các trang là processed
- “All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page.” (bản dịch) «All các trang với một 200 HTTP mã trạng thái là đã gửi để đó kết xuất queue, không quan trọng liệu JavaScript là present on đó trang.» — Google Search Central tài liệu. Nhảy đến trích dẫn
Google — dynamic kết xuất là deprecated
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (bản dịch) «Dynamic kết xuất đã là một workaround và không một dài-term giải pháp cho các vấn đề với JavaScript-generated nội dung trong các công cụ tìm kiếm.» — Google Search Central tài liệu. Nhảy đến trích dẫn
- “…creates additional complexities and resource requirements.” (bản dịch) «…tạo ra thêm các phức tạp và yêu cầu về tài nguyên.» — Google Search Central tài liệu. Nhảy đến trích dẫn
tiếp theo.js — streaming metadata và HTML-limited bots
- “Streaming metadata is disabled for bots and crawlers that expect metadata to be in the
<head>tag (e.g. Twitterbot, Slackbot, Bingbot).” (bản dịch) «Streaming metadata là disabled cho bots và các crawler đó expect metadata để là trong đó thẻ head tag (e.g. Twitterbot, Slackbot, Bingbot).» — Tiếp theo.js tài liệu,generateMetadata. Nhảy đến trích dẫn
John Mueller, Google (qua công cụ tìm kiếm Journal coverage)
- On đó growing role of JavaScript trong SEO: “You’re going to run into significantly more JavaScript over the next years than in the 2-ish decades in SEO before. If you’re keen on technical SEO, then past HTML you’re going to need to understand JS more and more.” (bản dịch) «bạn là going để chạy vào significantly hơn JavaScript over đó tiếp theo năm hơn trong đó 2-ish decades trong SEO trước. Nếu bạn là keen on SEO kỹ thuật, thì past HTML bạn là going để cần để understand JS hơn và hơn.» Đọc bài đưa tin
tiếp theo.js SEO checklist
nhanh truyền để xác nhận tiếp theo.js trang web là crawlable, indexable, và fast:
- Chính nội dung renders trong HTML on đầu tiên yêu cầu (máy chủ Components / SSG / SSR / ISR) — không chỉ sau khi client-side JavaScript.
- Không quan trọng trang phụ thuộc vào CSR cho của nó main nội dung.
- mỗi trang có unique tiêu đề và mô tả (sử dụng tiêu đề
templatetrong root layout). -
metadataBaselà đặt trong root layout (App Router) so canonicals và OG images là absolute. - canonical là đặt theo trang qua
alternates.canonical(App Router) hoặc<link rel="canonical">(các trang Router) — không single shared homepage canonical. -
metadatalà exported chỉ từ máy chủ Components, không bao giờ'use client'file. -
generateStaticParamscovers all quan trọng dynamic routes. -
app/sitemap.ts(hoặcnext-sitemap) outputs hiện tại sitemap;generateSitemaps()shards các trang over 50k các URL. -
app/robots.ts/public/robots.txttồn tại và không block.jshoặc.css. - Images sử dụng
next/imagevớiwidth/heighthoặcfill; LCP image cópriority; all cóalt. - Liên kết nội bộ sử dụng
next/link(thực<a href>) — khôngonClick-chỉ navigation. - 404 views call
notFound()và trả về thực404(không soft 404s). - JSON-LD là injected trong máy chủ Component
<head>/thân phản hồi và truyền Rich Kết quả Kiểm thử. - Vĩnh viễn các chuyển hướng trực tiếp trong
redirects()trongnext.config.js(308 /permanent).
mental models
1. Kết xuất chế độ là sản phẩm. trước khi gỡ lỗi bất cứ điều gì trong tiếp theo.js trang web, câu trả lời một câu hỏi: Cách là điều này route được kết xuất? máy chủ Components / SSG / SSR / ISR put nội dung trong HTML và là thấp-risk; CSR là risky một. Gần như mỗi tiếp theo.js SEO vấn đề resolves để điều này.
2. Đó framework cho infrastructure, không nội dung. Tiếp theo.js ships đó Metadata API, sitemap/robots conventions, và đó Image component — nhưng điều này ghi none of của bạn các tiêu đề, các mô tả, canonicals, hoặc dữ liệu có cấu trúc. “Next.js handles SEO automatically” (bản dịch) «Tiếp theo.js xử lý SEO tự động» là đó hầu hết expensive myth ở đây.
3. Một nguồn của truth cho các URL.
đặt metadataBase sau khi và xây dựng canonicals, OG images, và sitemap entries từ nó
(absolute, không bao giờ relative). Một base URL kills relative-canonical và hỏng-OG-image
class của bugs.
4. máy chủ Components đầu tiên, Client Components chỉ nơi needed.
Default để máy chủ Components so nội dung và metadata land trong HTML. Reach cho
'use client' chỉ cho interactivity — và remember metadata có thể’t come từ Client
Component.
5. decision rule cho kết xuất. Mostly static (blogs, tài liệu, marketing) → SSG (hoặc ISR on timer). luôn-fresh / volatile (prices, stock) → SSR. Thay đổi hourly/daily, muốn static speed → ISR (mind stale-đầu tiên-yêu cầu trap). Interactive, behind login, không được lập chỉ mục → CSR là fine. Công khai nội dung bạn muốn được xếp hạng → không bao giờ CSR.
tiếp theo.js SEO — bảng tra nhanh
Kết xuất modes
| Chế độ | nơi HTML là được xây dựng | SEO | Best cho | Watch out cho |
|---|---|---|---|---|
| SSG | Xây dựng time → static | ✅ Best | Mostly-static nội dung | Stale cho đến khi rebuild |
| máy chủ Components | máy chủ (App Router default) | ✅ Best | phần lớn nội dung | Interactivity cần Client Components |
| ISR | Static + timed regen | ✅ Good | Hourly/daily nội dung | đầu tiên yêu cầu post-revalidation là stale |
| SSR | máy chủ, theo yêu cầu | ✅ Good | luôn-fresh dữ liệu | Cao hơn TTFB / infra cost |
| CSR | Trong trình duyệt | ⚠️ Risky | Logged-trong dashboards | trang rỗng để non-Google các crawler |
App Router so với các trang Router
| Feature | App Router | các trang Router |
|---|---|---|
| Metadata | metadata / generateMetadata | next/head + next-seo |
| máy chủ Components | Default | không khả dụng |
| Streaming metadata (bot-aware) | Có | Không |
| Sitemap | app/sitemap.ts | next-sitemap / manual |
| Robots | app/robots.ts | public/robots.txt |
| Canonical | alternates.canonical | <link rel="canonical"> trong <Head> |
| Dữ liệu fetching | async máy chủ Components | getStaticProps / getServerSideProps |
Fast rules
- đặt
metadataBasehoặc canonicals/OG images go relative. metadatalà máy chủ Component chỉ —'use client'exports làm không có gì.- Child-segment
openGraphreplaces parent (không hợp nhất). priorityon LCP image = top CWV win.- Liên kết nội bộ =
next/link(thực<a href>); khôngonClick-chỉ nav. - 404 → call
notFound()(thực404, không soft 404). - không bao giờ disallow
.js/.css. - Streaming metadata → blocking cho Bingbot, Twitterbot, Slackbot, facebookexternalhit.
- Dynamic kết xuất: deprecated — sử dụng SSR / SSG / ISR / máy chủ Components.
Nhanh kiểm tra cho tiếp theo.js xây dựng
một vài command-line kiểm tra trước khi bạn reach cho đầy đủ crawler.
là của bạn nội dung trong thô HTML (hoặc chỉ sau khi JS chạy)?
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'nếu headline là bị thiếu từ raw.html nhưng hiển thị trong của bạn trình duyệt, đó route là
client-được kết xuất. nếu canonicals hoặc OG image các URL come out relative, bạn’ve forgotten
metadataBase.
xác nhận bạn không phải blocking JS/CSS (including tiếp theo.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"Bất kỳ match ở đây là gần như luôn một mistake — Google sẽ không render từ blocked files. MỘT đơn giản
curl không thể chạy JavaScript, so cho đó được kết xuất DOM dùng URL Inspection “View Crawled
Page → rendered HTML.” (bản dịch) «View Được crawl Trang → được kết xuất HTML.»
Tools cho auditing tiếp theo.js trang web
- URL Inspection (Google Search Console) — nguồn của truth. Chạy trực tiếp kiểm thử,
sau đó view được kết xuất HTML, screenshot, và trang các tài nguyên (Điều gì loaded so với.
Điều gì là blocked) để catch CSR gaps và blocked
_nextcác tài nguyên. - Rich Kết quả Kiểm thử — xác nhận JSON-LD đã làm nó vào được kết xuất output sau khi bất kỳ kết xuất thay đổi.
- Lighthouse / Chrome DevTools — đo lường LCP, CLS, và INP; kiểm tra liệu của bạn hero
image là preloaded (
priority). - Ahrefs trang web Audit — crawl với JavaScript kết xuất, surfacing bị thiếu/relative canonicals, hỏng metadata, chuyển hướng chains, và indexability các vấn đề trên frontend.
- Screaming Frog SEO Spider — crawl với JS kết xuất on/off để diff thô so với. được kết xuất HTML, và xây dựng pre/post crawl comparisons cho migrations.
- Bing Quản trị viên web Tools — Bing URL Inspection và nơi IndexNow submissions xuất hiện.
Mistakes để tránh on tiếp theo.js
Concrete patterns đó âm thầm break SEO on thực tiếp theo.js xây dựng — ngăn những điều này trước khi họ ship, thay vì gỡ lỗi them sau khi traffic drop.
Shipping không có metadataBase trong root layout
Vì sao nó sai: không có metadataBase, alternates.canonical và openGraph.images
resolve để relative paths thay vì absolute các URL. relative canonical có thể confuse
các tín hiệu canonicalization, và relative OG image các URL break link previews on social và
messaging apps.
Điều gì để làm thay vì: đặt metadataBase: new URL('https://example.com') sau khi trong
app/layout.tsx và let mỗi trang inherit nó. kiểm tra nó với grep -iE 'rel="canonical"|og:(url|image)' so với thô HTML fetch — các URL nên bắt đầu với https://.
Overwriting layout openGraph từ child segment
Vì sao nó sai: metadata merges shallowly từ layout để trang. trang-cấp độ
openGraph: { title: 'Home' } không hợp nhất với layout openGraph.images — nó
replaces toàn bộ object, silently dropping images.
Điều gì để làm thay vì: either repeat đầy đủ openGraph object (images được bao gồm) tại
mỗi cấp độ đó overrides nó, hoặc chỉ override cụ thể top-cấp độ metadata các trường bạn
thực ra cần để thay đổi, và leave openGraph untouched nơi layout default là fine.
Exporting metadata từ Client Component
Vì sao nó sai: Metadata API là máy chủ Component chỉ. Thêm 'use client' để file
đó cũng exports metadata và export làm không có gì — không lỗi, không warning, chỉ
trang với không tiêu đề hoặc mô tả.
Điều gì để làm thay vì: giữ metadata / generateMetadata exports trong đơn giản máy chủ
Component file (page.tsx hoặc layout.tsx không có 'use client'). nếu trang cần client
interactivity, put đó trong tách biệt child component và import nó — không thêm
'use client' để file đó owns metadata export.
Fetching chính nội dung trong useEffect (hoặc relying on đầy đủ CSR)
Vì sao nó sai: nội dung được kết xuất chỉ trong trình duyệt không phải trong ban đầu HTML. Google sẽ eventually render nó, nhưng median render delay là thực và 90th percentile stretches để hours — và non-Google các crawler (Bing, social preview bots, phần lớn AI các crawler) thường không render JavaScript tại all, so họ see trang rỗng.
Điều gì để làm thay vì: default để máy chủ Components, SSG, ISR, hoặc SSR cho bất cứ điều gì bạn
muốn được lập chỉ mục. Reserve 'use client' và useEffect dữ liệu-fetching cho interactive UI đó
không cần để là crawlable — filter widget, không bài viết thân phản hồi.
Returning 200 cho “không tìm thấy” view
Vì sao nó sai: kết xuất “không tìm thấy” message không có calling notFound() trả về
thông thường 200 status. đó soft 404 — Google có thể chỉ mục rỗng-nội dung trang thay vì
recognizing nó as bị thiếu, và soft 404s là một của phần lớn phổ biến thực-world tiếp theo.js SEO
các vấn đề.
Điều gì để làm thay vì: call được xây dựng-trong notFound() function so route trả về thực
404. xác nhận với curl -I on known-bị thiếu URL và kiểm tra mã trạng thái trực tiếp,
không chỉ Điều gì renders trong trình duyệt.
Skipping generateStaticParams on quan trọng dynamic routes
Vì sao nó sai: không có nó, dynamic routes fall lại để on-demand kết xuất (SSR), mà vẫn hoạt động Đối với SEO nhưng adds máy chủ latency để mỗi đầu tiên yêu cầu cho đó URL — including Googlebot’s.
Điều gì để làm thay vì: enumerate các URL đó quan trọng (sản phẩm các trang, blog posts,
category các trang) trong generateStaticParams() so họ’re pre-được xây dựng, và pair nó với
revalidate (ISR) cho nội dung đó thay đổi sau khi launch.
Tự kiểm tra: tiếp theo.js SEO
Five nhanh các câu hỏi on đang làm tiếp theo.js trang web crawlable, indexable, và fast. Pick câu trả lời cho mỗi, sau đó kiểm tra.
các tài nguyên worth của bạn time
My related writing
- JavaScript SEO: Definitive Hướng dẫn — my đầy đủ hướng dẫn để kết xuất, DOM parity, canonicals trong JS, sitemaps, và kết xuất-chế độ trade-offs đó tiếp theo.js sits bên cạnh. điều này tiếp theo.js hướng dẫn là framework-cụ thể layer bên cạnh nó.
- Người mới bắt đầu Hướng dẫn để kỹ thuật SEO — nơi kết xuất và crawling fit trong bigger picture.
My speaking
- JavaScript SEO — Ungagged 2019 (SlideShare) — my walkthrough của Cách các framework tách biệt frontend từ backend và Cách Googlebot renders. (Standing disclaimer: dynamic-kết xuất khuyến nghị trong đó deck là hiện tại outdated — Google deprecated nó.)
từ khoảng ngành
- Metadata và OG Images (tiếp theo.js tài liệu) — App Router metadata hệ thống,
metadataBase, và OG image generation. - generateMetadata API Reference (tiếp theo.js tài liệu) — static so với. dynamic metadata và HTML-limited bots / streaming-metadata behavior.
- sitemap.xml File Convention (tiếp theo.js tài liệu) —
app/sitemap.ts,generateSitemaps(), và localized/image sitemaps. - phổ biến SEO Các vấn đề on tiếp theo.js Websites (Salt Agency) — 50-trang web audit nghiên cứu với thực dữ liệu on soft 404s và LCP failures.
- Cách Google Xử lý JavaScript Throughout lập chỉ mục Xử lý (Vercel) — render-timing dữ liệu từ nextjs.org own máy chủ beacons.
- Hoàn tất tiếp theo.js SEO Hướng dẫn (Strapi) — thorough framework-walkthrough covering kết xuất modes, metadata, và dữ liệu có cấu trúc.
- App Router so với các trang Router Đối với SEO (Wisp) — focused so sánh của hai routers từ SEO angle.
- r/TechSEO — community cho kết xuất/lập chỉ mục gỡ lỗi.
Số liệu worth citing
- Render timing là thường fast, occasionally rất chậm. Vercel analysis của 37 000+ máy chủ-beacon pairs on nextjs.org tìm thấy median render time của ~10 seconds, nhưng 90th percentile của ~3 hours và 99th percentile của ~18 hours — mà là chính xác Vì sao bạn không muốn chính nội dung đang chờ on render queue. Nguồn
- CWV và soft 404s là widespread on thực tiếp theo.js các trang. Salt Agency audit của 50
tiếp theo.js các trang tìm thấy 41/50 returning soft 404s (404 views tại
200status) và chỉ 3/50 passing LCP thresholds — reminder đó framework CWV advantages chỉ help nếu bạn sử dụngnext/imagevớipriorityvà trả về thực các mã trạng thái. Nguồn
Nhật ký thay đổi
Đã cập nhật 8 thg 8, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.
Đã cập nhật 18 thg 7, 2026.
Tóm tắt biên tập và chi tiết thay đổi đã ghi nhận.Chi tiết thay đổi
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
-
Ghi chú thay đổi chi tiết hiện chỉ có bằng tiếng Anh.
Không thể so sánh đầy đủ — không có bản lưu trước đó cho lần sửa đổi này.