SvelteKit Deployment SEO: Adapters, Prerendering, và Edge Kết xuất
SvelteKit adapter và theo-route prerender settings decide nơi và khi của bạn các trang render — và đó drives TTFB, LCP, và ngân sách crawl. MỘT deployment-focused deep dive: chọn adapter-static/node/vercel/cloudflare/netlify, prerender = đúng/sai/'auto', edge-runtime constraints, và building sitemap.xml và robots.txt.
Ngôn ngữ
SvelteKit adapter và theo-route prerender setting decide nơi và khi một trang renders — static HTML tại xây dựng time, SSR on một máy chủ, hoặc SSR tại đó edge — và đó decision drives TTFB, mà feeds LCP và crawl capacity. Pick adapter-static cho pure nội dung các trang, một node/vercel/cloudflare adapter với theo-route prerender cho mixed nội dung-plus-app các trang, và an edge adapter khi global TTFB matters (accepting cold bắt đầu và không Node fs). prerender = 'auto' là đó mixed-site tool. Edge runtimes không thể đọc đó filesystem. Và SvelteKit generates không sitemap.xml hoặc robots.txt — bạn xây dựng những as +máy chủ.js endpoints, với đó strategy depending on của bạn adapter.
Tóm tắt — SvelteKit đã renders của bạn các trang on máy chủ — đó part là handled. điều này trang là về tiếp theo decision: Cách của bạn trang web nhận được xây dựng và deployed. adapter packages của bạn SvelteKit app cho host ( static file host, Node máy chủ, hoặc service như Vercel hoặc Cloudflare), và theo-trang prerender setting decides liệu trang là turned vào đơn giản HTML file ahead của time hoặc được kết xuất fresh on mỗi visit. những điều đó hai choices quyết định Cách fast các crawler nhận của bạn HTML — và SvelteKit sẽ không làm của bạn sitemap hoặc robots.txt, so bạn có để thêm những điều đó yourself.
Điều gì adapter là (trong đơn giản terms)
nếu bạn’ve đã được xây dựng SvelteKit trang web, bạn know nó gửi thực HTML để trình duyệt — nội dung là ở đó trước khi bất kỳ JavaScript chạy. Good. đó hard SEO vấn đề đã solved (và nếu nó không phải solved cho bạn tuy vậy, SvelteKit fundamentals bài viết trong điều này giống nhau section covers kết xuất modes và “empty shell” trap bạn muốn để tránh đầu tiên).
adapter là nhỏ plugin đó takes của bạn finished SvelteKit xây dựng và turns nó vào điều gì đó cụ thể host có thể chạy. Evidence for this claim SvelteKit adapters transform a built application for deployment to a particular environment. Scope: SvelteKit adapters. Confidence: high · Verified: SvelteKit: Adapters giống nhau trang web, khác package:
adapter-staticturns mỗi trang vào một đơn giản HTML file, được xây dựng khi. Great cho một blog, tài liệu, hoặc một marketing site đó không thay đổi theo khách truy cập.adapter-nodewraps của bạn app trong một Node.js máy chủ bạn chạy yourself.adapter-vercel,adapter-netlify,adapter-cloudflarepackage điều này cho những hosting services, mà render các trang on demand — sometimes on các máy chủ “at the edge,” (bản dịch) «tại đó edge,» physically close để của bạn khách truy cập.
nội dung là giống hệt trong mọi trường hợp. Điều gì thay đổi là Khi HTML là đã làm (ahead của time, hoặc on mỗi yêu cầu) và nơi (một máy chủ, hoặc global network).
Vì sao Đây là SEO decision, không chỉ tech một
Đó main điều: speed. MỘT trang đó là đã một static file loads gần như instantly. MỘT trang đó có để là được xây dựng on đó máy chủ takes một moment. Và Google có đã nói plainly đó nếu trang web của bạn “responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down… the limit goes down and Google crawls less.” (bản dịch) «responds quickly cho một trong khi, đó limit goes lên, meaning hơn connections có thể là được dùng để crawl. Nếu đó site làm chậm xuống… đó limit goes xuống và Google crawl ít hơn.» So một chậm deployment không chỉ annoy người dùng — điều này có thể có nghĩa là Google đọc ít hơn of trang web của bạn.
đơn giản version của decision
- ** nội dung trang web** (blog, tài liệu, marketing) → sử dụng
adapter-staticvà prerender mọi thứ. Fastest có thể, không có gì để break. - ** nội dung trang web với một vài dynamic bits** (tìm kiếm, comments) → sử dụng máy chủ
adapter (
node/vercel/cloudflare) và mark của bạn nội dung các trangprerender = true, leaving dynamic bits để render on yêu cầu. - ** app hoặc dashboard** với logged-trong, personalized các trang → render on máy chủ (SSR), prerender chỉ công khai marketing các trang.
không forget hai files SvelteKit sẽ không làm cho bạn
SvelteKit không generate sitemap.xml hoặc robots.txt tự động. bạn
thêm them yourself — thường as nhỏ điểm cuối file (sitemap.xml/+server.js)
và either file trong của bạn static/ folder hoặc một điểm cuối cho
robots.txt. Evidence for this claim SvelteKit can serve static assets from its static directory and create custom responses with +server route files. Scope: Mechanisms for robots.txt and sitemap.xml; files are not generated automatically. Confidence: high · Verified: SvelteKit: Project structure SvelteKit: Routing nó easy để forget vì phần lớn các framework đó render HTML cho
bạn feel “hoàn tất.” những điều này hai không phải.
Muốn deeper version — Điều gì mỗi adapter làm để kết xuất, Cách
prerender = 'auto' xử lý mixed trang web, Vì sao edge functions có thể’t đọc files,
và Cách sitemap strategy thay đổi với của bạn adapter? Chuyển để
Nâng cao tab.
Tóm tắt — adapter không thay đổi Điều gì SvelteKit renders — nó thay đổi nơi và Khi: xây dựng-time static (
adapter-static), yêu cầu-time on máy chủ bạn chạy (adapter-node), hoặc yêu cầu-time on serverless/edge functions (adapter-vercel/-netlify/-cloudflare). Theo-routeprerender = truexây dựng static HTML và drops route từ dynamic manifest;prerender = 'auto'prerenders và giữ nó trong manifest — tool cho mixed/blog/[slug]các trang. Edge runtimes chạy on V8 isolates: không Nodefs, và cold bắt đầu hurt TTFB, mà feeds LCP và (theo Google crawl-budget doc) crawl capacity. SvelteKit generates không sitemap.xml hoặc robots.txt — xây dựng them as+server.jsendpoints, và note strategy phụ thuộc vào adapter. Đây là hẹp hơn, deployment-focused companion để SvelteKit SEO fundamentals bài viết trong điều này section; I assume bạn đã know SvelteKit là SSR-by-default và sẽ không re-litigate đó ở đây.
một ý tưởng đó làm tất cả điều này nhấp
Đó adapter làm không thay đổi điều gì renders. Điều này thay đổi nơi và khi.
đó là đó toàn bộ điều. Đó SvelteKit tài liệu put điều này precisely: adapters “take the
built app as input and generate output for deployment.” (bản dịch) «take đó được xây dựng app as input và generate output cho deployment.» Evidence for this claim SvelteKit adapters take the built application as input and generate deployment-specific output. Scope: Deployment output; adapter choice can still constrain supported runtime features. Confidence: high · Verified: SvelteKit: Adapters Của bạn components, của bạn
load functions, của bạn <svelte:head> metadata — giống hệt trên mỗi adapter.
Điều gì differs là:
- Khi HTML là produced: tại xây dựng time (static/prerendered) hoặc tại yêu cầu time (SSR on máy chủ, serverless function, hoặc edge function).
- nơi nó produced: on single origin máy chủ, on regional serverless function, hoặc on edge network close để khách truy cập.
Mọi thứ dưới là consequence của những điều đó hai axes.
Vì sao deployment choices là SEO choices
chain là ngắn và well-được ghi lại: TTFB → LCP → crawl capacity.
Time để đầu tiên byte là Cách dài host takes để bắt đầu sending phản hồi. prerendered file phân phối từ CDN bộ nhớ đệm có near-zero TTFB. máy chủ đó có để render trang có cao hơn một. cold-starting serverless hoặc edge function có thể có nhiều cao hơn một on đầu tiên hit. TTFB là trực tiếp input để Largest Contentful Paint — Bạn có thể’t paint Điều gì bạn haven’t đã nhận — và LCP là Cốt lõi Web Chỉ số quan trọng tín hiệu.
Đó crawl side là nơi Google là hầu hết rõ ràng. Từ đó crawl-budget tài liệu: “If the site responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down or responds with server errors, the limit goes down and Google crawls less.” (bản dịch) «Nếu đó site responds quickly cho một trong khi, đó limit goes lên, meaning hơn connections có thể là được dùng để crawl. Nếu đó site làm chậm xuống hoặc responds với máy chủ các lỗi, đó limit goes xuống và Google crawl ít hơn.» Và đó best-practice line: “Make your pages efficient to load. If Google can load and render your pages faster, we might be able to read more content from your site.” (bản dịch) «Làm của bạn các trang efficient để load. Nếu Google có thể load và render của bạn các trang nhanh hơn, we có thể là able để đọc hơn nội dung từ trang web của bạn.» MỘT cold-starting edge function đó là chậm để respond là subject để đó giống nhau dynamic as một chậm origin máy chủ.
Một honesty note lên front: Google publishes không SvelteKit-cụ thể hướng dẫn.
có không doc hoặc Tìm kiếm Off đó Record episode naming SvelteKit adapters,
prerender = 'auto', hoặc edge cold bắt đầu. Điều gì I’m đang làm ở đây là applying
Google chung kết xuất và crawl-budget hướng dẫn để SvelteKit cụ thể
mechanics — không quoting một rep ai commented on SvelteKit, vì none có. Đó
Google cách diễn đạt đó “server-side or pre-rendering is still a great idea because
it makes your website faster for users and crawlers, and not all bots can run
JavaScript” (bản dịch) «máy chủ-side hoặc pre-kết xuất là vẫn một great ý tưởng vì điều này làm của bạn website nhanh hơn cho người dùng và các crawler, và không all bots có thể chạy JavaScript» là đó closest chính thức anchor, và đây là framework-agnostic.
Chọn adapter Đối với SEO outcomes
adapter-auto — zero-config default, và của nó ceiling
New SvelteKit projects ship với adapter-auto. nó detects nền tảng —
Vercel, Netlify, Cloudflare các trang, Azure, AWS — và installs matching adapter
tại xây dựng time. nó fine starting point, nhưng có hard ceiling worth
knowing: adapter-auto không take bất kỳ options. moment bạn cần
{ edge: true }, Cloudflare bindings, Vercel ISR, hoặc bất kỳ nền tảng-cụ thể
configuration, bạn install underlying adapter (adapter-vercel,
adapter-cloudflare, etc.) trực tiếp. Treat auto as scaffold, không production
decision.
adapter-static — đầy đủ SSG, cho nội dung-đầu tiên các trang
adapter-static prerenders của bạn toàn bộ trang web để static files tại xây dựng time. Không
máy chủ chạy; host phục vụ flat HTML. Evidence for this claim adapter-static prerenders a SvelteKit site as static files. Scope: Routes must be prerenderable; performance outcomes depend on hosting and page design. Confidence: high · Verified: SvelteKit: Static site generation cho nội dung-đầu tiên trang web Đây là
strongest SEO profile Bạn có thể có — lowest TTFB, không cold bắt đầu, không có gì để fall
over. một requirement là trap covered tại length trong fundamentals
bài viết: SSR phải stay on during xây dựng, hoặc bạn nhận rỗng shells thay vì
được kết xuất HTML. I sẽ không re-giải thích đó ở đây beyond flagging nó.
catch là rigidity. Bất cứ điều gì đó genuinely cần máy chủ logic theo yêu cầu (đúng tìm kiếm, theo-người dùng nội dung, form xử lý không có thứ ba-party điểm cuối) có thể’t trực tiếp on purely static xây dựng — mà là chính xác Điều gì tiếp theo adapters là cho.
adapter-node — máy chủ bạn control
adapter-node produces standalone Node.js máy chủ. bạn chạy nó, bạn quy mô nó, bạn
own TTFB. Đây là phần lớn flexible option và một với fewest runtime
surprises — đầy đủ Node APIs, including fs. nó good fit Khi bạn có
infrastructure đã, cần Node libraries đó edge runtimes có thể’t chạy, hoặc muốn
dễ dự đoán (non-cold-starting) phản hồi times từ warm máy chủ. tradeoff là
operational: bạn’re đang chạy máy chủ, và của nó speed và uptime là hiện tại của bạn crawl
capacity.
adapter-vercel — serverless, edge, và ISR
adapter-vercel deploys để Vercel serverless functions theo mặc định, với several
SEO-relevant levers đặt theo route qua export const config:
runtime: 'edge'moves đó route để Vercel edge runtime (hơn dưới).regionscontrols nơi serverless functions chạy — closer để người dùng của bạn (hoặc của bạn database) có nghĩa là thấp hơn latency.isrenables Incremental Static Regeneration:isr: { expiration: 60 }serves một được lưu đệm static asset và regenerates điều này sau đó window, giving “the performance and cost advantages of prerendered content with the flexibility of dynamically rendered content.” (bản dịch) «đó performance và cost advantages of prerendered nội dung với đó flexibility of dynamically được kết xuất nội dung.» ISR là một genuine fourth path giữa pure-static và pure-SSR — nhưng note đó tài liệu’ own caveat: “Using ISR on a route withexport const prerender = truewill have no effect, since the route is prerendered at build time.” (bản dịch) «Dùng ISR on một route với sẽ có không effect, since đó route là prerendered tại xây dựng time.» ISR và prerender là alternatives, không stackable.
adapter-cloudflare — Workers/các trang, global edge
adapter-cloudflare targets Cloudflare Workers và Các trang — SSR on một global edge
network, thường đó lowest TTFB cho một geographically spread audience. Đó quan trọng
constraint là đó runtime: Workers chạy on V8 isolates, không Node. Từ đó tài liệu:
“You can’t use fs in Cloudflare Workers.” (bản dịch) «Bạn không thể dùng fs trong Cloudflare Workers.» Some Node APIs hoạt động chỉ behind đó
nodejs_compat compatibility flag, và ngay cả thì hỗ trợ không một-để-một. Nếu bạn
đã là reading files tại yêu cầu time (một chuyển hướng map, một dữ liệu file, custom OG-image
inputs), đó code cần một rethink — covered trong đó edge section dưới.
( older adapter-cloudflare-workers là deprecated; new projects sử dụng
adapter-cloudflare, mà xử lý cả hai Workers và các trang. nếu bạn’re on old
một, migrating là được khuyến nghị path.)
adapter-netlify — functions hoặc Edge Functions (Deno)
adapter-netlify deploys để Netlify Node-based functions theo mặc định, hoặc để
Deno-based Edge Functions với edge: true. Giống nhau shape as Vercel: default
serverless với an edge opt-trong. Một SvelteKit-cụ thể footnote — Netlify Forms
require đó form trang để là prerendered so Netlify có thể detect đó form markup
tại deploy time, mà là một nhỏ “prerender this route” (bản dịch) «prerender này route» requirement layered on top
of đó adapter lựa chọn.
decision, trong một line mỗi
- Pure nội dung trang web →
adapter-static, prerender mọi thứ. - nội dung trang web với dynamic pockets →
adapter-node/-vercel/-cloudflare,prerender = trueon nội dung,false/'auto'on dynamic routes. - App/dashboard với personalization → SSR-đầu tiên (node hoặc edge), prerender chỉ static shell (marketing, login).
- Global, TTFB-cốt yếu audience → edge adapter cho dynamic routes, accepting Node-API constraints và cold-bắt đầu reality.
( Cây quyết định tab walks điều này as branching flow.)
Prerendering strategy cho mixed các trang
Điều gì true / false / 'auto' thực ra làm
export const prerender là theo-route (hoặc theo-layout) trang option, và three
các giá trị không phải chỉ on/off:
true— xây dựng này route để static HTML tại xây dựng time. Critically, đây là “excluded from manifests used for dynamic SSR, making your server (or serverless/edge functions) smaller.” (bản dịch) «excluded từ manifests dùng cho dynamic SSR, đang làm máy chủ của bạn (hoặc serverless/edge functions) nhỏ hơn.» Khi prerendered, đó route không thể fall lại để dynamic kết xuất — đây là static, đầy đủ dừng.false— luôn render on yêu cầu. Không static file.'auto'— đó mixed-site tool. Điều này prerenders đó route và giữ điều này trong đó dynamic máy chủ manifest, so đó giống nhau route có thể là phân phối statically cho known paths và máy chủ-được kết xuất cho đó rest. Này là được xây dựng cho chính xác đó case đó tài liệu mô tả: một route như/blog/[slug]“where you want to prerender your most recent/popular content but server-render the long tail.” (bản dịch) «nơi bạn muốn để prerender của bạn hầu hết gần đây/popular nội dung nhưng máy chủ-render đó dài tail.»
vì prerendered routes shrink máy chủ bundle, mostly-prerendered trang web
với một vài 'auto'/false routes deploys nhỏ hơn, cheaper, nhanh hơn function —
efficiency win independent của SEO.
Dynamic routes cần entries function
Đó prerender crawler discovers các trang by sau <a> links từ của bạn entry
points. Đó hoạt động cho static routes, nhưng một dynamic route như /blog/[slug] có
không fixed URL cho đó crawler để tìm. Nếu không có gì links để một được cho slug, SvelteKit
sẽ không know điều này tồn tại — và bạn’ll hit đó classic xây dựng lỗi đó routes “were
marked as prerenderable, but were not prerendered.” (bản dịch) «đã là marked as prerenderable, nhưng đã là không prerendered.»
khắc phục là rõ ràng entries function (hoặc config.kit.prerender.entries) đó
enumerates parameter các giá trị:
// src/routes/blog/[slug]/+page.server.js
export const prerender = true;
export function entries() {
return [
{ slug: 'hello-world' },
{ slug: 'sveltekit-deployment-seo' },
];
}trên thực tế bạn generate đó list từ của bạn CMS hoặc nội dung directory. không có nó, prerendering chỉ covers slugs link crawler happens để tìm.
/blog/[slug] pattern trong wild
Put đó hai together và bạn có đó canonical mixed-site setup: prerender = 'auto' plus an entries function đó trả về của bạn gần đây và popular posts.
Những nhận static HTML tại xây dựng time; bất cứ điều gì không trong đó list falls qua để SSR
on demand. New posts render dynamically until đó tiếp theo xây dựng prerenders them. đây là
đó thực dụng middle ground giữa “prerender all 40,000 posts every build” (bản dịch) «prerender all 40 000 posts mỗi xây dựng» và
“render every post on every request.” (bản dịch) «render mỗi post on mỗi yêu cầu.»
Edge runtime constraints đó ảnh hưởng SEO
config.runtime = 'edge' là theo-route (on Vercel)
Edge không phải all-hoặc-không có gì chuyển. On Vercel nó theo-route trang option:
// +page.server.js or +server.js
export const config = { runtime: 'edge' };đó có nghĩ là Bạn có thể push cao-traffic, có thể lưu vào bộ nhớ đệm routes để edge cho thấp TTFB trong khi giữ Node-phụ thuộc routes on tiêu chuẩn serverless (Node) runtime trong giống nhau deployment. Mix có chủ ý.
Không fs, không arbitrary Node APIs
Đó edge runtimes — Cloudflare Workers, Vercel Edge Functions, Netlify Deno Edge
Functions — không cung cấp Node fs. Cloudflare’s tài liệu: “You can’t use fs in
Cloudflare Workers.” (bản dịch) «Bạn không thể dùng fs trong Cloudflare Workers.» Vercel: “You can’t use fs in edge functions.” (bản dịch) «Bạn không thể dùng fs trong edge functions.» Cả hai point
để đó giống nhau hai escape hatches: dùng đó read helper từ $app/server để access
bundled assets, hoặc “prerender the routes in question” (bản dịch) «prerender đó routes trong câu hỏi» so đó file access happens
tại xây dựng time thay vì tại yêu cầu time.
Đó SEO-liền kề cases nơi này bites: dynamic OG-image generation đó đọc một
font hoặc template file, file-based chuyển hướng maps, hoặc một sitemap endpoint đó đọc
nội dung off disk. Bất kỳ of những either moves để $app/server’s read() hoặc moves để
prerender/xây dựng time. đây là không một blocker — đây là một “know before you pick edge” (bản dịch) «know trước khi bạn pick edge»
constraint.
Cold bắt đầu và TTFB — Khi edge helps và Khi nó không
Edge functions vẫn cold-bắt đầu. MỘT cold edge function on của nó đầu tiên yêu cầu có thể là chậm hơn hơn một warm Node máy chủ, và dramatically chậm hơn một prerendered file phân phối từ bộ nhớ đệm. Edge wins khi đó function vẫn giữ warm hoặc khi đây là paired với aggressive bộ nhớ đệm so hầu hết các yêu cầu không bao giờ hit đó function tại all. Điều này là không tự động đó fastest option — “deploy to the edge” (bản dịch) «deploy để đó edge» không phải một synonym cho “nhanh hơn.” Cho một nội dung site, prerendered static output beats edge SSR on TTFB mỗi khi, vì có không function để bắt đầu.
Generating sitemap.xml và robots.txt (SvelteKit sẽ không)
Đây là khoảng trống phần lớn SvelteKit tutorials skip và phần lớn audits catch. SvelteKit generates không sitemap.xml và không robots.txt tự động — regardless của adapter, regardless của Cách nhiều các trang bạn prerender. fully static trang web với thousands của prerendered các trang vẫn ships với không sitemap trừ khi bạn xây dựng một.
+server.js điểm cuối pattern
idiomatic sitemap là route điểm cuối đó trả về XML với right
Content-Type:
// src/routes/sitemap.xml/+server.js
export const prerender = true; // needed on adapter-static
export async function GET() {
const urls = await getAllUrls(); // from your CMS/content
const body = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
${urls.map((u) => ` <url><loc>${u}</loc></url>`).join('\n')}
</urlset>`;
return new Response(body, {
headers: { 'Content-Type': 'application/xml' },
});
}strategy phụ thuộc vào của bạn adapter
Ở đây part đó ties điều này toàn bộ bài viết together: của bạn sitemap strategy là downstream của bạn adapter lựa chọn.
- On
adapter-static, đó sitemap endpoint cầnexport const prerender = trueso đây là được bao gồm trong đó static output — có không máy chủ tại runtime để generate điều này on yêu cầu. đây là baked tại xây dựng time, mà có nghĩa là đây là chỉ as fresh as của bạn cuối cùng xây dựng. - On một Node/serverless/edge adapter, đó giống nhau endpoint có thể generate đó sitemap
dynamically theo yêu cầu từ của bạn CMS hoặc database — luôn hiện tại, không rebuild
needed. (On an edge adapter, remember đó
fsconstraint: pull URLs từ an API hoặc binding, không một disk đọc.)
So đó “should my sitemap be static or dynamic?” (bản dịch) «nên my sitemap là static hoặc dynamic?» câu hỏi không một tách biệt decision — điều này falls out of đó adapter bạn đã chose.
robots.txt: static file so với. điểm cuối
Hai options. Drop đơn giản robots.txt trong của bạn static/ folder (phân phối tại
/robots.txt tự động), mà là simplest lựa chọn và fine cho phần lớn các trang.
hoặc generate nó từ src/routes/robots.txt/+server.js điểm cuối Khi bạn cần nó
để differ by environment (blocking các crawler on staging, allowing them trong
production, chẳng hạn). Either way, không block của bạn /_app/ bundle hoặc CSS —
đó breaks kết xuất cho engines đó làm render.
Nếu bạn là coming tại này từ đó rộng hơn framework hoặc JavaScript-SEO angle, đó “where and when does rendering happen” (bản dịch) «nơi và khi làm kết xuất happen» logic ở đây là đó giống nhau logic đó governs JavaScript SEO generally, và đó SvelteKit fundamentals piece trong này section covers đó kết xuất modes và metadata patterns này bài viết xây dựng on top of.
AI summary
condensed take on Nâng cao version:
- Đó adapter thay đổi nơi và khi, không điều gì. Adapters “take the built app as input and generate output for deployment” (bản dịch) «take đó được xây dựng app as input và generate output cho deployment» — giống nhau nội dung, khác nhau timing (xây dựng so với. yêu cầu time) và location (origin so với. edge).
- Vì sao đây là an SEO decision: TTFB → LCP → crawl capacity. Google: nếu một site “responds quickly… the limit goes up… If the site slows down… Google crawls less.” (bản dịch) «responds quickly… đó limit goes lên… Nếu đó site làm chậm xuống… Google crawl ít hơn.» Không Google hướng dẫn names SvelteKit cụ thể — này là chung hướng dẫn applied để SvelteKit mechanics.
- Adapters:
adapter-auto(zero-config, không options);adapter-static(SSG, nội dung các trang, lowest TTFB);adapter-node(máy chủ bạn control, đầy đủ Node APIs);adapter-vercel(serverless + edge + ISR);adapter-cloudflare(global edge Workers, khôngfs;adapter-cloudflare-workerslà deprecated);adapter-netlify(functions hoặc Deno Edge Functions). - Prerender:
truexây dựng static HTML và xóa đó route từ đó dynamic manifest;falseluôn SSRs;'auto'prerenders và giữ điều này dynamic — đó mixed-site tool cho/blog/[slug](prerender popular, SSR đó dài tail). - Dynamic routes cần an
entriesfunction hoặc bạn hit đó “marked as prerenderable, but were not prerendered” (bản dịch) «marked as prerenderable, nhưng đã là không prerendered» lỗi. - Edge constraints:
runtime: 'edge'là theo-route (Vercel); khôngfs(“You can’t use fs in Cloudflare Workers” (bản dịch) «Bạn không thể dùng fs trong Cloudflare Workers» / edge functions) — dùng$app/server’sread()hoặc prerender; cold bắt đầu có thể làm edge chậm hơn một warm máy chủ hoặc static file. - Không được xây dựng-trong sitemap/robots.txt. Xây dựng một
sitemap.xml/+server.jsendpoint (prerender = trueonadapter-static; dynamic on máy chủ/edge adapters). robots.txt quastatic/hoặc an endpoint. - ISR ≠ prerender-plus: “Using ISR on a route with
export const prerender = truewill have no effect.” (bản dịch) «Dùng ISR on một route với sẽ có không effect.» họ là alternatives.
Tài liệu chính thức
Chính-nguồn tài liệu từ SvelteKit và các công cụ tìm kiếm.
SvelteKit
- Adapters • SvelteKit Tài liệu — đó overview: adapters take đó được xây dựng app và generate deployment output.
- Zero-config deployments (adapter-auto) • SvelteKit Tài liệu — theo-nền tảng detection và đó “does not take any options” (bản dịch) «không take bất kỳ options» limitation.
- Node các máy chủ (adapter-node) • SvelteKit Tài liệu — đó standalone Node máy chủ, environment variables, graceful shutdown.
- Static site generation (adapter-static) • SvelteKit Tài liệu — đầy đủ-site SSG, đó SSR requirement, và đó SPA-fallback SEO warning.
- Vercel (adapter-vercel) • SvelteKit Tài liệu — theo-route
runtime,regions,split, và Incremental Static Regeneration. - Cloudflare (adapter-cloudflare) • SvelteKit Tài liệu — Workers/Các trang,
platform.envbindings,nodejs_compat, và đófslimitation. - Cloudflare Workers (adapter-cloudflare-workers, deprecated) • SvelteKit Tài liệu — đó deprecated legacy adapter và migration path.
- Netlify (adapter-netlify) • SvelteKit Tài liệu — Node Functions so với. Deno-based Edge Functions (
edge: true), và đó Forms prerender requirement. - Trang options (prerender, ssr, csr, config) • SvelteKit Tài liệu —
prerender = true/false/'auto', đóentriesfunction, và theo-routeconfigincludingruntime: 'edge'.
- Understand JavaScript SEO Basics — đó render queue và “not all bots can run JavaScript.” (bản dịch) «không all bots có thể chạy JavaScript.»
- Optimize của bạn ngân sách crawl — crawl capacity tied để phản hồi speed; “make your pages efficient to load.” (bản dịch) «làm của bạn các trang efficient để load.»
Bing / Microsoft
- bingbot Series: JavaScript, Dynamic Kết xuất, và Cloaking. Oh My! — Bing prerendering/dynamic-kết xuất khuyến nghị và cloaking clarification.
- Fast Front-End Performance cho Microsoft Bing — Bing own SSR + CDN/edge-node architecture as thực-world proof point.
Quotes từ nguồn
On—record statements từ SvelteKit tài liệu, Google, và Bing. mỗi link là deep link đó jumps để quoted passage on nguồn trang.
SvelteKit tài liệu — adapters & trang options
- “adapter-auto does not take any options.” (bản dịch) «adapter-auto không take bất kỳ options.» — on đó zero-config default adapter. Nhảy đến trích dẫn
- On
prerender = true— prerendered routes là “excluded from manifests used for dynamic SSR, making your server (or serverless/edge functions) smaller.” (bản dịch) «excluded từ manifests dùng cho dynamic SSR, đang làm máy chủ của bạn (hoặc serverless/edge functions) nhỏ hơn.» Nhảy đến trích dẫn - On
'auto'— đó/blog/[slug]case nơi bạn muốn để “prerender your most recent/popular content but server-render the long tail.” (bản dịch) «prerender của bạn hầu hết gần đây/popular nội dung nhưng máy chủ-render đó dài tail.» Nhảy đến trích dẫn - On đó edge
fslimitation — “You can’t use fs in Cloudflare Workers.” (bản dịch) «Bạn không thể dùng fs trong Cloudflare Workers.» Nhảy đến trích dẫn - On Vercel ISR so với. prerender — “Using ISR on a route with export const prerender = true will have no effect, since the route is prerendered at build time.” (bản dịch) «Dùng ISR on một route với export const prerender = đúng sẽ có không effect, since đó route là prerendered tại xây dựng time.» Nhảy đến trích dẫn
Google — kết xuất & ngân sách crawl
- “Keep in mind that server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript.” (bản dịch) «Hãy nhớ rằng đó máy chủ-side hoặc pre-kết xuất là vẫn một great ý tưởng vì điều này làm của bạn website nhanh hơn cho người dùng và các crawler, và không all bots có thể chạy JavaScript.» Nhảy đến trích dẫn
- “If the site responds quickly for a while, the limit goes up, meaning more connections can be used to crawl. If the site slows down or responds with server errors, the limit goes down and Google crawls less.” (bản dịch) «Nếu đó site responds quickly cho một trong khi, đó limit goes lên, meaning hơn connections có thể là được dùng để crawl. Nếu đó site làm chậm xuống hoặc responds với máy chủ các lỗi, đó limit goes xuống và Google crawl ít hơn.» Nhảy đến trích dẫn
- “Make your pages efficient to load. If Google can load and render your pages faster, we might be able to read more content from your site.” (bản dịch) «Làm của bạn các trang efficient để load. Nếu Google có thể load và render của bạn các trang nhanh hơn, we có thể là able để đọc hơn nội dung từ trang web của bạn.» Nhảy đến trích dẫn
Bing — prerendering & của nó own edge architecture
- “We encourage detecting our bingbot user agent, prerendering the content on the server side and outputting static HTML for such sites…” (bản dịch) «We encourage detecting của chúng ta bingbot người dùng agent, prerendering đó nội dung on đó máy chủ side và outputting static HTML cho such các trang…» — Fabrice Canel & Frédéric Dubut, Microsoft Bing. Nhảy đến trích dẫn
- “User traffic routes first to the closest CDN node (called an ‘edge node’).” (bản dịch) «Người dùng traffic routes đầu tiên để đó closest CDN node (called an ‘edge node’).» — Bing Tìm kiếm Quality Insights, on Bing own SSR + edge architecture. Nhảy đến trích dẫn
SvelteKit deployment SEO checklist
truyền để xác nhận của bạn adapter, prerender, và sitemap setup sẽ không hurt các crawler:
- bạn đã moved off
adapter-autođể an rõ ràng adapter nếu bạn cần bất kỳ configuration (edge, ISR, bindings). - Đó adapter matches đó site loại —
adapter-staticcho pure nội dung, một máy chủ/edge adapter cho bất cứ điều gì với theo-yêu cầu logic. - Nội dung routes là
prerender = true(hoặc'auto'); chỉ genuinely dynamic routes là left để SSR. - Mixed dynamic routes (
/blog/[slug]) dùngprerender = 'auto'với anentriesfunction enumerating known paths. - Không unresolved “marked as prerenderable, but were not prerendered” (bản dịch) «marked as prerenderable, nhưng đã là không prerendered» xây dựng các lỗi.
- Nếu bất kỳ route dùng
runtime: 'edge', điều này làm không call Nodefs— file access dùng$app/server’sread()hoặc là prerendered. - bạn đã accounted cho cold bắt đầu on edge/serverless — cacheable, static, hoặc warm nơi TTFB matters.
- MỘT sitemap.xml endpoint tồn tại (
prerender = trueonadapter-static; dynamic on máy chủ/edge adapters). - MỘT robots.txt tồn tại (trong
static/hoặc as một+server.jsendpoint) và làm không block/_app/hoặc CSS. - Bạn là không trying để stack ISR on một
prerender = trueroute (điều này có không effect). - Bạn verified đó được kết xuất HTML và phản hồi speed trong GSC URL Inspection và PageSpeed Insights.
mental models
1. nơi và Khi, không Điều gì. adapter không bao giờ thay đổi của bạn nội dung — nó thay đổi Khi HTML là đã làm (xây dựng time so với. yêu cầu time) và nơi (origin so với. edge). mỗi deployment SEO câu hỏi reduces để những điều đó hai axes. Ask them trước khi bạn touch config.
2. Prerender xóa một route từ đó máy chủ.
prerender = true không chỉ “make it static” (bản dịch) «làm điều này static» — điều này takes đó route out of đó
dynamic manifest. Đó shrinks của bạn function và rules out một dynamic fallback.
'auto' là đó exception: prerendered và vẫn trong đó manifest.
3. /blog/[slug] split.
default pattern cho nội dung thực các trang: prerender entries Bạn có thể name
(entries function trả về gần đây/popular), SSR dài tail. 'auto' là
chuyển đó làm cả hai đúng tại sau khi.
4. Edge là trade, không upgrade.
Edge buys bạn geographic proximity (thấp TTFB Khi warm) và costs bạn Node APIs
(không fs) và cold-bắt đầu risk. nó beats warm Node máy chủ chỉ đôi khi, và
loses để prerendered static output on TTFB luôn. chọn nó cho reason, không by
default.
5. Đó sitemap follows đó adapter.
“Static or dynamic sitemap?” (bản dịch) «Static hoặc dynamic sitemap?» không một tách biệt decision. adapter-static →
prerendered sitemap, fresh chỉ tại xây dựng. Máy chủ/edge adapter → theo-yêu cầu
sitemap, luôn hiện tại. Đó adapter đã answered đó câu hỏi.
6. Không có gì generates hai files. SvelteKit làm không sitemap.xml và không robots.txt, cho bất kỳ adapter. nếu bạn đã không ghi them, họ không exist. Bake điều này vào của bạn launch checklist.
Mà adapter + prerender combo nên I pick?
Đó cốt lõi “which path do I take?” (bản dịch) «mà path làm I take?» câu hỏi trong SvelteKit deployment là cách nên này site ship? Walk trang web của bạn qua này:
1. Làm bất kỳ trang cần theo-yêu cầu máy chủ logic — auth, personalization, trực tiếp tìm kiếm, form xử lý, theo-người dùng dữ liệu? → Không (mỗi trang là giống nhau cho mỗi khách truy cập): go để 2. → Có: skip để 3.
2. Pure nội dung trang web (blog, tài liệu, marketing).
→ sử dụng adapter-static, đặt prerender = true trang web-wide (hoặc trong root
layout). Thêm prerendered sitemap.xml/+server.js (prerender = true) và
static/robots.txt. Lowest TTFB, không cold bắt đầu, không có gì để chạy. Dừng ở đây.
3. là toàn bộ trang web dynamic, hoặc chỉ some routes? → chỉ some routes (mostly nội dung, một vài dynamic bits): go để 4. → Mostly/hoàn toàn dynamic (app, dashboard, ecommerce với theo-người dùng dữ liệu): go để 5.
4. nội dung trang web với dynamic pockets.
→ sử dụng máy chủ/edge adapter (adapter-node, -vercel, hoặc
-cloudflare). Mark nội dung routes prerender = true, dynamic routes
false. cho /blog/[slug]-style routes với known-popular nội dung, sử dụng
prerender = 'auto' + entries function. Generate sitemap dynamically
từ của bạn CMS. Đã xong.
5. App / dashboard / ecommerce (SSR-đầu tiên). Hiện tại pick nơi SSR chạy:
→ Dễ dự đoán latency, Node libraries, bạn có infra: adapter-node
(warm máy chủ, đầy đủ Node APIs, không cold-bắt đầu surprises).
→ Global audience, TTFB matters phần lớn, không nặng Node deps: edge adapter
(adapter-cloudflare, hoặc adapter-vercel với runtime: 'edge' theo route) —
accept không fs (sử dụng $app/server’s read() hoặc prerender) và cold bắt đầu.
Prerender chỉ truly static shell (marketing, login).
Fourth path (Vercel chỉ): nếu một route là “mostly static but occasionally
changes,” (bản dịch) «mostly static nhưng occasionally thay đổi,» consider ISR (isr: { expiration }) thay vì prerender = true
— không bao giờ cả hai, since “ISR on a route with export const prerender = true will have
no effect.” (bản dịch) «ISR on một route với export const prerender = đúng sẽ có không effect.»
nên my sitemap là static hoặc dynamic?
On adapter-static? → Static/prerendered sitemap điểm cuối
(prerender = true). nó baked tại xây dựng; fine cho các trang đó rebuild on publish.
On Node/serverless/edge adapter? → Dynamic sitemap generated theo yêu cầu
từ của bạn CMS/DB — luôn hiện tại, không rebuild. (On edge, pull các URL từ API hoặc
binding, không disk fs đọc.)
Không bao giờ: ship không sitemap vì “the pages are all static.” (bản dịch) «đó các trang là all static.» Static output và sitemap discoverability là unrelated — SvelteKit generates neither file cho bất kỳ adapter.
SvelteKit deployment SEO — bảng tra nhanh
Adapters tại glance
| Adapter | Renders | Runtime | SEO note |
|---|---|---|---|
adapter-static | Xây dựng time (SSG) | none | Lowest TTFB, không cold bắt đầu; nội dung các trang |
adapter-node | yêu cầu time (SSR) | Node | đầy đủ Node APIs (fs ✅); bạn chạy máy chủ |
adapter-vercel | yêu cầu time | serverless / edge | Theo-route runtime, regions, ISR |
adapter-cloudflare | yêu cầu time | V8 edge | Global edge; không fs; nodejs_compat |
adapter-netlify | yêu cầu time | Node / Deno edge | edge: true cho Deno Edge Functions |
adapter-auto | (detects trên) | — | Takes không options — scaffold chỉ |
Prerender các giá trị
| Giá trị | Static HTML? | Trong dynamic manifest? | sử dụng cho |
|---|---|---|---|
true | ✅ | ❌ (đã xóa) | Known static nội dung routes |
false | ❌ | ✅ | Genuinely dynamic routes |
'auto' | ✅ | ✅ | /blog/[slug] — prerender popular, SSR dài tail |
Fast rules
- Dynamic prerendered routes → thêm an
entriesfunction (hoặc hit đó “not prerendered” (bản dịch) «không prerendered» lỗi). runtime: 'edge'là theo-route (Vercel) — mix edge và Node routes.- Edge = không
fs→ dùng$app/server’sread()hoặc prerender. - Cold bắt đầu làm edge chậm hơn một warm máy chủ / static file on đầu tiên hit.
- ISR ≠ prerender —
isron mộtprerender = trueroute làm không có gì. - Không auto sitemap/robots.txt — xây dựng cả hai.
prerender = trueon đó sitemap endpoint choadapter-static; dynamic on máy chủ/edge. - Không bao giờ block
/_app/hoặc CSS trong robots.txt.
prerendered route là bị thiếu từ deployment
có khả năng nguyên nhân: crawler có thể không discover path, entries giá trị là absent, hoặc prerendering thất bại. khắc phục: thêm crawlable links hoặc rõ ràng entries và treat xây dựng warnings as phát hành failures. xác nhận: output manifest contains route và production trả về hoàn tất HTML.
adapter-static fails on dynamic route
có khả năng nguyên nhân: route không thể là fully enumerated tại xây dựng time. khắc phục: supply finite entries, redesign route, hoặc sử dụng máy chủ-capable adapter cho đó path. xác nhận: được chọn adapter xây dựng và mỗi representative route trả về dự kiến phản hồi.
Edge deployment throws filesystem hoặc Node API các lỗi
có khả năng nguyên nhân: route code hoặc dependency assumes Node features không khả dụng trong edge runtime. khắc phục: replace dependency, move hoạt động để compatible service, hoặc chọn Node adapter. xác nhận: production SSR succeeds không có runtime exceptions.
Sitemap hoặc robots.txt trả về HTML
có khả năng nguyên nhân: fallback route catches điểm cuối hoặc +server handler sets sai thân phản hồi/các header. khắc phục: tạo rõ ràng điểm cuối handlers với đúng nội dung types. xác nhận: trực tiếp các yêu cầu trả về dự kiến text/XML phản hồi và 200 status.
Metadata differs giữa prerendered và SSR routes
có khả năng nguyên nhân: head dữ liệu là loaded trong khác code paths hoặc phụ thuộc vào trình duyệt state. khắc phục: centralize metadata generation từ máy chủ/xây dựng-safe trang dữ liệu. xác nhận: thô HTML cho cả hai route types contains tương đương tiêu đề, canonical, và robots logic.
xác nhận Điều gì của bạn adapter thực ra shipped
point của picking adapter và prerendering là đó crawler nhận fast, hoàn tất HTML. những điều này kiểm tra xác nhận đó Điều gì thực ra happened — từ thô phản hồi, không trình duyệt.
là trang prerendered/SSR’d (nội dung trong thô HTML)?
đơn giản curl chạy không JavaScript, so nó sees chính xác Điều gì non-kết xuất crawler
sees.
macOS / Linux
# Raw HTML as the host sends it (no JS executed)
curl -sL "https://example.com/your-page/" -o raw.html
grep -o "Your unique headline text" raw.html # empty = CSR shell, not prerenderedWindows (PowerShell)
Invoke-WebRequest -Uri "https://example.com/your-page/" -OutFile raw.html
Select-String -Path raw.html -Pattern "Your unique headline text"là TTFB fast (hoặc là function cold-starting)?
TTFB feeds LCP và crawl capacity, so đo lường nó. Hit URL cold, sau đó warm:
# Time to first byte, twice — a big first number then a small one = cold start
for i in 1 2; do
curl -s -o /dev/null -w "TTFB: %{time_starttransfer}s\n" "https://example.com/your-page/"
doneprerendered/static trang nên là consistently thấp. lớn đầu tiên giá trị đó drops on thứ hai hit là kinh điển serverless/edge cold bắt đầu.
là điều này route prerendered hoặc phân phối dynamically?
Static hosts và CDNs thường reveal nó trong các header (bộ nhớ đệm status, age,
x-vercel-cache, cf-cache-status):
curl -sI "https://example.com/your-page/" | grep -iE "cache|age|x-vercel|cf-"HIT (hoặc nonzero age) có nghĩ là bạn’re là phân phối được lưu đệm/prerendered nội dung;
MISS/DYNAMIC on mỗi yêu cầu có nghĩ là nó kết xuất theo yêu cầu.
Làm sitemap thực ra exist và trả về XML?
Since SvelteKit không generate một, verify yours là thực sự ở đó với right nội dung loại:
curl -sI "https://example.com/sitemap.xml" | grep -iE "HTTP/|content-type"
# Want: 200 + content-type: application/xml (not text/html or a 404)DevTools console một-liner
Paste trong trình duyệt console để so sánh được kết xuất DOM so với Điều gì crawler cần —
nếu của bạn headline là ở đây nhưng bị thiếu từ curl output trên, nó
client-được kết xuất:
// Is the content in the DOM, and does the sitemap resolve?
console.log('headline in DOM:', document.body.innerText.includes('Your unique headline text'));
fetch('/sitemap.xml').then(r => console.log('sitemap status:', r.status, r.headers.get('content-type')));kiểm tra robots.txt không phải blocking bundle
curl -sL "https://example.com/robots.txt" | grep -iE "disallow.*(/_app|\.js|\.css)"Disallow matching /_app/ (SvelteKit bundled output) hoặc của bạn CSS có nghĩ là
engines có thể’t render trang — gần như luôn mistake.
Tools cho gỡ lỗi SvelteKit deployment SEO
- URL Inspection (Google Search Console) — nguồn của truth. Trực tiếp-kiểm thử URL và kiểm tra được kết xuất HTML, screenshot, và trang các tài nguyên để xác nhận nội dung và metadata là present và không có gì là blocked.
- PageSpeed Insights — SvelteKit tài liệu’ own được khuyến nghị tool; surfaces TTFB và Core Web Vitals (LCP/INP/CLS) đó của bạn adapter lựa chọn phần lớn ảnh hưởng.
- WebPageTest — waterfall + filmstrip cho diagnosing TTFB và cold-bắt đầu timing on edge/serverless deploys.
curl -w "%{time_starttransfer}"— quickest thô TTFB và cold-bắt đầu kiểm tra (see Scripts tab).- Host dashboards (Vercel / Cloudflare / Netlify phân tích) — function invocation được tính, cold-bắt đầu rates, và bộ nhớ đệm-hit ratios theo route — ground truth cho liệu edge/serverless là thực ra fast cho bạn.
- 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 trên trang web và xác nhận prerendered routes là hoàn tất.
- Ahrefs trang web Audit — surfaces bị thiếu/blocked sitemaps, chuyển hướng chains, hỏng canonicals, và indexability các vấn đề tại quy mô.
Tự kiểm tra: SvelteKit Deployment SEO
Five nhanh các câu hỏi on adapters, prerendering, và edge kết xuất trong SvelteKit. 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 đủ reference on kết xuất modes (SSR, static kết xuất, prerendering, và CSR pitfalls) đó underpin mỗi adapter decision ở đây. As I put nó ở đó, bất kỳ kind của SSR, static kết xuất, hoặc prerendering setup là going để là fine Đối với tìm kiếm engines — mà là chính xác safety net behind những điều này adapter choices.
- Người mới bắt đầu Hướng dẫn để kỹ thuật SEO — nơi kết xuất, crawling, và Core Web Vitals fit trong bigger picture.
My speaking
- Cách Tìm kiếm Hoạt động (SlideShare) — my walkthrough of crawling, kết xuất, lập chỉ mục, và xếp hạng, mà là đó backdrop cho vì sao TTFB và kết xuất timing quan trọng. (My standing disclaimer áp dụng: “This is my understanding of systems… not going to be 100% complete or accurate.” (bản dịch) «Này là my understanding of các hệ thống… không going để là 100% hoàn tất hoặc chính xác.»)
Từ khoảng đó ngành
- Adapters • SvelteKit Tài liệu — đó có thẩm quyền overview of mỗi chính thức adapter và cách họ là specified trong
svelte.config.js. - Trang options (prerender, ssr, csr, config) • SvelteKit Tài liệu — đó theo-route
prerendercác giá trị, đóentriesfunction, và theo-routeconfigincludingruntime: 'edge', trong đó team own words. - Vercel (adapter-vercel) • SvelteKit Tài liệu — đó edge runtime, regions, và đó ISR-so với-prerender caveat.
- Cloudflare (adapter-cloudflare) • SvelteKit Tài liệu — Workers/Các trang deployment, bindings, và đó
fslimitation. - SvelteKit • Cloudflare Các trang tài liệu — đó deployment mechanics và
platformbindings từ Cloudflare’s side. - SvelteKit SEO: Của bạn Secret Weapon (Okupter) — một practitioner hướng dẫn để prerendering, meta tags, và đó
+server.jssitemap/RSS pattern. - MỘT Deep Dive vào SvelteKit Kết xuất Techniques (Này Dot Labs) — SSR/SSG/CSR mechanics và theo-route/theo-layout config, với đó “SSR can be expensive” (bản dịch) «SSR có thể là expensive» máy chủ-load tradeoff.
- Understand JavaScript SEO Basics (Google Search Central) — đó render queue và “not all bots can run JavaScript,” (bản dịch) «không all bots có thể chạy JavaScript,» đó chung hướng dẫn mỗi adapter lựa chọn sits dưới.
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.