Guide Qwik SEO
«How Qwik's resumability puts content in the HTML by default and drives near-zero INP and TBT — plus the QwikCity patterns for meta tags, canonical URLs, JSON-LD, sitemaps, and i18n that make a Qwik site rank.» _(Traduction)_ (Résumé en français du champ description : le texte source est conservé pour relecture francophone.)
1 indice probant sur cette page
- Outil en ligne associéPage Speed Test & Core Web Vitals Checker
«Qwik is a JavaScript framework whose core trick is resumability: the server serializes app state, listeners, and the component tree into the HTML, so the browser resumes without hydrating (a ~1 KB Qwikloader script still runs — it's not literally zero JS). For SEO that's a double win on routes that are actually server-rendered — content is in the HTML by default (crawlers see it immediately, no render-wave delay) and INP/TBT trend toward zero because no hydration blocks the main thread on load; confirm both with field data rather than assuming them. QwikCity, the meta-framework, lets you mix SSR and SSG per route, plus routeLoader$() for server-side data and a head export for title/meta/OG/canonical/JSON-LD — all server-rendered. Basic SEO works out of the box; the main discipline is using routeLoader$() for dynamic metadata, not client-side effects. The catch is a smaller ecosystem than React/Vue, and — as of this writing — Qwik is on its v2 line, currently in beta.» _(Traduction)_ (Résumé en français du champ tldr : le texte source est conservé pour relecture francophone.)
TL;DR — Qwik est a JavaScript framework que fait quelque chose unusual: il sends finished HTML et alors exécute presque aucun JavaScript quand lune page charge. La plupart frameworks ont à “hydrate” — re-exécuter leur code dans votre navigateur à wake lune page up — et Qwik skips que entirely par resuming depuis données baked dans le HTML. Pour le SEO que signifie robots d’exploration voir votre complet contenu correct away, et pages score bien on le speed metrics Google mesure.
Ce que Qwik is
La plupart popular frameworks (React, Vue, Angular) construire a lot de lune page dans votre navigateur. Même quand le serveur sends finished HTML, le framework généralement a à hydrate il — download son code et re-exécuter il dans votre navigateur à faire buttons et menus fonctionner. Que hydration étape est un de le biggest raisons pages feel lent: il ties up le navigateur correct quand vous êtes trying à utiliser lune page.
Qwik attacks que problème head-on avec an idea appelé resumability. On le serveur, Qwik renders le HTML et écrit tout lune page nécessite à garder fonctionnement — son state, qui clicks faire ce que, le structure de lune page — straight dans le HTML. Quand lune page charge dans votre navigateur, Qwik ne fait pas re-exécuter n’importe quoi. Il resumes depuis que enregistré information, donc il n’est pas re-executing votre components — mais il n’est pas literally zero JavaScript soit. A tiny (~1 KB) loader script appelé le Qwikloader fait exécuter on charger; il simplement listens pour clicks au lieu de rebuilding lune page. Preuve à l’appui de cette affirmation Qwik serializes application state into HTML and resumes without eagerly re-executing the application on startup. Portée : Qwik resumability; exact JavaScript transferred depends on the application. Niveau de confiance : élevé · Vérifié : Qwik: Resumable Il seulement récupère le rest de le code il nécessite le moment vous en réalité click quelque chose.
QwikCity est le complet toolkit construit on top de Qwik — c’est à Qwik ce que Suivant.js est à React. Il donne vous page routing, serveur rendu, et a clean placer à définir votre titles et meta balises. Si vous êtes doing SEO on a Qwik site, vous êtes presque certainly en utilisant QwikCity.
Pourquoi ce is bon pour le SEO
Two raisons:
- Votre contenu est dans le HTML. Parce que Qwik renders tout on le serveur et jamais nécessite à rendre à nouveau dans le navigateur, le texte et liens Google nécessite sont correct là dans lune page source. Google ne fait pas ont à faire n’importe quoi tricky à voir votre contenu — qui est le entier game dans JavaScript SEO. c’est vrai quand le route est en réalité serveur-rendu (SSR or SSG) — vérifier le raw HTML avec view-source on votre propre deployed pages plutôt que assuming il depuis le framework alone.
- Pages sont rapide et responsive. Avec very little JavaScript running on charger, lune page reacts à clicks quickly (bon INP) et le navigateur n’est pas bloqué. Core Web Vitals reward exactly que, donc c’est a réel — si généralement petit — advantage. c’est a structural head commencer, pas a guarantee; confirmer il avec champ données on votre propre site plutôt que assuming le number.
Ce que vous encore have to do
“Works out of the box” ne fait pas signifier “faire rien.” Le big un: définir votre titles,
descriptions, et autre meta balises en utilisant QwikCity’s head export on chaque page,
et pour pages avec dynamic données (blog posts, produit pages) pull que données
serveur-side avec routeLoader$() donc le meta balises fin up dans le HTML — pas
ajouté plus tard par JavaScript. Preuve à l’appui de cette affirmation Qwik City routes can provide page metadata through a head export, and routeLoader$ loads route data on the server. Portée : Qwik City metadata and loaders. Niveau de confiance : élevé · Vérifié : Qwik City: Head Qwik City: Route loaders Obtenir que correct et la plupart de Qwik SEO takes care de
itself.
Vouloir le réel mechanics — comment resumability fonctionne, le exact QwikCity patterns pour meta balises, URL canoniques, données structurées, et sitemaps, plus le pitfalls? Switch à le Avancé tab.
TL;DR — Qwik’s core innovation est resumability: à SSR temps il serializes event listeners (as HTML attributs), le component tree (dans HTML comments), et app state (dans a
qwik/jsonscript) dans le HTML, donc le navigateur resumes au lieu de hydrating — a ~1 KB Qwikloader script encore exécute, donc c’est pas literally zero JS. c’est categorically différent depuis React/Vue/Angular/SolidJS, qui tout hydrate. On routes que sont en réalité serveur-rendu, le SEO payoff est twofold: contenu est dans le HTML par par défaut (aucun rendre-wave delay pour robots d’exploration) et INP/TBT trend toward zero parce que aucun hydration bloque le principal thread on charger — vérifier les deux avec champ données plutôt que assuming les. QwikCity est le meta-framework — SSR et SSG peut être mixed per route, pas choisi une fois pour le entier project. Metadata lives dans leheadexport (titre, meta, OG, canonical, JSON-LD), fed parrouteLoader$()pour serveur-side données. Sitemaps sont automatic dans SSG (pour routes en réalité construit) et a dynamic route dans SSR. Qwik est currently on son v2 line (beta) as de ce writing. Le honest caveat: le ecosystem est newer et plus petit que React’s.
Resumability: le core idea (et pourquoi SEO cares)
Qwik était construit par Miško Hevery — le creator de Angular — à builder.io, et son entier raison à exist est à kill hydration. (As de ce writing, Qwik est on son v2 line, currently dans beta — vérifier le API surface contre votre installed version avant copying code depuis quelconque source, notamment ce un.) Hydration est ce que chaque mainstream framework fait après SSR: il downloads le component code et re-executes il dans le navigateur à attach event handlers et rebuild internal state. As Hevery puts il, “Hydration est quand an application est downloaded et executed twice, une fois as HTML et à nouveau as JavaScript.” Que deuxième execution est pure overhead — lune page semble ready mais n’est pas interactive, et le principal thread est bloqué.
Qwik à la place serializes three choses into the HTML at SSR temps:
- Event listeners — encoded as HTML attributs (e.g.
on:click="./chunk.js#symbol"). A tiny inline script (le Qwikloader, ~1 KB) attaches un mondial listener, lit le encoded chunk/symbol on an event, et downloads seulement que handler code on demand. - Component tree structure — encoded dans HTML comments, donc Qwik peut rebuild le hierarchy sans executing component code.
- Application state — serialized dans a
<script type="qwik/json">bloquer, donc quelconque component peut resume sans son parent étant présent.
Quand lune page charge, Qwik ne fait pas re-exécuter votre components. Preuve à l’appui de cette affirmation Qwik resumability restores listeners and application state without rerunning component initialization on page startup. Portée : Qwik resumability model. Niveau de confiance : élevé · Vérifié : Qwik: Resumable As le docs put il, “Resumability est a façon pour a framework à recover son state sans re-executing le application components on le client.” Le résultat, dans le docs’ words: “Qwik apps fonctionner instantly sans quelconque delay parce que ils ne pas besoin hydration, regardless de leur size or complexity.”
Ce is pas Islands Architecture (Astro). Islands encore hydrate chaque island individually. Qwik hydrates nothing — there’s aucun per-island hydration cost parce que there’s aucun hydration at tout.
Ce que robots d’exploration en réalité recevoir
Parce que Qwik pre-renders tout serveur-side et jamais re-renders on le
client, le HTML Googlebot récupère déjà contient votre complet contenu —
texte, liens, titres, le lot — pour a route c’est en réalité rendu on le
serveur. Rendu est a per-route décision dans QwikCity (SSR, SSG, or a mix); a
route left dans client-seulement mode, or contenu récupéré depuis a client-side effect
au lieu de routeLoader$(), ne fait pas obtenir ce avantage simplement parce que le project
utilise Qwik. Google processes JavaScript dans deux waves (HTML premier, alors a deferred
rendre réussir que peut lag hours à days). A heavily client-rendu app risques
contenu seulement showing up dans que deuxième wave. A correctement serveur-rendu Qwik
route sidesteps que risque: il y a aucun rendre-queue delay parce que le contenu était
jamais waiting on client JS dans le premier placer. Treat “Qwik pages behave comme
static HTML pour robots d’exploration” as le architecture’s intent, alors confirmer il on votre
deployed URLs avec view-source — le safest posture pour
JavaScript SEO est verifying la réponse, pas
trusting le framework étiquette.
Bing fonctionne le même façon — a deux-wave model que prefers serveur-rendu HTML pour efficiency. Qwik’s HTML-premier sortie avantages les deux moteurs pour le même raison.
«## Core Web Vitals: a structural advantage » (Traduction) (Résumé en français de la section vingt-six, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google uses field data (CrUX) for the Page Experience signal, and INP replaced FID as a Core Web Vital in March 2024. Here’s where Qwik’s architecture pays off directly: with the Qwikloader as the only script running on load — the docs note sites “can boot with about 1kb of JS (regardless of application complexity)” — there’s almost nothing to block the main thread. Total Blocking Time trends toward zero and INP stays low because there’s no hydration pass competing with the user’s first interactions. A bigger Qwik app doesn’t mean a bigger startup bill; the JavaScript is fetched lazily, per interaction, not as one boot bundle. » (Traduction) (Résumé en français de la section vingt-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
c’est le difference depuis le established frameworks. Suivant.js, Nuxt, et Angular SSR tout put contenu dans le HTML aussi — ils sont pas mauvais pour le SEO — mais ils carry a hydration coût que scales avec le app. Qwik supprime que coût par design.
c’est le architectural expectation, pas a mesuré résultat. Il ne fait pas guarantee a spécifique INP, TBT, or CrUX score pour votre site — tiers scripts, analytics balises, et per-route données-fetching coût peut tout eat dans le advantage. Confirmer il avec champ données (CrUX, Search Console’s Core Web Vitals rapport) on votre propre deployed URLs avant making a performances claim à a client or stakeholder; voir le Comment Mesurer tab pour le spécifique KPIs et cadence.
Meta balises et le document head
In QwikCity, page metadata lives in a head export from chaque route fichier. Pour
static metadata it’s a constant: Preuve à l’appui de cette affirmation Qwik City route modules can export a DocumentHead value or function for route metadata. Portée : Qwik City route metadata. Niveau de confiance : élevé · Vérifié : 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/' },
],
};Tout de ce est rendu serveur-side dans <head>, donc c’est dans le HTML le
robot d’exploration voit. Le canonical modèle — links: [{ rel: 'canonical', href: '...' }]
— est facile à miss mais est le correct placer pour il.
Pour dynamic metadata (blog posts, produits), le SEO-critical modèle est
routeLoader$(). Il exécute serveur-side avant le HTML réponse, et le head
export peut être a function ce receives le resolved loader valeur:
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}/` }],
};
};Ce est QwikCity’s equivalent de getServerSideProps. Le discipline que matters
pour le SEO: récupérer metadata données avec routeLoader$(), pas dans a client-side
effect (useSignal()/useResource$() que exécuter dans le navigateur). Si vous définir le
titre depuis a client effect, il ne va pas être dans le premier-wave HTML.
Données structurées (JSON-LD)
JSON-LD goes dans le head export’s scripts array, rendu inline dans
<head> serveur-side et entièrement crawlable:
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,
}),
},
],
};
};«Because it’s serialized into the HTML response, there’s no rendering delay before
the markup is available to crawlers. One setup detail that’s easy to miss: the
scripts field only produces output if your project’s router-head component
actually renders head.scripts (typically via dangerouslySetInnerHTML) — it’s
not automatic just because you populated the array. If a starter template’s
router-head.tsx doesn’t already loop over head.scripts, add that before
trusting the JSON-LD shows up in the response.
» (Traduction) (Résumé en français de la section quarante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Sitemaps and robots.txt » (Traduction) (Résumé en français de la section quarante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- SSG builds: the sitemapOutFile config option auto-generates sitemap.xml
during the static build — but it only includes routes that were actually built.
A route excluded from the static build (dynamic params you didn’t pre-render,
a page gated behind a condition) won’t be in the sitemap even though it exists.
» (Traduction) (Résumé en français de la section quarante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- SSR sites: there’s no automatic sitemap — add a route at
src/routes/sitemap.xml/index.ts with a RequestHandler that builds and returns
the XML dynamically.
» (Traduction) (Résumé en français de la section quarante-deux, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- robots.txt: drop it in /public/ so it’s served at the root.
» (Traduction) (Résumé en français de la section quarante-deux, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Canonical and sitemap URLs both depend on origin. QwikCity builds absolute
URLs from the configured origin/base (or a forwarded-header origin in SSR
middleware). A wrong or leaked preview/staging origin in that configuration
produces wrong canonicals and sitemap entries in production — check the actual
output, not just the config file, after any adapter or deployment change.
» (Traduction) (Résumé en français de la section quarante-deux, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«## International SEO » (Traduction) (Résumé en français de la section quarante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Two mechanisms, utilisé ensemble:
rewriteRoutesdans QwikCity config maps localized URL paths à votre routes sans duplicating components (e.g./it/documentazione/→/docs/). Ce donne vous clean, localized URLs — le foundation pour an international Structure d’URL.- Qwik Speak (a séparé library) handles contenu traduction.
- hreflang balises go dans le
headexport’slinksarray, pointing chaque locale à son alternates. Voir international SEO et hreflang pour le cross-moteur règles.
SSR vs. SSG pour le SEO
Les deux put contenu dans le HTML, donc les deux sont robot-sûr — et QwikCity lets vous mix modes per route, pas simplement une fois pour le entier project. Choisir per route par contenu shape:
- SSG (static adapter) produces pure HTML fichiers, aucun serveur nécessaire — ideal pour contenu que ne fait pas modifier per requête. Automatic sitemap (pour routes que étaient en réalité construit), cheapest hosting, fastest TTFB depuis a CDN. Le tradeoff est freshness: contenu seulement mises à jour on le suivant construire, et a route que fails à construire simplement n’est pas là.
- SSR renders per requête — nécessaire pour personalized or frequently modification
données. Exécuter il à le edge (Cloudflare, Vercel, Netlify) pour faible TTFB, et définir
Cache-Controlheaders on SSR réponses donc le CDN peut servir repeats sans re-rendu. Le tradeoff est que a échec à requête temps (a lent or erroredrouteLoader$()) affecte le actif réponse, donc ajouter erreur handling pour le données récupérer plutôt que letting il surface as a broken page.
«Neither mode is “more SEO-safe” than the other by default — pick per route based on how often the content changes and what happens if the data source is briefly unavailable, then verify the deployed response either way. » (Traduction) (Résumé en français de la section quarante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Ce que to watch out pour
«- Not everything serializes. Class instances, promises, and streams can’t be
put into the HTML state. Code that touches them has to run client-only — keep it
out of anything that needs to be in the server HTML (especially metadata). If you
deliberately exclude a value with noSerialize(), remember it comes back as
undefined after the app resumes on the client — don’t reach for it on
anything the page still needs to read post-resume, including metadata paths.
» (Traduction) (Résumé en français de la section cinquante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- useVisibleTask$() is a real escape hatch, use it sparingly. It runs
eagerly on the client after initial render — the one hook that deliberately
works against resumability. It doesn’t block rendering or hurt the initial
HTML, but it does mean client JS is running that Qwik would otherwise have
deferred. Fine for genuinely client-only work (a chart library, a map); wrong
choice for anything that should be feeding server-rendered metadata.
» (Traduction) (Résumé en français de la section cinquante et un, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Verify meta tags are in the source, not injected by JS. View-source (not just
DevTools’ rendered DOM) should show your title, canonical, and JSON-LD. If they
only appear in the rendered DOM, you set them from a client effect instead of the
head export / routeLoader$().
» (Traduction) (Résumé en français de la section cinquante et un, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- routeLoader$() vs. useResource$()/useSignal(). Loaders run on the
server and feed the head; the others can run in the browser. For anything that
must be in metadata or first-wave HTML, use the loader.
» (Traduction) (Résumé en français de la section cinquante et un, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Smaller ecosystem. Qwik has far fewer CMS connectors and SEO plugins than
Next.js, and a smaller community to draw on. The framework is capable; you’ll
just write more glue yourself. builder.io’s own site runs on Qwik, so it’s used
in production — but go in eyes-open about the maturity gap.
» (Traduction) (Résumé en français de la section cinquante et un, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
Où ce sits
Qwik est un de deux frameworks dans le JavaScript frameworks story — le autre étant SolidJS. Le clé distinction à garder straight: Qwik resumes; SolidJS (et React, Vue, Angular) hydrate. Les deux encore sortie contenu-rich HTML via leur meta-frameworks, donc exploration est fine soit façon; le resumability angle est ce que rend Qwik’s INP/TBT profile structurally le meilleur de le groupe. Pour le metric side, voir Core Web Vitals; pour le foundations, le JavaScript SEO hub.
AI summary
A condensed prendre on the Avancé version:
«- Qwik = resumability. At SSR it serializes event listeners (HTML attributes),
the component tree (HTML comments), and state (a qwik/json script) into the
HTML, so the browser resumes instead of hydrating. This is categorically
different from React/Vue/Angular/SolidJS, which all hydrate. It’s on its
v2 line (currently beta) as of this writing — check the API against your
installed version.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Content is in the HTML by default — for routes that are actually server-
rendered. SSR/SSG is a per-route decision in QwikCity, not a project-wide
guarantee. No client re-render step on those routes → crawlers get complete
content with no render-wave delay. Confirm on your own deployed URLs with
view-source rather than assuming it from the framework alone.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- CWV is a structural head start, not a guarantee. Sites boot with ~1 KB of
JS (the Qwikloader — real JS that does run, not zero) regardless of
complexity, so TBT trends toward ~0 and INP stays low when nothing else on
the page is blocking the thread. Confirm with field data (CrUX / Search
Console) — third-party scripts and route-level data-fetching cost can offset
the advantage.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- QwikCity is the meta-framework (Next.js for Qwik): SSR/SSG mixed per route,
file-system routing, routeLoader$() for server-side data.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Metadata lives in the head export — title, meta, OG, canonical (in
links), and JSON-LD (in scripts) — all server-rendered. For dynamic
pages, make head a function fed by routeLoader$(); don’t set metadata from
client-side effects. The scripts field only outputs if your router-head
component actually renders head.scripts — check that it does before trusting
the JSON-LD shows up.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Sitemaps: automatic in SSG (sitemapOutFile, limited to routes actually
built); a dynamic src/routes/sitemap.xml/index.ts route in SSR. robots.txt
goes in /public/. Canonical and sitemap URLs both depend on the configured
origin — a leaked preview/staging origin breaks both in production.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- i18n: rewriteRoutes for localized URLs + Qwik Speak for content; hreflang
via head.links.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Watch out: non-serializable data (class instances, promises, streams) is
client-only, and a noSerialize()-wrapped value comes back undefined after
resume; useVisibleTask$() runs eagerly on the client and should be used
sparingly; verify meta tags are in view-source, not JS-injected; the ecosystem
is smaller than React/Next.js.
» (Traduction) (Résumé en français de la section cinquante-huit, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Official documentation » (Traduction) (Résumé en français de la section soixante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Primary-source documentation from Qwik and the search engines. » (Traduction) (Résumé en français de la section soixante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Qwik / QwikCity
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Qwik documentation — Overview — the docs home; the ~1 KB JS and instant-loading claims.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Resumability — the canonical explanation of the serialization mechanism and why it isn’t hydration.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«- QwikCity overview — the meta-framework: routing, SSR/SSG, the “Next.js for Qwik” framing.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Routing — file-system routing, the Link component’s prefetch, and route rewrites.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie cinq : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Pages / DocumentHead — the head export, routeLoader$(), dynamic head, and structured data.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie six : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Sitemaps — sitemap.xml generation and robots.txt.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie sept : le texte source est conservé pour vérification lors de la relecture francophone.)
«- Deployments — adapters, SSR/SSG platforms, and cache headers.
» (Traduction) (Résumé en français de la section soixante-trois, sous-partie huit : le texte source est conservé pour vérification lors de la relecture francophone.)
«Google » (Traduction) (Résumé en français de la section soixante-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- JavaScript SEO basics — two-wave rendering and lazy-loaded content in the DOM. » (Traduction) (Résumé en français de la section soixante-quatre, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- Core Web Vitals — CWV as a ranking signal (INP, LCP, CLS). » (Traduction) (Résumé en français de la section soixante-quatre, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«## Quotes from the source » (Traduction) (Résumé en français de la section soixante-sept, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
On-le-record framing depuis Qwik’s creator et le official docs. Confirmer wording contre le actif pages avant treating quelconque citation as final.
Miško Hevery — creator de Qwik, builder.io
«- “Hydration is when an application is downloaded and executed twice, once as HTML and again as JavaScript.” — “Resumability vs Hydration,” builder.io. Read the post » (Traduction) (Résumé en français de la section soixante-dix, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Resumability is a way for a framework to recover its state without re-executing the application components on the client.” — “Resumability vs Hydration,” builder.io. Read the post » (Traduction) (Résumé en français de la section soixante-dix, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Hydration must execute before the app becomes interactive. Yes, the execution may be lazy, but the button will not process events until Hydration executes.” — “Resumability vs Hydration,” builder.io. Read the post » (Traduction) (Résumé en français de la section soixante-dix, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.)
«Qwik official docs (qwik.dev) » (Traduction) (Résumé en français de la section soixante-onze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«- “Your sites and apps can boot with about 1kb of JS (regardless of application complexity).” — Qwik Docs, Overview. Source » (Traduction) (Résumé en français de la section soixante-douze, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Qwik apps work instantly without any delay because they don’t need hydration, regardless of their size or complexity.” — Qwik Docs, Resumability. Source » (Traduction) (Résumé en français de la section soixante-douze, sous-partie deux : le texte source est conservé pour vérification lors de la relecture francophone.) «- “QwikCity is to Qwik, as Next.js is to React, Nuxt is to Vue, SvelteKit to Svelte, and Analog is to Angular.” — QwikCity Docs, Overview. Source » (Traduction) (Résumé en français de la section soixante-douze, sous-partie trois : le texte source est conservé pour vérification lors de la relecture francophone.) «- “Thanks to Qwik’s resumability and JavaScript streaming, there is no additional cost to the end user from Qwik City. (zero JavaScript).” — QwikCity Docs, Overview. Source » (Traduction) (Résumé en français de la section soixante-douze, sous-partie quatre : le texte source est conservé pour vérification lors de la relecture francophone.)
Remarque: builder.io blog et qwik.dev docs sont revised over temps et some contenu renders via JavaScript; confirmer ces contre le actif pages avant treating les as final.Qwik SEO checklist
A réussir to confirmer a QwikCity site is définir up to rank:
- vous êtes en utilisant QwikCity (le meta-framework) avec SSR or SSG — pas le bare library dans client-seulement mode.
- View-source montre votre contenu réel et
<a href>liens dans le raw HTML (pas an vide shell). - Dynamic page données est récupéré avec
routeLoader$()(serveur-side), pas a client-side effect. - Titre, description, et OG balises sont définir via le
headexport — et as a function fed parresolveValue()pour dynamic pages. - Canonical URLs sont dans
head.linksas{ rel: 'canonical', href: '...' }. - JSON-LD est dans
head.scriptsavectype: 'application/ld+json'. -
sitemap.xmlest configuré —sitemapOutFilepour SSG, or asrc/routes/sitemap.xml/index.tsroute pour SSR. -
robots.txtest dans/public/. - Cache-Contrôle headers sont définir on SSR réponses (edge SSR pour faible TTFB).
- hreflang balises sont dans
head.linkssi le site est multilingual; localized URLs viarewriteRoutes. - INP / LCP / CLS verified dans le champ (CrUX / Search Console), pas simplement lab.
- Aucun critical contenu dépend on non-serializable (class instances, promises, streams) client-seulement code.
The mental models
1. Resume, ne pas replay. Le unique idea behind Qwik. Chaque autre mainstream framework replays le app dans le navigateur (hydration) à faire SSR HTML interactive. Qwik resumes depuis state serialized dans le HTML, executing ~zero JS on charger. Si vous internalize un chose, faire il ce.
2. Le HTML est le contenu. Parce que il y a aucun client rendre étape, ce que le robot d’exploration récupère est le finished page. il y a aucun deuxième wave à wait on, aucun “did it render?” risque. Treat a Qwik page comme static HTML pour explorer/indexer purposes.
3. Serveur-side données → metadata.
Le chain que decides si votre meta balises sont crawlable:
routeLoader$() (serveur) → head export function → HTML <head>. Break le
chain par fetching dans a client effect et votre titre/OG/canonical fall out de le
premier-wave HTML.
4. SSG vs. SSR est a hosting/freshness appel, pas an SEO appel. Les deux put contenu dans le HTML. Pick SSG pour static contenu (gratuit hosting, auto sitemap) et SSR pour per-requête données (exécuter il à le edge, cache la réponses). Crawlability est fine soit façon.
5. Le performances win est INP/TBT, pas crawlability. React/Suivant.js déjà SSR contenu pour robots d’exploration. Ce que Qwik ajoute est le absence de le hydration tax — c’est où son CWV advantage lives. ne pas reach pour Qwik à “corriger exploration React ne peut pas”; reach pour il quand responsiveness est le lever.
Qwik SEO — cheat sheet
Où chaque SEO element goes (tout in the head export)
| Element | Où | Pattern |
|---|---|---|
| Title | head.title | string (or function pour dynamic) |
| Meta description / 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 données | routeLoader$() | server-side; lire via resolveValue() |
SSG vs. SSR pour le SEO
| SSG (static adapter) | SSR | |
|---|---|---|
| Content in HTML | ✅ | ✅ |
| Sitemap | Auto (sitemapOutFile) | Ajouter a /sitemap.xml route |
| Hosting | Static fichiers / CDN | Server / edge runtime |
| Meilleur pour | Stable content | Per-request / personalized |
| Mise en cache | Inherent | Définir Cache-Control yourself |
Resumability vs. hydration (the un distinction que matters)
| Hydration (React/Vue/Angular/SolidJS) | Resumability (Qwik) | |
|---|---|---|
| Navigateur fonctionner on charger | Re-execute components | Resume depuis serialized state |
| JS on charger | Scales avec app | ~1 KB (Qwikloader) |
| TBT / INP | Plus élevé | Near-zero |
| Contenu dans HTML | Oui (avec meta-framework) | Oui (toujours) |
Erreurs fréquentes
- ❌ Setting meta tags from a client effect → pas in first-wave HTML. Utiliser
head+routeLoader$(). - ❌ Appel Qwik “lazy hydration” → it doesn’t hydrate at tout; it resumes.
- ❌ Forgetting an SSR sitemap → SSR has aucun auto sitemap; ajouter the route.
Vérifier Qwik’s generated HTML
Point BUILD_DIR à le HTML sortie depuis le production construire:
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
doneCe catches routes whose Qwik City head function is manquant or duplicated. It fait pas replace checking field performances and rendered content on deployed URLs.
Outils pour auditing a Qwik site
- View-source (
view-source:dans le navigateur) — le fastest vérifier: est votre contenu, titre, canonical, et JSON-LD en réalité dans le raw HTML, or seulement dans le rendu DOM? - Recherche Google Console — Inspection d’URL — confirmer le rendu HTML matches
le source: contenu présent, aucun JS-injected
noindex, canonical resolved. - PageSpeed Insights / CrUX — champ Core Web Vitals (INP, LCP, CLS). Ce est où Qwik’s resumability advantage devrait en réalité montrer up.
- Chrome DevTools (Performances / Lighthouse) — lab TBT et main-thread fonctionner; confirmer le near-zero startup JS En pratique.
- Résultats enrichis Tester — valider le JSON-LD vous ajouté via
head.scripts. - Site robots d’exploration (Ahrefs Site Audit, Screaming Frog) — explorer le rendu site à vérifier titles, canonicals, hreflang, et lien internes à scale.
Mistakes personnes en réalité faire on Qwik
Resumability supprime la plupart de le JS-SEO risque que trips up autre frameworks, mais ces sont le réel façons teams encore shoot themselves dans le foot on Qwik.
Paramètre metadata depuis a client-side effect
Le mistake: pulling a post’s titre or description dans a useSignal() or
useResource$() que exécute dans le navigateur, alors trying à définir lune page titre depuis
que valeur.
Pourquoi c’est incorrect: n’importe quoi computed client-side exécute après le serveur sends son réponse. Il jamais rend il dans le HTML Googlebot récupère on le premier réussir — il seulement montre up dans le rendu DOM, qui est exactly le rendre-wave delay resumability était supposed à éviter vous.
Que faire à la place: récupérer le données avec routeLoader$() (serveur-side) et
faire le route’s head export a function fed par resolveValue(), as affiché dans
le Avancé tab. c’est le seulement chemin que lands metadata dans le premier-wave
HTML.
Running Qwik sans QwikCity
Le mistake: en utilisant le bare Qwik library dans client-seulement mode — aucun meta- framework, aucun serveur rendu — parce que “resumability ne fait pas besoin hydration donc il ne fait pas besoin SSR soit.”
Pourquoi c’est incorrect: resumability décrit ce que se produit après le HTML exists. Si rien renders le HTML on le serveur dans le premier placer, il y a rien à resume — vous êtes back à an vide shell pour robots d’exploration, aucun différent depuis quelconque autre client-seulement SPA.
Que faire à la place: utiliser QwikCity (or un autre server-rendering adapter) pour anything public-facing. It’s ce que en réalité produces le serveur-rendered HTML que donne Qwik its SEO advantage.
Assuming SSR obtient an automatic sitemap
Le mistake: shipping an SSR Qwik site et expecting sitemap.xml à
exist parce que il “simplement fonctionne” dans le SSG construire.
Pourquoi c’est incorrect: le automatic sitemap est a construire-time fonctionnalité de le
static adapter (sitemapOutFile). SSR sites rendre per requête — il y a aucun
construire étape à generate a static XML fichier depuis, donc rien produces un unless
vous ajouter il.
Que faire à la place: ajouter a route à src/routes/sitemap.xml/index.ts avec
a RequestHandler que construit et renvoie le XML dynamically, as covered dans
le Avancé tab.
Putting non-serializable données in anything le serveur nécessite to resume
Le mistake: storing a class instance, an ouvrir promise, or a stream
référence dans state que le head export or a serveur-rendu component
dépend on.
Pourquoi c’est incorrect: Qwik’s serialization seulement handles plain, serializable valeurs — n’importe quoi sinon ne peut pas être written dans le HTML à SSR temps, qui breaks le exact mechanism (Resumability) que rend Qwik’s SEO story fonctionner.
Que faire à la place: garder non-serializable objects client-seulement et out de
n’importe quoi que feeds metadata or serveur-rendu markup. Convert à plain données
(a resolved valeur, pas le promise or class instance) avant il touches
routeLoader$() or head.
Appel Qwik “lazy hydration” in a client pitch or audit remarque
Le mistake: describing Qwik’s behavior as a faster or lazier version de hydration quand documenting an audit or briefing a dev team.
Pourquoi c’est incorrect: il sets le incorrect expectation — “lazy hydration” implies le navigateur eventually re-executes chaque component, simplement plus tard. Qwik jamais re-executes components on charger à tout; c’est le entier point de resumability, et le distinction changements ce que vous’d même regarder pour quand quelque chose’s lent.
Que faire à la place: utiliser “resumes” et “resumability,” matching le docs’ propre terminology, et vérifier le Qwikloader’s ~1 KB boot script dans DevTools si vous devez prove le “no hydration” claim à a skeptical stakeholder.
Standing KPIs pour a Qwik site
Ces sont le numbers à track on an ongoing basis, pas a un-time launch vérifier — Qwik’s entier valeur proposition est a performances et crawlability story, donc les deux sides besoin a metric.
INP (field)
Ce que il indique vous: si réel visitors sont en réalité experiencing le faible-hydration-coût responsiveness Qwik est supposed à deliver. Ce est le metric Qwik’s architecture est la plupart directement construit à win.
How to pull it: Recherche Google Console’s Core Web Vitals report, CrUX, or Patrick’s CWV Checker / Core Web Vitals History & Competitor Comparison pour a per-URL or per-origin field lire.
Benchmark / realistic range: Google’s publié threshold est “bon” à or sous 200ms, “nécessite improvement” 200–500ms, “poor” ci-dessus 500ms — le même threshold pour chaque site, pas Qwik-spécifique. A resumable site avec a clean Qwikloader boot devrait sit comfortably dans “bon,” mais a bloated per-interaction chunk or heavy tiers script peut encore push il up.
Cadence: monthly, or après quelconque release que changements interaction handlers; CrUX données itself is a rolling 28-day window.
TBT (lab)
Ce que it indique vous: how beaucoup main-thread fonctionner is happening on charger in a controlled tester — ce is où you’d catch a regression avant it montre up in field INP.
How to pull it: Lighthouse or Chrome DevTools’ Performances panel, run contre the live URL (pas localhost, où results skew low).
Benchmark / realistic range: il y a aucun universal “bon Qwik” number —
il dépend on qu’est-ce que on lune page (tiers scripts, image decode fonctionner,
route-level routeLoader$() coût). Ce que vous êtes checking pour est que TBT
stays near-zero relative à a hydrating equivalent de le même page, pas
contre a fixed cible.
Cadence: avant/après quelconque deploy que adds a third-party script, analytics tag, or nouveau interactive component.
Indexé page coverage
Ce que il indique vous: si Google est en réalité exploration et indexation le pages vous expect — le practical proof que “contenu est dans le HTML par par défaut” est translating dans indexation, pas simplement a theoretical advantage.
«How to pull it: Search Console’s Page Indexing report, filtered to the Qwik site’s URL prefix; cross-check against your sitemap’s submitted-URL count. » (Traduction) (Résumé en français de la section cent quarante-huit, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Benchmark / realistic range: depends entirely on site size and how much of it you intend to have indexed — there’s no fixed target. Track the trend (indexed count moving toward submitted count) rather than chasing a specific number. » (Traduction) (Résumé en français de la section cent quarante-neuf, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Cadence: weekly during and after a migration to Qwik; monthly once stable. » (Traduction) (Résumé en français de la section cent cinquante, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«### JS transferred on load » (Traduction) (Résumé en français de la section cent cinquante et un, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«What it tells you: whether the “boots with ~1 KB” claim is holding up in practice, or whether third-party scripts and oversized initial chunks have eaten into Qwik’s structural advantage. » (Traduction) (Résumé en français de la section cent cinquante-deux, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«How to pull it: the Network panel in Chrome DevTools, filtered to JS, on a cold load with cache disabled. » (Traduction) (Résumé en français de la section cent cinquante-trois, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Benchmark / realistic range: the Qwikloader itself is roughly 1 KB; anything meaningfully larger on initial load is coming from something else on the page (analytics, ads, a polyfill) — investigate rather than compare against a fixed number, since page-to-page variance is expected. » (Traduction) (Résumé en français de la section cent cinquante-quatre, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
«Cadence: after any change to third-party tags, analytics, or shared layout components. » (Traduction) (Résumé en français de la section cent cinquante-cinq, sous-partie un : le texte source est conservé pour vérification lors de la relecture francophone.)
Testez vos connaissances: Qwik SEO
Five rapide questions on resumability and getting a QwikCity site to rank. Pick an réponse pour chaque, alors vérifier.
Ressources utiles
Mon connexe writing
- JavaScript SEO: A Definitive Guide — rendu, DOM parity, et getting JS-built contenu indexé; le foundation a Qwik audit construit on.
- Core Web Vitals: A Complet Guide — ce que INP, LCP, et CLS mesurer et comment ils factor dans SEO — le metrics Qwik’s architecture optimizes.
- Le Beginner’s Guide à SEO technique — où framework choice et rendu fit dans le bigger picture.
Mon speaking
- Comment Recherche Fonctionne (SlideShare) — mon walkthrough de exploration, rendu, indexation, et classement — le pipeline a Qwik site a à clair. (Mon standing disclaimer s’applique: “This is my understanding of systems… not going to be 100% complete or accurate.”)
Depuis autour le industry
- Qwik — Resumability — le clearest primary-source explanation de comment serialization remplace hydration.
- QwikCity overview — le meta-framework: routing, SSR/SSG, loaders.
- Qwik — Pages / DocumentHead — le
headexport,routeLoader$(), dynamic head, et données structurées. - Qwik — Sitemaps — sitemap.xml generation et robots.txt.
- Builder.io — Resumability vs Hydration — Miško Hevery on pourquoi hydration est “executed twice” et comment resumability avoids il.
- Google — JavaScript SEO basics — deux-wave rendu et ce que robots d’exploration faire avec JS.
- r/TechSEO — le community pour debugging framework rendu et indexation questions.
Journal des modifications
Mis à jour le 18 juil. 2026.
Résumé éditorial et détails enregistrés des changements.Détails des changements
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
-
Les notes détaillées des changements sont actuellement disponibles en anglais.
Comparaison complète indisponible — aucun instantané antérieur n’a été archivé pour cette révision.