Panduan Qwik SEO
Bagaimana Qwik's resumability puts konten di HTML oleh default dan drives near-zero INP dan TBT — plus QwikCity patterns untuk meta tags, canonical URLs, JSON-LD, sitemaps, dan i18n itu membuat sebuah Qwik situs peringkat.
1 sinyal bukti di halaman ini
- Alat aktif terkaitPage Speed Test & Core Web Vitals Checker
Qwik adalah sebuah JavaScript kerangka kerja milik siapa core trick adalah resumability: server serializes app state, listeners, dan component tree ke HTML, so browser resumes tanpa hydrating (sebuah ~1 KB Qwikloader script masih berjalan — ini adalah tidak secara harfiah zero JS). untuk SEO itu's sebuah double win pada routes itu adalah sebenarnya server-dirender — konten adalah di HTML oleh default (crawler see ini immediately, Tidak render-wave delay) dan INP/TBT trend toward zero karena Tidak hydration blocks main utas pada muat; konfirmasi keduanya dengan data lapangan alih-alih assuming them. QwikCity, meta-kerangka kerja, lets Anda mix SSR dan SSG per route, plus routeLoader$() untuk server-side data dan sebuah head export untuk judul/meta/OG/canonical/JSON-LD — semua server-dirender. Basic SEO berfungsi out dari box; main discipline adalah menggunakan routeLoader$() untuk dynamic metadata, tidak client-side effects. catch adalah sebuah lebih kecil ecosystem daripada React/Vue, dan — sebagai dari ini writing — Qwik adalah pada -nya v2 line, saat ini di beta.
TL;DR — Qwik adalah sebuah JavaScript kerangka kerja itu melakukan sesuatu unusual: ini mengirim finished HTML dan lalu berjalan hampir Tidak JavaScript ketika halaman memuat. sebagian besar kerangka kerja memiliki untuk “hydrate” (terjemahan) “hydrate” — re-jalankan mereka code di Anda browser untuk wake halaman up — dan Qwik skips itu entirely oleh resuming dari data baked ke HTML. untuk SEO itu berarti crawler see Anda penuh konten right away, dan halaman score well pada speed metrics Google measures.
Apa Qwik adalah
sebagian besar popular kerangka kerja (React, Vue, Angular) bangun lot dari halaman di Anda browser. bahkan ketika server mengirim finished HTML, kerangka kerja biasanya memiliki untuk hydrate ini — download -nya code dan re-jalankan ini di Anda browser untuk membuat buttons dan menus berfungsi. itu hydration langkah adalah satu dari biggest alasan halaman feel slow: ini ties up browser right ketika Anda’re trying untuk gunakan halaman.
Qwik attacks itu masalah head-pada dengan sebuah idea called resumability. pada server, Qwik renders HTML dan menulis semuanya halaman perlu untuk pertahankan berfungsi — -nya state, yang clicks melakukan apa, structure dari halaman — straight ke HTML. Ketika halaman memuat di Anda browser, Qwik tidak re-jalankan apa pun. ini resumes dari itu saved informasi, so ini tidak re-executing Anda components — tetapi ini tidak secara harfiah zero JavaScript either. sebuah tiny (~1 KB) loader script called Qwikloader melakukan jalankan pada muat; ini hanya listens untuk clicks alih-alih rebuilding halaman. Bukti untuk klaim ini Qwik serializes application state into HTML and resumes without eagerly re-executing the application on startup. Cakupan: Qwik resumability; exact JavaScript transferred depends on the application. Tingkat keyakinan: tinggi · Diverifikasi: Qwik: Resumable ini hanya fetches rest dari code ini perlu moment Anda sebenarnya click sesuatu.
QwikCity adalah penuh toolkit dibangun pada top dari Qwik — ini adalah untuk Qwik apa Berikutnya.js adalah untuk React. ini memberikan Anda halaman routing, server rendering, dan sebuah bersih place untuk set Anda judul dan meta tags. jika Anda’re melakukan SEO pada sebuah Qwik situs, Anda’re hampir certainly menggunakan QwikCity.
Mengapa ini adalah baik untuk SEO
Dua alasan:
- Anda konten adalah di HTML. Karena Qwik renders semuanya pada server dan tidak pernah perlu untuk render again di browser, text dan tautan Google perlu adalah right di sana di halaman sumber. Google tidak memiliki untuk melakukan apa pun tricky untuk see Anda konten — yang adalah seluruh game di JavaScript SEO. itu’s benar ketika route adalah sebenarnya server-dirender (SSR atau SSG) — periksa mentah HTML dengan view-sumber pada Anda own deployed halaman alih-alih assuming ini dari kerangka kerja alone.
- halaman adalah fast dan responsive. dengan very little JavaScript berjalan pada muat, halaman reacts untuk clicks quickly (baik INP) dan browser tidak blocked. Core Web Vitals reward persis itu, so ini adalah sebuah nyata — jika biasanya kecil — advantage. ini adalah sebuah structural head mulai, tidak sebuah jaminan; konfirmasi ini dengan data lapangan pada Anda own situs rather daripada assuming angka.
Apa Anda masih memiliki untuk melakukan
“Berfungsi out dari itu box” (terjemahan) “berfungsi out dari box” tidak berarti “lakukan tidak ada apa pun.” (terjemahan) “melakukan tidak ada apa pun.” big satu: set Anda judul,
deskripsi, dan lainnya meta tags menggunakan QwikCity’s head export pada setiap halaman,
dan untuk halaman dengan dynamic data (blog posts, product halaman) pull itu data
server-side dengan routeLoader$() so meta tags end up di HTML — tidak
ditambahkan kemudian oleh JavaScript. Bukti untuk klaim ini Qwik City routes can provide page metadata through a head export, and routeLoader$ loads route data on the server. Cakupan: Qwik City metadata and loaders. Tingkat keyakinan: tinggi · Diverifikasi: Qwik City: Head Qwik City: Route loaders Mendapatkan itu right dan sebagian besar dari Qwik SEO takes care dari
itself.
ingin nyata mechanics — bagaimana resumability berfungsi, tepat QwikCity patterns untuk meta tags, canonical URLs, data terstruktur, dan sitemaps, plus pitfalls? Switch untuk Advanced tab.
TL;DR — Qwik’s core innovation adalah resumability: di SSR time ini serializes event listeners (sebagai HTML attributes), component tree (di HTML comments), dan app state (di sebuah
qwik/jsonscript) ke HTML, so browser resumes alih-alih hydrating — sebuah ~1 KB Qwikloader script masih berjalan, so ini adalah tidak secara harfiah zero JS. itu’s categorically berbeda dari React/Vue/Angular/SolidJS, yang semua hydrate. pada routes itu adalah sebenarnya server-dirender, SEO payoff adalah twofold: konten adalah di HTML oleh default (Tidak render-wave delay untuk crawler) dan INP/TBT trend toward zero karena Tidak hydration blocks main utas pada muat — verify keduanya dengan field data alih-alih assuming them. QwikCity adalah meta-kerangka kerja — SSR dan SSG dapat menjadi mixed per route, tidak chosen setelah untuk seluruh project. Metadata lives diheadexport (judul, meta, OG, canonical, JSON-LD), fed olehrouteLoader$()untuk server-side data. Sitemaps adalah automatic di SSG (untuk routes sebenarnya dibangun) dan sebuah dynamic route di SSR. Qwik adalah saat ini pada -nya v2 line (beta) sebagai dari ini writing. honest caveat: ecosystem adalah newer dan lebih kecil daripada React’s.
Resumability: core idea (dan mengapa SEO cares)
Qwik adalah dibangun oleh Miško Hevery — creator dari Angular — di builder.io, dan -nya seluruh alasan untuk exist adalah untuk kill hydration. (sebagai dari ini writing, Qwik adalah pada -nya v2 line, saat ini di beta — periksa API surface terhadap Anda installed versi sebelum copying code dari apa pun sumber, including ini satu.) Hydration adalah apa setiap mainstream kerangka kerja melakukan setelah SSR: ini downloads component code dan re-executes ini di browser untuk attach event handlers dan rebuild internal state. sebagai Hevery puts ini, “Hydration adalah ketika an application adalah downloaded dan executed twice, setelah sebagai HTML dan again sebagai JavaScript.” (terjemahan) “Hydration adalah ketika sebuah application adalah downloaded dan executed twice, setelah sebagai HTML dan again sebagai JavaScript.” itu kedua execution adalah pure overhead — halaman looks ready tetapi tidak interactive, dan main utas adalah blocked.
Qwik alih-alih serializes three hal ke HTML di SSR time:
- Event listeners — encoded sebagai HTML attributes (e.g.
on:click="./chunk.js#symbol"). sebuah tiny inline script ( Qwikloader, ~1 KB) attaches satu global listener, membaca encoded chunk/symbol pada sebuah event, dan downloads hanya itu handler code pada demand. - Component tree structure — encoded di HTML comments, so Qwik dapat rebuild hierarchy tanpa executing component code.
- Application state — serialized ke sebuah
<script type="qwik/json">block, so apa pun component dapat resume tanpa -nya parent menjadi present.
Ketika halaman memuat, Qwik tidak re-jalankan Anda components. Bukti untuk klaim ini Qwik resumability restores listeners and application state without rerunning component initialization on page startup. Cakupan: Qwik resumability model. Tingkat keyakinan: tinggi · Diverifikasi: Qwik: Resumable sebagai docs put ini, “Resumability adalah a way untuk a kerangka kerja untuk recover its state tanpa re-executing itu application components pada itu client.” (terjemahan) “Resumability adalah sebuah cara untuk sebuah kerangka kerja untuk recover -nya state tanpa re-executing application components pada client.” hasil, di docs’ kata: “Qwik apps berfungsi instantly tanpa any delay karena they jangan perlu hydration, regardless dari mereka size atau complexity.” (terjemahan) “Qwik apps berfungsi instantly tanpa apa pun delay karena mereka jangan perlu hydration, regardless dari mereka size atau complexity.”
ini adalah tidak Islands Architecture (Astro). Islands masih hydrate setiap island individually. Qwik hydrates tidak ada apa pun — ada Tidak per-island hydration cost karena ada Tidak hydration di semua.
Apa crawler sebenarnya menerima
Karena Qwik pre-renders semuanya server-side dan tidak pernah re-renders pada
client, ** HTML Googlebot fetches sudah berisi Anda menyelesaikan konten** —
text, tautan, heading, lot — untuk sebuah route itu’s sebenarnya dirender pada
server. rendering adalah sebuah per-route decision di QwikCity (SSR, SSG, atau sebuah mix); sebuah
route left di client-hanya mode, atau konten fetched dari sebuah client-side effect
alih-alih routeLoader$(), tidak mendapatkan ini benefit hanya karena project
menggunakan Qwik. Google memproses JavaScript di dua waves (HTML pertama, lalu sebuah deferred
render lulus itu dapat lag hours untuk days). sebuah heavily client-dirender app risks
konten hanya menunjukkan up di itu kedua wave. sebuah properly server-dirender Qwik
route sidesteps itu risk: ada Tidak render-queue delay karena konten adalah
tidak pernah menunggu pada client JS di pertama place. Treat “Qwik halaman behave like
static HTML untuk crawlers” (terjemahan) “Qwik halaman behave like
static HTML untuk crawler” sebagai architecture’s intent, lalu konfirmasi ini pada Anda
deployed URLs dengan view-sumber — safest posture untuk
JavaScript SEO adalah verifying respons, tidak
trusting kerangka kerja label.
Bing berfungsi yang sama cara — sebuah dua-wave model itu prefers server-dirender HTML untuk efficiency. Qwik’s HTML-pertama output benefits keduanya mesin untuk yang sama alasan.
Core Web Vitals: sebuah structural advantage
Google menggunakan data lapangan (CrUX) untuk pengalaman halaman sinyal, dan INP replaced FID sebagai sebuah Core Web Vital di March 2024. Di sini’s di mana Qwik’s architecture pays off secara langsung: dengan Qwikloader sebagai satu-satunya script berjalan pada muat — docs note situs “dapat boot dengan tentang 1kb dari JS (regardless dari application complexity)” (terjemahan) “dapat boot dengan tentang 1kb dari JS (regardless dari application complexity)” — ada hampir tidak ada apa pun untuk block main utas. Total Blocking Time trends toward zero dan INP tetap rendah karena ada Tidak hydration lulus competing dengan pengguna’s pertama interactions. sebuah bigger Qwik app tidak berarti sebuah bigger startup bill; JavaScript adalah fetched lazily, per interaction, tidak sebagai satu boot bundle.
itu’s perbedaan dari established kerangka kerja. Berikutnya.js, Nuxt, dan Angular SSR semua put konten di HTML too — mereka’re tidak buruk untuk SEO — tetapi mereka carry sebuah hydration cost itu scales dengan app. Qwik menghapus itu cost oleh design.
itu’s architectural expectation, tidak sebuah diukur hasil. ini tidak jaminan sebuah spesifik INP, TBT, atau CrUX score untuk Anda situs — ketiga-party scripts, analytics tags, dan per-route data-fetching cost dapat semua eat ke advantage. Konfirmasi ini dengan data lapangan (CrUX, Search Console’s Core Web Vitals report) pada Anda own deployed URLs sebelum membuat sebuah performa claim untuk sebuah client atau stakeholder; see cara mengukur tab untuk spesifik KPIs dan cadence.
Meta tags dan document head
di QwikCity, halaman metadata lives di sebuah head export dari setiap route file. untuk
static metadata ini adalah sebuah constant: Bukti untuk klaim ini Qwik City route modules can export a DocumentHead value or function for route metadata. Cakupan: Qwik City route metadata. Tingkat keyakinan: tinggi · Diverifikasi: Qwik City: Head
export const head: DocumentHead = {
title: 'Qwik SEO Guide',
meta: [
{ name: 'description', content: 'How Qwik resumability helps SEO.' },
{ property: 'og:title', content: 'Qwik SEO Guide' },
{ property: 'og:description', content: 'Resumability, meta tags, sitemaps.' },
],
links: [
{ rel: 'canonical', href: 'https://example.com/qwik-seo/' },
],
};semua dari ini adalah dirender server-side ke <head>, so ini adalah di HTML
crawler sees. canonical pattern — links: [{ rel: 'canonical', href: '...' }]
— adalah easy untuk miss tetapi adalah right place untuk ini.
untuk dynamic metadata (blog posts, products), SEO-critical pattern adalah
routeLoader$(). ini berjalan server-side sebelum HTML respons, dan head
export dapat menjadi a function itu menerima itu resolved loader value:
export const usePost = routeLoader$(async ({ params }) => {
return await getPost(params.slug); // runs on the server
});
export const head: DocumentHead = ({ resolveValue }) => {
const post = resolveValue(usePost);
return {
title: post.title,
meta: [{ name: 'description', content: post.excerpt }],
links: [{ rel: 'canonical', href: `https://example.com/blog/${post.slug}/` }],
};
};ini adalah QwikCity’s equivalent dari getServerSideProps. discipline itu penting
untuk SEO: fetch metadata data dengan routeLoader$(), tidak di sebuah client-side
effect (useSignal()/useResource$() itu jalankan di browser). jika Anda atur
judul dari sebuah client effect, ini tidak akan menjadi di pertama-wave HTML.
data terstruktur (JSON-LD)
JSON-LD goes di head export’s scripts array, dirender inline di
<head> server-side dan fully dapat di-crawl:
export const head: DocumentHead = ({ resolveValue }) => {
const post = resolveValue(usePost);
return {
title: post.title,
scripts: [
{
props: { type: 'application/ld+json' },
script: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Article',
headline: post.title,
datePublished: post.date,
}),
},
],
};
};Karena ini adalah serialized ke HTML respons, ada Tidak rendering delay sebelum
markup adalah tersedia untuk crawler. Satu setup detail itu’s easy untuk miss:
scripts field hanya produces output jika Anda project’s router-head component
sebenarnya renders head.scripts (typically melalui dangerouslySetInnerHTML) — ini adalah
tidak automatic hanya karena Anda populated array. jika sebuah starter template’s
router-head.tsx tidak sudah loop di atas head.scripts, tambahkan itu sebelum
trusting JSON-LD menampilkan up di respons.
Sitemaps dan robots.txt
- SSG membangun:
sitemapOutFileconfig option auto-generatessitemap.xmlselama static bangun — tetapi ini hanya mencakup routes itu adalah sebenarnya dibangun. sebuah route excluded dari static bangun (dynamic params Anda tidak pre-render, sebuah halaman gated behind sebuah condition) tidak akan menjadi di sitemap bahkan though ini ada. - SSR situs: ada Tidak automatic sitemap — tambahkan sebuah route di
src/routes/sitemap.xml/index.tsdengan sebuahRequestHandleritu membangun dan mengembalikan XML dynamically. robots.txt: drop ini di/public/so ini adalah disajikan di root.- Canonical dan sitemap URLs keduanya bergantung pada
origin. QwikCity membangun absolute URLs dari configuredorigin/base(atau sebuah forwarded-header origin di SSR middleware). sebuah wrong atau leaked preview/staging origin di itu configuration produces wrong canonicals dan sitemap entries di production — periksa sebenarnya output, tidak hanya config file, setelah apa pun adapter atau deployment perubahan.
SEO internasional
Dua mechanisms, digunakan together:
rewriteRoutesdi QwikCity config maps localized URL paths untuk Anda routes tanpa duplicating components (e.g./it/documentazione/→/docs/). ini memberikan Anda bersih, localized URLs — foundation untuk sebuah international struktur URL.- Qwik Speak (sebuah terpisah library) menangani konten translation.
- hreflang tags go di
headexport’slinksarray, pointing setiap locale di -nya alternates. See SEO internasional dan hreflang untuk cross-mesin aturan.
SSR vs. SSG untuk SEO
Keduanya put konten di HTML, so keduanya adalah crawler-safe — dan QwikCity lets Anda mix modes per route, tidak hanya setelah untuk seluruh project. Choose per route oleh konten shape:
- SSG (static adapter) produces pure HTML files, Tidak server needed — ideal untuk konten itu tidak perubahan per permintaan. Automatic sitemap (untuk routes itu adalah sebenarnya dibangun), cheapest hosting, fastest TTFB dari sebuah CDN. tradeoff adalah freshness: konten hanya memperbarui pada berikutnya bangun, dan sebuah route itu fails untuk bangun sekadar tidak di sana.
- SSR renders per permintaan — needed untuk personalized atau frequently mengubah
data. Jalankan ini di edge (Cloudflare, Vercel, Netlify) untuk rendah TTFB, dan set
Cache-Controlheaders pada SSR respons so CDN dapat sajikan repeats tanpa re-rendering. tradeoff adalah itu sebuah failure di permintaan time (sebuah slow atau erroredrouteLoader$()) memengaruhi langsung respons, so tambahkan error menangani untuk data fetch alih-alih letting ini surface sebagai sebuah rusak halaman.
Neither mode adalah “more SEO-safe” (terjemahan) “lebih SEO-safe” daripada lainnya oleh default — pick per route based pada bagaimana sering konten perubahan dan apa happens jika data sumber adalah briefly tidak tersedia, lalu verify deployed respons either cara.
Apa untuk watch out untuk
- Tidak semuanya serializes. Class instances, promises, dan streams dapat’t menjadi
put ke HTML state. Code itu touches them memiliki untuk jalankan client-hanya — pertahankan ini
out dari apa pun itu perlu untuk menjadi di server HTML (terutama metadata). jika Anda
dengan sengaja exclude sebuah nilai dengan
noSerialize(), remember ini muncul back sebagaiundefinedsetelah app resumes pada client — jangan reach untuk ini pada apa pun halaman masih perlu untuk baca post-resume, including metadata paths. useVisibleTask$()adalah sebuah nyata escape hatch, gunakan ini sparingly. ini berjalan eagerly pada client setelah awal render — satu hook itu dengan sengaja berfungsi terhadap resumability. ini tidak block rendering atau hurt awal HTML, tetapi ini melakukan berarti client JS adalah berjalan itu Qwik akan jika tidak memiliki deferred. Fine untuk genuinely client-hanya berfungsi (sebuah chart library, sebuah map); wrong pilihan untuk apa pun itu seharusnya menjadi feeding server-dirender metadata.- Verify meta tags adalah di sumber, tidak injected oleh JS. View-sumber (tidak hanya
DevTools’ dirender DOM) seharusnya tampilkan Anda judul, canonical, dan JSON-LD. jika mereka
hanya muncul di dirender DOM, Anda set them dari sebuah client effect alih-alih
headexport /routeLoader$(). routeLoader$()vs.useResource$()/useSignal(). Loaders jalankan pada server dan feedhead; others dapat jalankan di browser. untuk apa pun itu harus menjadi di metadata atau pertama-wave HTML, gunakan loader.- Lebih kecil ecosystem. Qwik memiliki far fewer CMS connectors dan SEO plugins daripada Berikutnya.js, dan sebuah lebih kecil community untuk draw pada. kerangka kerja adalah capable; Anda’ll hanya tulis lebih glue yourself. builder.io’s own situs berjalan pada Qwik, so ini adalah digunakan di production — tetapi go di eyes-open tentang maturity kesenjangan.
Di mana ini sits
Qwik adalah satu dari dua kerangka kerja di JavaScript kerangka kerja story — lainnya menjadi SolidJS. key pembedaan untuk pertahankan straight: Qwik resumes; SolidJS (dan React, Vue, Angular) hydrate. Keduanya masih output konten-rich HTML melalui mereka meta-kerangka kerja, so crawling adalah fine either cara; resumability angle adalah apa membuat Qwik’s INP/TBT profile structurally best dari group. untuk metric side, see Core Web Vitals; untuk foundations, JavaScript SEO hub.
AI summary
sebuah condensed take pada Advanced versi:
- Qwik = resumability. di SSR ini serializes event listeners (HTML attributes),
component tree (HTML comments), dan state (sebuah
qwik/jsonscript) ke HTML, so browser resumes alih-alih hydrating. ini adalah categorically berbeda dari React/Vue/Angular/SolidJS, yang semua hydrate. ini adalah pada -nya v2 line (saat ini beta) sebagai dari ini writing — periksa API terhadap Anda installed versi. - konten adalah di HTML oleh default — untuk routes itu adalah sebenarnya server- dirender. SSR/SSG adalah sebuah per-route decision di QwikCity, tidak sebuah project-wide jaminan. Tidak client re-render langkah pada itu routes → crawler mendapatkan menyelesaikan konten dengan Tidak render-wave delay. Konfirmasi pada Anda own deployed URLs dengan view-sumber alih-alih assuming ini dari kerangka kerja alone.
- CWV adalah sebuah structural head mulai, tidak sebuah jaminan. situs boot dengan ~1 KB dari JS ( Qwikloader — nyata JS itu melakukan jalankan, tidak zero) regardless dari complexity, so TBT trends toward ~0 dan INP tetap rendah ketika tidak ada apa pun else pada halaman adalah blocking utas. Konfirmasi dengan data lapangan (CrUX / Penelusuran Console) — ketiga-party scripts dan route-tingkat data-fetching cost dapat offset advantage.
- QwikCity adalah meta-kerangka kerja (Berikutnya.js untuk Qwik): SSR/SSG mixed per route,
file-sistem routing,
routeLoader$()untuk server-side data. - Metadata lives di
headexport — judul, meta, OG,canonical(dilinks), dan JSON-LD (discripts) — semua server-dirender. untuk dynamic halaman, membuatheadsebuah function fed olehrouteLoader$(); jangan set metadata dari client-side effects.scriptsfield hanya outputs jika Andarouter-headcomponent sebenarnya rendershead.scripts— periksa bahwa ini melakukan sebelum trusting JSON-LD menampilkan up. - Sitemaps: automatic di SSG (
sitemapOutFile, limited untuk routes sebenarnya dibangun); sebuah dynamicsrc/routes/sitemap.xml/index.tsroute di SSR.robots.txtgoes di/public/. Canonical dan sitemap URLs keduanya bergantung pada configuredorigin— sebuah leaked preview/staging origin breaks keduanya di production. - i18n:
rewriteRoutesuntuk localized URLs + Qwik Speak untuk konten; hreflang melaluihead.links. - Watch out: non-serializable data (class instances, promises, streams) adalah
client-hanya, dan sebuah
noSerialize()-wrapped nilai muncul backundefinedsetelah resume;useVisibleTask$()berjalan eagerly pada client dan seharusnya menjadi digunakan sparingly; verify meta tags adalah di view-sumber, tidak JS-injected; ecosystem adalah lebih kecil daripada React/Berikutnya.js.
Dokumentasi resmi
Utama-sumber documentation dari Qwik dan mesin pencari.
Qwik / QwikCity
- Qwik documentation — Overview — docs home; ~1 KB JS dan instant-memuat claims.
- Resumability — canonical explanation dari serialization mechanism dan mengapa ini tidak hydration.
- QwikCity overview — meta-kerangka kerja: routing, SSR/SSG, “Next.js for Qwik” (terjemahan) “Berikutnya.js untuk Qwik” framing.
- Routing — file-sistem routing,
Linkcomponent’s prefetch, dan route rewrites. - halaman / DocumentHead —
headexport,routeLoader$(), dynamic head, dan data terstruktur. - Sitemaps —
sitemap.xmlgeneration danrobots.txt. - Deployments — adapters, SSR/SSG platforms, dan cache headers.
- JavaScript SEO basics — dua-wave rendering dan lazy-dimuat konten di DOM.
- Core Web Vitals — CWV sebagai sebuah sinyal peringkat (INP, LCP, CLS).
Quotes dari sumber
pada—record framing dari Qwik’s creator dan official docs. Konfirmasi wording terhadap langsung halaman sebelum treating apa pun quote sebagai akhir.
Miško Hevery — creator dari Qwik, builder.io
- “Hydration adalah ketika an application adalah downloaded dan executed twice, setelah sebagai HTML dan again sebagai JavaScript.” (terjemahan) “Hydration adalah ketika sebuah application adalah downloaded dan executed twice, setelah sebagai HTML dan again sebagai JavaScript.” — “Resumability vs Hydration,” (terjemahan) “Resumability vs Hydration,” builder.io. Baca post
- “Resumability is a way for a framework to recover its state without re-executing the application components on the client.” (terjemahan) “Resumability adalah sebuah cara untuk sebuah kerangka kerja untuk recover -nya state tanpa re-executing application components pada client.” — “Resumability vs Hydration,” (terjemahan) “Resumability vs Hydration,” builder.io. Baca post
- “Hydration must execute before the app becomes interactive. Yes, the execution may be lazy, but the button will not process events until Hydration executes.” (terjemahan) “Hydration harus execute sebelum app becomes interactive. Ya, execution dapat menjadi lazy, tetapi button akan tidak proses events until Hydration executes.” — “Resumability vs Hydration,” (terjemahan) “Resumability vs Hydration,” builder.io. Baca post
«Qwik official docs (qwik.dev) » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh satu, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
- “Your sites and apps can boot with about 1kb of JS (regardless of application complexity).” (terjemahan) “Anda situs dan apps dapat boot dengan tentang 1kb dari JS (regardless dari application complexity).” — Qwik Docs, Overview. Sumber
- “Qwik apps work instantly without any delay because they don’t need hydration, regardless of their size or complexity.” (terjemahan) “Qwik apps berfungsi instantly tanpa apa pun delay karena mereka jangan perlu hydration, regardless dari mereka size atau complexity.” — Qwik Docs, Resumability. Sumber
- “QwikCity is to Qwik, as Next.js is to React, Nuxt is to Vue, SvelteKit to Svelte, and Analog is to Angular.” (terjemahan) “QwikCity adalah untuk Qwik, sebagai Berikutnya.js adalah untuk React, Nuxt adalah untuk Vue, SvelteKit untuk Svelte, dan Analog adalah untuk Angular.” — QwikCity Docs, Overview. Sumber
- “Thanks untuk Qwik’s resumability dan JavaScript streaming, di sana adalah Tidak additional cost untuk itu end user dari Qwik City. (zero JavaScript).” (terjemahan) “Thanks untuk Qwik’s resumability dan JavaScript streaming, tidak ada additional cost untuk end pengguna dari Qwik City. (zero JavaScript).” — QwikCity Docs, Overview. Sumber
Qwik SEO checklist
sebuah lulus untuk konfirmasi sebuah QwikCity situs adalah siapkan untuk peringkat:
«- [ ] You’re using QwikCity (the meta-framework) with SSR or SSG — not the bare library in client-only mode.
- View-source shows your real content and
<a href>links in the raw HTML (not an empty shell). - Dynamic page data is fetched with
routeLoader$()(server-side), not a client-side effect. - Title, description, and OG tags are set via the
headexport — and as a function fed byresolveValue()for dynamic pages. - Canonical URLs are in
head.linksas{ rel: 'canonical', href: '...' }. - JSON-LD is in
head.scriptswithtype: 'application/ld+json'. -
sitemap.xmlis configured —sitemapOutFilefor SSG, or asrc/routes/sitemap.xml/index.tsroute for SSR. -
robots.txtis in/public/. - Cache-Control headers are set on SSR responses (edge SSR for low TTFB).
- hreflang tags are in
head.linksif the site is multilingual; localized URLs viarewriteRoutes. - INP / LCP / CLS verified in the field (CrUX / Search Console), not just lab.
- No critical content depends on non-serializable (class instances, promises, streams) client-only code. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tujuh puluh delapan, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
mental models
«1. Resume, don’t replay. The single idea behind Qwik. Every other mainstream framework replays the app in the browser (hydration) to make SSR HTML interactive. Qwik resumes from state serialized into the HTML, executing ~zero JS on load. If you internalize one thing, make it this. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh dua, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
2. HTML adalah konten. Karena ada Tidak client render langkah, apa crawler fetches adalah finished halaman. ada Tidak kedua wave untuk tunggu pada, Tidak “melakukan it render?” (terjemahan) “melakukan ini render?” risk. Treat sebuah Qwik halaman like static HTML untuk crawl/indeks purposes.
3. server-side data → metadata.
chain itu decides apakah Anda meta tags adalah dapat di-crawl:
routeLoader$() (server) → head export function → HTML <head>. Break
chain oleh fetching di sebuah client effect dan Anda judul/OG/canonical fall out dari
pertama-wave HTML.
4. SSG vs. SSR adalah sebuah hosting/freshness panggil, tidak sebuah SEO panggil. Keduanya put konten di HTML. Pick SSG untuk static konten (free hosting, auto sitemap) dan SSR untuk per-permintaan data (jalankan ini di edge, cache respons). Crawlability adalah fine either cara.
5. performa win adalah INP/TBT, tidak crawlability. React/Berikutnya.js sudah SSR konten untuk crawler. Apa Qwik menambahkan adalah absence dari hydration tax — itu’s di mana -nya CWV advantage lives. jangan reach untuk Qwik untuk “perbaiki crawling React tidak dapat” (terjemahan) “perbaiki crawling React dapat’t”; reach untuk ini ketika responsiveness adalah lever.
Qwik SEO — cheat sheet
Di mana setiap SEO element goes (semua di head export)
| Element | Di mana | Pattern |
|---|---|---|
| judul | head.title | string (atau function untuk dynamic) |
| deskripsi meta / OG | head.meta | [{ name/property, content }] |
| Canonical | head.links | { rel: 'canonical', href: '...' } |
| hreflang | head.links | { rel: 'alternate', hreflang, href } |
| JSON-LD | head.scripts | { props: { type: 'application/ld+json' }, script } |
| Dynamic data | routeLoader$() | server-side; baca melalui resolveValue() |
SSG vs. SSR untuk SEO
| SSG (static adapter) | SSR | |
|---|---|---|
| konten di HTML | ✅ | ✅ |
| Sitemap | Auto (sitemapOutFile) | tambahkan sebuah /sitemap.xml route |
| Hosting | Static files / CDN | server / edge runtime |
| Best untuk | Stable konten | Per-permintaan / personalized |
| Caching | Inherent | Set Cache-Control yourself |
Resumability vs. hydration ( satu pembedaan itu penting)
| Hydration (React/Vue/Angular/SolidJS) | Resumability (Qwik) | |
|---|---|---|
| browser berfungsi pada muat | Re-execute components | Resume dari serialized state |
| JS pada muat | Scales dengan app | ~1 KB (Qwikloader) |
| TBT / INP | Lebih tinggi | Near-zero |
| konten di HTML | Ya (dengan meta-kerangka kerja) | Ya (selalu) |
umum mistakes
- ❌ Setting meta tags dari sebuah client effect → tidak di pertama-wave HTML. gunakan
head+routeLoader$(). - ❌ Calling Qwik “lazy hydration” (terjemahan) “lazy hydration” → ini tidak hydrate di semua; ini resumes.
- ❌ Forgetting sebuah SSR sitemap → SSR memiliki Tidak auto sitemap; tambahkan route.
periksa Qwik’s generated HTML
poin BUILD_DIR di HTML output dari production bangun:
BUILD_DIR=dist
find "$BUILD_DIR" -name '*.html' -type f | while IFS= read -r file; do
titles=$(grep -Eio '<title>[^<]*</title>' "$file" | wc -l | tr -d ' ')
canonicals=$(grep -Eio '<link[^>]+rel=["'"']canonical["'"'][^>]*>' "$file" | wc -l | tr -d ' ')
descriptions=$(grep -Eio '<meta[^>]+name=["'"']description["'"'][^>]*>' "$file" | wc -l | tr -d ' ')
if [ "$titles" -ne 1 ] || [ "$canonicals" -ne 1 ] || [ "$descriptions" -ne 1 ]; then
printf '%s\ttitle=%s\tcanonical=%s\tdescription=%s\n' "$file" "$titles" "$canonicals" "$descriptions"
fi
doneini catches routes milik siapa Qwik City head function adalah missing atau duplicated. ini melakukan tidak replace memeriksa field performa dan dirender konten pada deployed URLs.
alat untuk auditing sebuah Qwik situs
- View-sumber (
view-source:di browser) — fastest periksa: adalah Anda konten, judul, canonical, dan JSON-LD sebenarnya di mentah HTML, atau hanya di dirender DOM? - Google Search Console — pemeriksaan URL — konfirmasi dirender HTML matches
sumber: konten present, Tidak JS-injected
noindex, canonical resolved. - PageSpeed Insights / CrUX — field Core Web Vitals (INP, LCP, CLS). ini adalah di mana Qwik’s resumability advantage seharusnya sebenarnya tampilkan up.
- Chrome DevTools (performa / Lighthouse) — lab TBT dan main-utas berfungsi; konfirmasi near-zero startup JS dalam praktik.
- Rich hasil Test — validate JSON-LD Anda ditambahkan melalui
head.scripts. - situs crawler (Ahrefs situs Audit, Screaming Frog) — crawl dirender situs untuk periksa judul, canonicals, hreflang, dan tautan internal di scale.
Mistakes orang sebenarnya membuat pada Qwik
Resumability menghapus sebagian besar dari JS-SEO risk itu trips up lainnya kerangka kerja, tetapi ini adalah nyata cara tim masih shoot themselves di foot pada Qwik.
Setting metadata dari sebuah client-side effect
** mistake:** pulling sebuah post’s judul atau deskripsi ke sebuah useSignal() atau
useResource$() itu berjalan di browser, lalu trying untuk atur halaman judul dari
itu nilai.
Mengapa ini adalah wrong: apa pun computed client-side berjalan setelah server mengirim -nya respons. ini tidak pernah membuat ini ke HTML Googlebot fetches pada pertama lulus — ini hanya menampilkan up di dirender DOM, yang adalah persis render-wave delay resumability adalah supposed untuk hindari Anda.
Apa untuk melakukan alih-alih: fetch data dengan routeLoader$() (server-side) dan
membuat route’s head export sebuah function fed oleh resolveValue(), sebagai ditampilkan di
Advanced tab. itu’s satu-satunya path itu lands metadata di pertama-wave
HTML.
Berjalan Qwik tanpa QwikCity
** mistake:** menggunakan bare Qwik library di client-hanya mode — Tidak meta- kerangka kerja, Tidak server rendering — karena “resumability doesn’t need hydration so it doesn’t need SSR either.” (terjemahan) “resumability tidak perlu hydration so ini tidak perlu SSR either.”
Mengapa ini adalah wrong: resumability mendeskripsikan apa happens setelah HTML ada. jika tidak ada apa pun renders HTML pada server di pertama place, ada tidak ada apa pun untuk resume — Anda’re back untuk sebuah empty shell untuk crawler, Tidak berbeda dari apa pun lainnya client-hanya SPA.
Apa untuk melakukan alih-alih: gunakan QwikCity (atau lainnya server-rendering adapter) untuk apa pun publik-facing. ini adalah apa sebenarnya produces server-dirender HTML itu memberikan Qwik -nya SEO advantage.
Assuming SSR mendapatkan sebuah automatic sitemap
** mistake:** shipping sebuah SSR Qwik situs dan expecting sitemap.xml untuk
exist karena ini “sekadar berfungsi” (terjemahan) “hanya berfungsi” di SSG bangun.
Mengapa ini adalah wrong: automatic sitemap adalah sebuah bangun-time fitur dari
static adapter (sitemapOutFile). SSR situs render per permintaan — ada Tidak
bangun langkah untuk generate sebuah static XML file dari, so tidak ada apa pun produces satu unless
Anda tambahkan ini.
Apa untuk melakukan alih-alih: tambahkan sebuah route di src/routes/sitemap.xml/index.ts dengan
sebuah RequestHandler itu membangun dan mengembalikan XML dynamically, sebagai covered di
Advanced tab.
Putting non-serializable data di apa pun server perlu untuk resume
** mistake:** storing sebuah class instance, sebuah open promise, atau sebuah stream
reference di state itu head export atau sebuah server-dirender component
bergantung pada.
Mengapa ini adalah wrong: Qwik’s serialization hanya menangani plain, serializable nilai — apa pun else dapat’t menjadi ditulis ke HTML di SSR time, yang breaks tepat mechanism (Resumability) itu membuat Qwik’s SEO story berfungsi.
Apa untuk melakukan alih-alih: pertahankan non-serializable objects client-hanya dan out dari
apa pun itu feeds metadata atau server-dirender markup. Convert untuk plain data
(sebuah resolved nilai, tidak promise atau class instance) sebelum ini touches
routeLoader$() atau head.
Calling Qwik “lazy hydration” (terjemahan) “lazy hydration” di sebuah client pitch atau audit note
** mistake:** describing Qwik’s perilaku sebagai sebuah lebih cepat atau lazier versi dari hydration ketika documenting sebuah audit atau briefing sebuah dev team.
Mengapa ini adalah wrong: ini sets wrong expectation — “lazy hydration” (terjemahan) “lazy hydration” implies browser eventually re-executes setiap component, hanya kemudian. Qwik tidak pernah re-executes components pada muat di semua; itu’s seluruh poin dari resumability, dan pembedaan perubahan apa Anda’d bahkan cari ketika sesuatu’s slow.
Apa untuk melakukan alih-alih: gunakan “resumes” (terjemahan) “resumes” dan “resumability,” (terjemahan) “resumability,” matching docs’ own terminology, dan periksa Qwikloader’s ~1 KB boot script di DevTools jika Anda perlu prove “no hydration” (terjemahan) “Tidak hydration” claim untuk sebuah skeptical stakeholder.
Standing KPIs untuk sebuah Qwik situs
ini adalah angka untuk track pada sebuah ongoing basis, tidak sebuah satu-time launch periksa — Qwik’s seluruh nilai proposition adalah sebuah performa dan crawlability story, so keduanya sides perlu sebuah metric.
INP (field)
Apa ini tells Anda: apakah nyata pengunjung adalah sebenarnya experiencing rendah-hydration-cost responsiveness Qwik adalah supposed untuk deliver. ini adalah metric Qwik’s architecture adalah sebagian besar secara langsung dibangun untuk win.
cara pull ini: Google Search Console’s Core Web Vitals report, CrUX, atau Patrick’s CWV Checker / Core Web Vitals History & Pesaing Perbandingan untuk sebuah per-URL atau per-origin field baca.
Benchmark / realistic range: Google’s published threshold adalah “good” (terjemahan) “baik” di atau di bawah 200ms, “memerlukan improvement” (terjemahan) “perlu improvement” 200–500ms, “poor” (terjemahan) “poor” di atas 500ms — yang sama threshold untuk setiap situs, tidak Qwik-spesifik. sebuah resumable situs dengan sebuah bersih Qwikloader boot seharusnya sit comfortably di “good,” (terjemahan) “baik,” tetapi sebuah bloated per-interaction chunk atau berat ketiga-party script dapat masih push ini up.
Cadence: monthly, atau setelah apa pun rilis itu perubahan interaction handlers; CrUX data itself adalah sebuah rolling 28-day window.
TBT (lab)
Apa ini tells Anda: bagaimana banyak main-utas berfungsi adalah happening pada muat di sebuah controlled test — ini adalah di mana Anda’d catch sebuah regression sebelum ini menampilkan up di field INP.
cara pull ini: Lighthouse atau Chrome DevTools’ performa panel, jalankan terhadap langsung URL (tidak localhost, di mana hasil skew rendah).
Benchmark / realistic range: ada Tidak universal “good Qwik” (terjemahan) “baik Qwik” angka —
ini bergantung pada apa pada halaman (ketiga-party scripts, image decode berfungsi,
route-tingkat routeLoader$() cost). Apa Anda’re memeriksa untuk adalah itu TBT
tetap near-zero relative untuk sebuah hydrating equivalent dari yang sama halaman, tidak
terhadap sebuah fixed target.
Cadence: sebelum/setelah apa pun deploy itu menambahkan sebuah ketiga-party script, analytics tag, atau baru interactive component.
terindeks halaman coverage
Apa ini tells Anda: apakah Google adalah sebenarnya crawling dan pengindeksan halaman Anda expect — practical proof itu “konten adalah di itu HTML oleh default” (terjemahan) “konten adalah di HTML oleh default” adalah translating ke pengindeksan, tidak hanya sebuah theoretical advantage.
cara pull ini: Search Console’s halaman pengindeksan report, filtered untuk Qwik situs’s URL prefix; cross-periksa terhadap Anda sitemap’s submitted-URL count.
Benchmark / realistic range: bergantung entirely pada situs size dan bagaimana banyak dari ini Anda intend untuk memiliki terindeks — ada Tidak fixed target. Track trend (terindeks count moving toward submitted count) alih-alih chasing sebuah spesifik angka.
Cadence: weekly selama dan setelah sebuah migration untuk Qwik; monthly setelah stable.
JS transferred pada muat
Apa ini tells Anda: apakah “boots dengan ~1 KB” (terjemahan) “boots dengan ~1 KB” claim adalah holding up di practice, atau apakah ketiga-party scripts dan oversized awal chunks memiliki eaten ke Qwik’s structural advantage.
cara pull ini: Network panel di Chrome DevTools, filtered untuk JS, pada sebuah cold muat dengan cache disabled.
Benchmark / realistic range: Qwikloader itself adalah roughly 1 KB; apa pun meaningfully lebih besar pada awal muat adalah coming dari sesuatu else pada halaman (analytics, ads, sebuah polyfill) — investigate alih-alih bandingkan terhadap sebuah fixed angka, since halaman-untuk-halaman variance adalah yang diharapkan.
Cadence: setelah apa pun perubahan untuk ketiga-party tags, analytics, atau shared layout components.
Uji pemahaman Anda: Qwik SEO
Five quick pertanyaan pada resumability dan getting sebuah QwikCity situs untuk peringkat. Pick sebuah jawaban untuk setiap, lalu periksa.
Resources worth Anda time
My related writing
- JavaScript SEO: sebuah Definitive Guide — rendering, DOM parity, dan getting JS-dibangun konten terindeks; foundation sebuah Qwik audit membangun pada.
- Core Web Vitals: sebuah Menyelesaikan Guide — apa INP, LCP, dan CLS mengukur dan bagaimana mereka factor ke SEO — metrics Qwik’s architecture optimizes.
- Beginner’s Guide untuk SEO teknis — di mana kerangka kerja pilihan dan rendering fit di bigger picture.
My speaking
- Bagaimana Penelusuran berfungsi (SlideShare) — my walkthrough dari crawling, rendering, pengindeksan, dan peringkat — pipeline sebuah Qwik situs memiliki untuk jelas. (My standing disclaimer applies: “Ini adalah my understanding dari sistem… tidak going untuk menjadi 100% menyelesaikan atau accurate.” (terjemahan) “ini adalah my understanding dari sistem… tidak going untuk menjadi 100% menyelesaikan atau accurate.”)
dari sekitar industry
- Qwik — Resumability — clearest utama-sumber explanation dari bagaimana serialization replaces hydration.
- QwikCity overview — meta-kerangka kerja: routing, SSR/SSG, loaders.
- Qwik — halaman / DocumentHead —
headexport,routeLoader$(), dynamic head, dan data terstruktur. - Qwik — Sitemaps — sitemap.xml generation dan robots.txt.
- Builder.io — Resumability vs Hydration — Miško Hevery pada mengapa hydration adalah “executed twice” (terjemahan) “executed twice” dan bagaimana resumability menghindari ini.
- Google — JavaScript SEO basics — dua-wave rendering dan apa crawler melakukan dengan JS.
- r/TechSEO — community untuk debugging kerangka kerja rendering dan pengindeksan pertanyaan.
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.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
Perbandingan lengkap tidak tersedia — tidak ada cuplikan sebelumnya yang diarsipkan untuk revisi ini.