Next-Gen JavaScript Frameworks
How Qwik's resumability and SolidJS's fine-grained reactivity reduce browser JavaScript startup work — and why neither mechanism by itself guarantees crawlability, indexing, or Core Web Vitals.
"Next-gen" is an editorial label used here for Qwik and SolidJS, not a standardized web-platform category. Qwik uses resumability — it serializes listeners, component boundaries, and state into the HTML during SSR/SSG so the browser can resume specific work instead of replaying a full hydration bootstrap. That's not zero JavaScript: Qwikloader (a small bootstrap script) still runs on load, registers listeners, and lazy-loads handler code (QRLs) on interaction. SolidJS uses fine-grained reactivity — signals and no virtual DOM mean targeted DOM updates without a component re-render — and it still hydrates, just not the same mechanism as resumability. Neither the framework's reactivity model nor its meta-framework (QwikCity, SolidStart) guarantees a route's HTML, metadata, status code, or measured Core Web Vitals; those depend on the rendering mode and implementation you actually ship. This hub maps the two mechanisms and points to the dedicated deep dives.
TL;DR — “Next-gen” is my label for Qwik and SolidJS — not an official category — because both attack JavaScript startup work through different mechanisms. Less JS running on load can mean faster, more responsive pages, which is what Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. reward. But neither framework guarantees your content is crawlable or your Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. score well — that still depends on which meta-framework renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode you actually use.
What “next-gen” means here
Most popular frameworks (React, Vue, Angular) build a lot of the page in your browser. Even when the server sends finished HTML, the framework usually has to hydrate it — re-run its JavaScript in the browser to “wake up” the page so buttons and menus work. That hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers. work is one of the biggest causes of a sluggish page: it eats CPU time right when the user is trying to interact.
“Next-gen” isn’t a standardized web-platform category — it’s the label I’m using here for two projects that attack that cost head-on, each with its own mechanism:
- Qwik — sends finished HTML and then resumes rather than hydrates. A small bootstrap script still runs on load; it only fetches the specific code for an interaction the moment you actually click something.
- SolidJS — still sends finished HTML and hydrates it, but with a much lighter, smarter system, so there’s far less work to do.
Both are moving targets: Qwik currently ships a v2 beta, and SolidStart’s docs label themselves beta too. Treat specific defaults and behaviors below as version-scoped, not permanent.
What this actually changes for SEO
Two things are true, and they’re independent of each other:
- Whether your content is in the HTML depends on the renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode you pick, not on the framework by itself. Their official full-stack tools (QwikCity for Qwik, SolidStart for SolidJS) can server-render or statically generate a route so the text and links are already in the HTML — but SolidStart also supports pure client-side rendering, which produces an empty shell just like any other SPA. Pick the wrong mode and the “next-gen” label buys you nothing for crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor.. See JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. for the general mechanics.
- Less JavaScript running can help Core Web VitalsWeb Vitals is Google's initiative (launched May 2020) for unified page-experience quality signals. Core Web Vitals — LCP, INP, and CLS — are the subset used in ranking; the rest (TTFB, FCP, TBT, Speed Index) are diagnostic, not ranking factors., but it isn’t guaranteed. Your actual INPInteraction to Next Paint — the input-to-paint latency at the 75th percentile of a page's interactions. ≤200 ms is good. and TBTTotal Blocking Time — the sum of the blocking portion (time above 50 ms) of every long task between First Contentful Paint and Time to Interactive. It's a lab-recommended metric and the lab proxy for INP, not a Core Web Vital. numbers depend on your app code, third-party scripts, server response timeTime to First Byte — the time from the start of a request to when the first byte of the response arrives. It's a diagnostic metric (not a Core Web Vital) and a major input to FCP and LCP; ≤0.8 s is good., and device conditions — not just the framework’s reactivity model. Core Web Vitals are a ranking factorGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data., so it’s worth measuring in the field rather than assuming.
The one thing not to mix up
People lump Qwik and SolidJS together as “the resumable ones.” That’s wrong. Resumability is Qwik’s idea. SolidJS does not use resumability — it hydrates, just very efficiently. Keep that straight and the rest makes sense.
Want the real mechanics — resumability vs. hydration, signals vs. the virtual DOM, and how these stack up against React/Vue/Angular on performance and SEO? Switch to the Advanced tab.
TL;DR — “Next-gen frameworks” is this article’s own editorial grouping for Qwik and SolidJS, not a standardized category — both target JavaScript execution cost in the browser, by different mechanisms. Qwik uses resumability — the app pauses on the server and serializes listeners, component boundaries, and state into the HTML so the browser can resume specific work instead of replaying a full hydrationTurning HTML, CSS, and JavaScript into the final visual page and DOM. bootstrap; a small bootstrap script (Qwikloader) still runs on load and lazy-loads handler code on interaction, so this is not literally zero JavaScript. SolidJS uses fine-grained reactivity — signals and no virtual DOM, so updates are surgical — and it still hydrates (not resumability; that’s the myth to bust). Framework reactivity is a separate concern from meta-framework renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode: QwikCity and SolidStart can emit server-rendered HTML, but SolidStart also supports pure client-side rendering, and neither ships a router or metadata library by default. CrawlabilityCrawlability is how well search engine crawlers can discover, access, and fetch a site's pages. A crawlability issue is any technical condition — blocked access, broken links, server failures, or bloated URL inventory — that stops pages from reaching the index., indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed., and measured Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. depend on the rendering mode and implementation you actually ship — no framework or reactivity model guarantees them.
The root cause they’re attacking
Open the JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. hub and the failure modes are about whether Google can see your content. That’s a rendering mode question — SSR, SSG, or CSR — and QwikCity and SolidStart both support server-rendered or statically generated output, though neither forces it: pick CSR and you’re back to an empty-shell SPA regardless of the framework underneath. What Qwik and SolidJS actually change is the other half of the story: the cost of the JavaScript that runs after the HTML arrives.
In a typical SSR-plus-hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers. app, the server sends finished HTML — great for first paint and for crawlersA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. — but then the framework downloads its component code and re-executes it in the browser to attach event handlers and rebuild its internal state. That hydration pass is pure overhead from the user’s point of view: the page looks ready but isn’t interactive, and the main thread is blocked. This is the single biggest contributor to high Total Blocking TimeTotal Blocking Time — the sum of the blocking portion (time above 50 ms) of every long task between First Contentful Paint and Time to Interactive. It's a lab-recommended metric and the lab proxy for INP, not a Core Web Vital. (TBTTotal Blocking Time — the sum of the blocking portion (time above 50 ms) of every long task between First Contentful Paint and Time to Interactive. It's a lab-recommended metric and the lab proxy for INP, not a Core Web Vital.) in the lab and poor Interaction to Next PaintInteraction to Next Paint — the input-to-paint latency at the 75th percentile of a page's interactions. ≤200 ms is good. (INPInteraction to Next Paint — the input-to-paint latency at the 75th percentile of a page's interactions. ≤200 ms is good.) in the field.
Both Qwik and SolidJS exist to shrink or eliminate that pass. They take different routes.
Qwik: resumability (no hydration — but not zero JS either)
Qwik’s headline idea is resumability, and Qwik (currently a v2 beta) is the framework whose reactivity model I’m calling out here — QwikCity is the separate meta-framework layer, covered below. The framework runs on the server, renders the HTML, and then serializes everything the app needs to continue — state, event listeners, the component tree, the place in execution — directly into the HTML. When the page loads in the browser, Qwik doesn’t re-run your components to wake them up. It resumes from where the server left off, instead of replaying a full hydration bootstrap.
That’s genuinely different from hydration, but it is not zero JavaScript. A small bootstrap script, Qwikloader (documented at about 1kb minified, executing in under 5ms on mobile per Qwik’s own docs), still runs on every page load. It:
- registers a single global event listener instead of attaching one listener per interactive element,
- reads the serialized
on:click="./chunk.js#handler_symbol"-style attributes Qwik wrote into the HTML (these are QRLs — Qwik Resource Locators), - and, when an event actually fires, resolves the matching QRL and lazy-loads the specific handler chunk before running it.
The practical consequences:
- Startup JS is small and roughly constant, not zero. Qwikloader’s own cost doesn’t grow with your app size, and no full-app hydration pass runs — but Qwikloader itself is real, executing JavaScript. Don’t describe this as “zero JS on load”; describe it as “a small, constant-size bootstrap instead of a hydration pass that scales with app size.”
- Lazy loadingLazy loading defers loading of off-screen or non-critical resources — usually images and iframes — until they're about to enter the viewport. The native way to do it is the loading=\"lazy\" HTML attribute, which needs no JavaScript. down to the handler. Application code loads only when an interaction actually happens, which is what Qwik’s authors mean by “HTML-first.”
- QwikCity is Qwik’s meta-framework — file-based routing, data loaders, actions, endpoints — the full-stack layer that produces server-rendered or static, resumable HTML. Qwik’s resumability doesn’t by itself decide a route’s status code, metadata, or whether it’s server-rendered at all; QwikCity’s routing and rendering configuration does.
Where resumability breaks in practice
Resumability has real constraints worth knowing before you rely on it (per Qwik’s current serialization and state docs):
- Serialization boundaries. Code inside a
$(...)boundary can only capture serializable values — primitives,const-bound serializable data, and a few built-in types Qwik knows how to serialize (including promises). A custom class instance or other unsupported capture passes static analysis but fails at runtime when Qwik tries to serialize it — a silent-until-shipped failure mode worth testing for. noSerialize()values don’t survive resumption. Anything explicitly marked non-serializable is set toundefinedafter the client resumes from SSR/SSG state, and has to be reinitialized on the client — typically insideuseVisibleTask$().useVisibleTask$is an eager, browser-only escape hatch. Qwik’s own docs call it a last resort: it runs only in the browser, after initial render, and “eagerly executes code on the client” — by default gated on visibility via an intersection observer, but immediately on load if you set{ strategy: 'document-ready' }. Overusing it reintroduces the startup cost resumability is designed to avoid.
For SEO specifically: whether a QwikCity route’s server output includes your
content and <a href> links in the initial HTML is a rendering-mode and routing
question, not something resumability guarantees on its own — check the actual
response, not just the framework choice. See
crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. for what Google needs there.
The resumability mechanism’s realistic upside is on the runtime side: less
startup JavaScript to block the main thread, which is a factor in
Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. —
not a guarantee of a particular INP or TBT number.
SolidJS: fine-grained reactivity (smarter hydration — not resumability)
SolidJS attacks the same cost from a different angle, and — same caveat as above — Solid the reactivity engine is a separate thing from SolidStart the meta-framework. Solid’s core idea is fine-grained reactivity built on signals, and it has no virtual DOM.
- Signals, not re-renders. In React, a state change re-runs the component
function and diffs a virtual DOM to figure out what changed. In Solid, a
component function runs once; signals (getter/setter pairs created with
createSignal) and subscribers (likecreateEffect) track dependencies directly, so when a signal changes, only the code actually subscribed to it reruns — no component re-execution, no virtual-DOM diff. This is why Solid consistently sits at or near the top of framework benchmarks (the js-framework-benchmark suite) on update-heavy workloads — see that benchmark directly for current numbers rather than a fixed claim here, since benchmark results shift across framework versions. - It still hydrates — SolidJS is not a resumability framework. Its server renderer produces HTML and the client hydrates it — this is a different mechanism from Qwik’s resumability, not a variant of it. Fine-grained reactivity and no virtual DOM mean Solid’s hydration pass has less work to reconstruct than a typical VDOM framework’s, but “hydration is cheaper here” is a mechanism-level statement, not a fixed number — actual hydration cost still depends on how much interactive code a given route ships. Do not describe SolidJS as “resumable.”
- SolidStart is Solid’s meta-framework — routing, server functions, and deployment presets, the SolidStart equivalent of QwikCity / Next.js. Current SolidStart docs (v1.0, labeled beta, last updated 2026-04-28) list three rendering modes you choose per app: client-side rendering (CSR), server-side rendering (SSR — sync, async, or streaming), and static site generation (SSG). Solid’s fine-grained reactivity runs the same way regardless of which mode you pick; the rendering mode is what determines whether a route’s initial HTML contains your content at all. SolidStart’s own docs are explicit that it does not bundle a router or metadata library by default — you add one yourself, which means metadata handling isn’t automatic just because you’re using SolidStart.
For SEO: whether a SolidStart route’s content and links land in the initial HTML depends on which of those three rendering modes it uses — CSR alone produces an empty shell like any SPA, same as picking CSR anywhere else. SSR or SSG modes put content in the HTML the way JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. requires. The CWV upside is mechanism-level: a smaller runtime and fine-grained updates reduce the work hydration has to do — it doesn’t set a specific TBT or INP number on its own.
The distinction, stated plainly
This is the accuracy spine of the whole topic, so be precise:
- Qwik = resumability. No hydration bootstrap. A small, roughly constant-size bootstrap script (Qwikloader) runs on load; application code lazy-loads on interaction. Resumes from serialized server state.
- SolidJS = fine-grained reactivity + hydration. No virtual DOM, dependency- tracked signals, but it does hydrate. It is not resumability.
Both reduce browser JavaScript work relative to a typical VDOM-plus-full-hydration app, but by different mechanisms, and neither eliminates browser JavaScript entirely. Conflating “resumability” with “zero JS,” or treating SolidJS as resumable, are the two most common mistakes about this pairing.
An adjacent comparison boundary: Astro islands
Worth naming since it comes up in the same conversations: Astro’s islands architecture is a third mechanism, not a variant of either one above. Astro ships plain server-rendered HTML by default and lets you opt specific components into client-side hydration (“islands”) via client directives — most of the page never ships component JavaScript at all. That’s a useful comparison boundary for “how much of the page needs to be interactive,” but it isn’t resumability (Qwik) or fine-grained-reactivity hydration (Solid) — it’s partial hydration of an otherwise static page. Qwik’s own docs explicitly distinguish resumability from partial hydration for this reason.
How they compare to the established frameworks
| React | Vue | Angular | SolidJS | Qwik | |
|---|---|---|---|---|---|
| Reactivity model | VDOM + re-render | VDOM + reactivity | Zone.js / signals (v16+) | Signals, no VDOM | Signals, no VDOM |
| Browser work on load (SSR) | Hydration | Hydration | Hydration | Hydration (less to reconstruct) | Resumption (Qwikloader bootstrap, no full hydration) |
| Startup JS cost | Scales with app | Scales with app | Scales with app | Scales with app’s interactive surface | Small bootstrap; app code lazy-loads on interaction |
| Content in server/static HTML | Depends on rendering mode (Next/Remix) | Depends on rendering mode (Nuxt) | Depends on rendering mode (@angular/ssr) | Depends on rendering mode (SolidStart: CSR/SSR/SSG) | Depends on rendering mode (QwikCity) |
| Meta-framework | Next.js / Remix | Nuxt | Angular SSR | SolidStart | QwikCity |
The established frameworks are not bad for SEO by default — with the right rendering mode, their meta-frameworks all put content into the HTML, which is what crawlersA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. need (that’s the whole JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. story), and the same is true of SolidStart and QwikCity. What differs between the columns above is the mechanism behind browser startup cost, not a guaranteed outcome — measure TBT/INP on your actual routes rather than assuming a framework choice settles it.
A caveat worth keeping honest: React, Vue, and Angular are all moving toward signals and lighter hydration themselves (Angular’s signals, React Server Components, Vue’s Vapor mode). Version and roadmap specifics change quickly enough that any snapshot here would go stale — check each framework’s current docs before citing a specific capability.
Validating any of this on your own routes
Don’t take a framework’s reputation as the answer for a specific route. Check, per route:
- Status code and initial HTML — fetch the URL directly (not through the browser’s rendered DOM) and confirm your content, links, and metadata are actually present.
- Streamed output, if the rendering mode streams — confirm the full content arrives, not just a shell plus a loading state.
- Metadata and links — title, meta descriptionThe meta description is an HTML head tag — `<meta name=\"description\" content=\"…\">` — that suggests a short summary of the page for the search snippet. It's not a Google ranking factor, and Google rewrites it the majority of the time, but a good one can still lift click-through., canonical, and
<a href>targets, since neither resumability nor fine-grained reactivity manages these for you. - Serialized state size (Qwik) — large serialized state inflates the HTML payload even though it avoids a hydration bootstrap.
- Initial loader/runtime JavaScript actually executed — measure what Qwikloader or Solid’s runtime does on load, not just what the docs claim.
- Prefetched and interaction-triggered requests — watch the network panel for what loads on click versus what loaded up front.
- Browser-only tasks (
useVisibleTask$and equivalents) — confirm they’re not firing eagerly on every load. - Behavior when JavaScript fails or is blocked — does the route degrade to something usable, or break entirely?
- Representative crawler-rendered output — Search ConsoleGoogle's free tool for monitoring crawling, indexing, and search performance.’s URL Inspection tool or an equivalent renderer, not just View Source, since some content only appears after rendering.
This is the same validation discipline any JavaScript-rendered site needs; see renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. for how Google’s pipeline handles this generally.
Where to go next
Each framework has its own dedicated deep dive:
- Qwik SEOQwik SEO is the practice of optimizing sites built with Qwik, a JavaScript framework whose 'resumability' model serializes app state into HTML so the browser never has to hydrate. Content is in the HTML by default, so crawling, indexing, and Core Web Vitals are all structurally strong. — resumability in practice, QwikCity routing and SSR, getting
metadata right, the
useDocumentHeadpattern, lazy-loading boundaries, and how resumability shows up in field CWV. - SolidJS SEOSolidJS SEO is the set of practices for making SolidJS apps crawlable, indexable, and fast. Bare SolidJS renders client-side (an empty HTML shell), so SEO depends on using SolidStart for SSR or SSG to put real content and metadata in the initial HTML. — signals and fine-grained reactivity, SolidStart SSR and streaming, why it’s not resumable, meta-tag management, and benchmark context.
Both sit under the JavaScript SEOMaking sure search engines can crawl, render, and index content that depends on JavaScript. cluster alongside the framework-specific guides for React, Vue, Angular, Next.js, Nuxt, Svelte, and Astro. For the metric side, see Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data.; for how Google sees rendered content, see renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM..
AI summary
A condensed take on the Advanced version:
- “Next-gen” is this article’s own editorial label for Qwik and SolidJS, not a standardized category — both reduce browser JavaScript execution cost, by different mechanisms. Qwik ships a v2 beta; SolidStart’s docs are labeled beta and last updated 2026-04-28 — treat specifics as version-scoped.
- Qwik = resumability, not zero JavaScript. The app serializes listeners,
component boundaries, and state into the HTML on the server; the browser
resumes instead of replaying a hydrationTurning HTML, CSS, and JavaScript into the final visual page and DOM. bootstrap. A small bootstrap
script, Qwikloader (~1kb, documented under 5ms on mobile), still runs on
load — it registers a global listener and lazy-loads handler code (QRLs) on
interaction. Constraints:
$serialization boundaries can fail at runtime for unsupported captures,noSerialize()values goundefinedafter resumption and need client reinitialization, anduseVisibleTask$is an eager browser-only escape hatch that adds startup cost if overused. QwikCity is its separate meta-framework/routing layer. - SolidJS = fine-grained reactivity, and it is NOT resumability — it hydrates, just with less to reconstruct (signals + no virtual DOM mean targeted DOM updates, not a full component re-run). SolidStart (v1.0, docs beta) is the separate meta-framework: it supports CSR, SSR (sync/async/streaming), and SSG as distinct renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM.-mode choices, and it does not bundle a router or metadata library by default.
- CrawlabilityCrawlability is how well search engine crawlers can discover, access, and fetch a site's pages. A crawlability issue is any technical condition — blocked access, broken links, server failures, or bloated URL inventory — that stops pages from reaching the index., metadata, and status codes are rendering-mode and routing questions, not framework guarantees. CSR mode in either meta-framework produces an empty shell like any SPA; SSR/SSG modes put content in the HTML. Check the actual response per route rather than assuming.
- Neither mechanism guarantees Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. or rankings. Less startup JavaScript is a real factor in INPInteraction to Next Paint — the input-to-paint latency at the 75th percentile of a page's interactions. ≤200 ms is good. and TBTTotal Blocking Time — the sum of the blocking portion (time above 50 ms) of every long task between First Contentful Paint and Time to Interactive. It's a lab-recommended metric and the lab proxy for INP, not a Core Web Vital., but app code, third parties, server response timeTime to First Byte — the time from the start of a request to when the first byte of the response arrives. It's a diagnostic metric (not a Core Web Vital) and a major input to FCP and LCP; ≤0.8 s is good., and device conditions still determine the measured outcome — validate in the field (CrUXChrome User Experience Report — Google's public dataset of real-world (field) performance data from eligible Chrome users. It's the official field-data source behind the Core Web Vitals program./Search ConsoleA free Google service that reports how a site performs in Google Search and surfaces problems with how Google crawls, indexes, and serves it. It's first-party data straight from Google — but you don't need it to appear in results.), not just in the lab.
- Vs. React/Vue/Angular: with the right rendering mode, the established frameworks SSR fine for crawlersA crawler — also called a spider or bot — is an automated program that fetches web pages, extracts their links, and queues new URLs to visit. Search engines use crawlers to discover and download content for their index. too; the mechanism difference is startup JavaScript cost, and the mainstream is adopting similar ideas (signals, RSC, Vapor mode) — check each framework’s current docs before citing specifics, since these move fast.
- Astro islands are a related but distinct third mechanism — server HTML by default with opt-in client islands, not resumability or fine-grained-reactivity hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers..
Official documentation
Primary-source documentation from the frameworks themselves.
Qwik (currently v2 beta — verify version before citing specific defaults)
- Qwik documentation — the official docs home.
- Think Qwik / Resumable — the canonical explanation of resumability vs. hydrationTurning HTML, CSS, and JavaScript into the final visual page and DOM., including listener/tree/state serialization.
- Qwikloader — the bootstrap script that actually runs on load: global listener registration, QRL resolution, lazy handler loading.
- Serialization and Serialization Boundaries —
$boundaries and what fails at runtime when a capture isn’t serializable. - State /
noSerialize— why non-serializable values becomeundefinedafter resumption. - Tasks and Lifecycle —
useTask$vs.useVisibleTask$and blocking/visibility behavior. - QwikCity overview — the meta-framework: routing, loaders, actions, endpoints.
useDocumentHead/DocumentHead— managing title and meta tags for SEOMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored..
SolidJS (SolidStart docs are labeled beta, last updated 2026-04-28 — verify before citing specific defaults)
- SolidJS documentation — the official docs home.
- Reactivity / Signals — fine-grained reactivity, signals, and subscribers.
- SolidStart overview — the meta-framework: renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. modes, and the no-bundled-router/metadata-library default.
- SolidStart rendering modes — CSR, SSR (sync/async/streaming), and SSG as distinct choices.
Comparison boundary
- Astro — Islands architecture — server HTML with opt-in client islands, a third mechanism distinct from resumability and Solid’s hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers..
Google Search / benchmarks / background
- Understand JavaScript SEO basics — Google’s own framing of fetching, rendering, and indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. as separate steps.
- js-framework-benchmark — the widely-cited cross-framework performance benchmark; check current results rather than a fixed number here.
Quotes from the source
On-the-record framing from the framework teams. Confirm wording against the live docs before treating any relayed quote as final.
Qwik — resumability
- Qwik describes itself as the framework that delivers “instant-on applications” through resumability, contrasting it with hydrationTurning HTML, CSS, and JavaScript into the final visual page and DOM.: resumability lets an app “continue execution in the browser from where the server left off,” so there is no need to “download and execute the application” to make the page interactive. Resumable concept
- Qwik positions itself as “HTML-first” — the page is usable immediately and JavaScript is fetched lazily, “only when needed,” down to individual interactions rather than as one large startup bundle. Think Qwik
SolidJS — fine-grained reactivity
- SolidJS describes its model as fine-grained reactivity with no virtual DOM: components “run once” and signals update “only the parts of the DOM that depend on them.” Intro to reactivity
- SolidStart is presented as a framework that “renders on the server” and hydrates on the client — the docs frame Solid’s advantage as the efficiency of that hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers., not its absence. SolidStart
Choosing / auditing a next-gen framework — checklist
Before adopting (or while auditing) Qwik or SolidJS for SEO:
- You’ve confirmed which renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode the meta-framework is actually configured for (SolidStart: CSR vs. SSR vs. SSG; QwikCity: server vs. static) — not assumed it defaults to server-rendered.
- View Source (or a direct fetch of the URL) shows your real content and
<a href>links in the raw HTML (not an empty<div id="app">shell). - URL InspectionA Google Search Console feature that reports how Google sees one specific URL on a property you own. By default it shows the last-indexed snapshot; a separate \"Test live URL\" mode fetches the current version. (Search ConsoleA free Google service that reports how a site performs in Google Search and surfaces problems with how Google crawls, indexes, and serves it. It's first-party data straight from Google — but you don't need it to appear in results.) confirms the rendered HTML matches —
content present, no JS-injected
noindex. - Title and meta tagsMeta tags are HTML elements in a page's head that pass metadata about the page to search engines and browsers. For SEO only a few matter — the title element, the meta description, and the robots meta tag — while meta keywords and most others are ignored. are set via the framework’s head API
(
useDocumentHead/DocumentHeadfor Qwik) or an explicitly added router/metadata library for SolidStart (it isn’t bundled by default) — not only client-side. - Core Web VitalsGoogle's three real-user UX metrics — LCP (loading), INP (responsiveness), and CLS (visual stability) — used by Google's ranking systems, with no official weight attached, measured on field data. measured in the field (CrUXChrome User Experience Report — Google's public dataset of real-world (field) performance data from eligible Chrome users. It's the official field-data source behind the Core Web Vitals program. / Search ConsoleGoogle's free tool for monitoring crawling, indexing, and search performance.), not just lab — don’t assume the mechanism guarantees the number.
- Routing uses real navigations / History API so each route is a crawlable URL with its own server-rendered HTML.
- You did not describe or configure SolidJS as “resumable” — it hydrates; only Qwik resumes.
- You did not describe Qwik as “zero JavaScript” — Qwikloader still runs
on load; check what it and any
useVisibleTask$calls actually execute. - Qwik
$-boundary captures are tested for serializability, and anynoSerialize()values have explicit client-side reinitialization. - JavaScript and CSS are not blocked in
robots.txt(still matters even with low JS — Google must fetch what little there is). - You understand the ecosystem trade-off: smaller communities and fewer off-the-shelf integrations than React/Vue/Angular, plus both frameworks’ docs currently being labeled beta.
Frameworks for evaluating next-generation JavaScript
Separate crawlability from runtime cost
Score the implementation on two independent axes:
- Document completeness: Does each public route return its content, links, and metadata in HTML? QwikCity or SolidStart in an SSR/SSG renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode can make this true — but CSR mode in either one does not.
- Activation cost: How much JavaScript must run before interaction works? Qwik resumes serialized state (but still runs the Qwikloader bootstrap); Solid hydrates with fine-grained reactivity.
A fast client runtime does not fix an empty document, and complete HTML does not guarantee good responsiveness. Measure both, per route, on the actual deployed build — not from the framework’s reputation.
The mechanism test
Use precise language when comparing architectures:
- Qwik: resumability — no full hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers. bootstrap, but Qwikloader (a small, roughly constant-size script) still runs on load, with application code loaded around interaction boundaries.
- SolidJS: signals, no virtual DOM, and targeted updates; SolidStart still hydrates server-rendered output — it is not resumability, and the renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. mode (CSR/SSR/SSG) is a separate choice from the reactivity model.
- Established meta-frameworks: usually hydrate, with different server-component, streaming, or partial-activation options that are converging toward some of the same ideas.
Choose on the actual delivery model, ecosystem, and team constraints — not a generic “zero JavaScript” or “crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. is guaranteed” label.
Next-gen frameworks — cheat sheet
The two mechanisms (don’t mix them up)
| Qwik (v2 beta) | SolidJS / SolidStart (1.0, docs beta) | |
|---|---|---|
| Core idea | Resumability | Fine-grained reactivity |
| HydrationTurning HTML, CSS, and JavaScript into the final visual page and DOM. on load? | No — resumes from serialized state | Yes — less to reconstruct, not zero |
| Virtual DOM? | No | No |
| JS executed on load | Qwikloader bootstrap (~1kb) + serialized state | Small runtime + hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers. work |
| Meta-framework | QwikCity | SolidStart |
| RenderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. modes | Server or static (via QwikCity routing) | CSR, SSR (sync/async/streaming), or SSG — you choose |
| Router/metadata bundled? | Via QwikCity | No — not bundled by default |
What each depends on for SEO (not a given)
| Aspect | Depends on |
|---|---|
| Content in initial HTML | The rendering mode you configure (SSR/SSG) — CSR mode is an empty shell |
| INPInteraction to Next Paint — the input-to-paint latency at the 75th percentile of a page's interactions. ≤200 ms is good. (field responsiveness) | App code, third parties, device — startup JS is only one factor |
| TBTTotal Blocking Time — the sum of the blocking portion (time above 50 ms) of every long task between First Contentful Paint and Time to Interactive. It's a lab-recommended metric and the lab proxy for INP, not a Core Web Vital. (lab blocking) | Actual JS executed on the route, not the framework’s reputation |
| Ecosystem / hiring | Smaller than React/Vue/Angular; both docs sets currently beta |
| Risk if used client-only | Empty-shell CSR — same as any SPA, regardless of framework |
Common myths to bust
- ❌ “SolidJS is resumable.” → It hydrates; only Qwik resumes.
- ❌ “Qwik runs zero JavaScript.” → Qwikloader still runs on load and lazy-loads handler code on interaction — small and constant-size, not absent.
- ❌ “Next-gen frameworks fix crawlingCrawling is how search engines use automated bots (like Googlebot and Bingbot) to discover URLs and download pages. A page has to be crawlable to be indexed, but crawling on its own isn't a ranking factor. problems React can’t.” → With the right rendering mode, React with Next.js SSRs fine too; the mechanism difference is startup JavaScript cost, not crawlabilityCrawlability is how well search engine crawlers can discover, access, and fetch a site's pages. A crawlability issue is any technical condition — blocked access, broken links, server failures, or bloated URL inventory — that stops pages from reaching the index..
- ❌ “QwikCity/SolidStart guarantee content-rich HTML.” → Only true in an SSR/SSG rendering mode — both also support pure client-side rendering.
Test yourself: Next-Gen JavaScript Frameworks
Five quick questions on resumability, fine-grained reactivity, and the SEO case for next-gen frameworks. Pick an answer for each, then check.
Resources worth your time
My related writing
- JavaScript SEO: A Definitive Guide — my full guide to renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM., DOM parityWhether the rendered DOM matches what you expect the raw HTML to become., and getting JS-built content indexedStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed.; the foundation these framework-specific guides build on.
- Core Web Vitals: A Complete Guide — what INPInteraction to Next Paint — the input-to-paint latency at the 75th percentile of a page's interactions. ≤200 ms is good., LCPLargest Contentful Paint — render time of the largest visible image or text block, relative to when the page started loading. ≤2.5 s (at the 75th percentile) is good., and CLSCumulative Layout Shift — a unitless score for unexpected visual movement, taken from the largest burst (session window) of layout shifts, not the lifetime sum. ≤0.1 is good. actually measure and how they factor into SEO — the metrics next-gen frameworks optimize for.
- The Beginner’s Guide to Technical SEO — where framework choice and renderingTurning HTML, CSS, and JavaScript into the final visual page and DOM. fit in the bigger picture.
From around the industry
- Qwik — Resumable vs. Hydration — the clearest primary-source explanation of why resumability is different from hydrationActivating server-rendered HTML in the browser by attaching JavaScript handlers..
- SolidJS — Intro to Reactivity — signals and fine-grained reactivity straight from the docs.
- web.dev — Rendering on the Web — the Chrome team’s canonical framing of SSR, hydration, and their trade-offs (the context next-gen frameworks react against).
- js-framework-benchmark (current results) — the long-running benchmark where SolidJS sits near the top and ahead of React on update-heavy work.
- The Cost of JavaScript (Addy Osmani) — why shipping and executing JS is the performance bottleneck these frameworks attack.
- r/TechSEO — the community for debugging framework rendering and indexingStoring a crawled page in the search index so it can appear in results. Crawled is not the same as indexed — Google selects what to keep, and indexing isn't guaranteed. questions.
Build-time retrieval analysis plus live signals for this exact article. The automatic chunk report includes a deterministic readiness score and is ready without a model download.
Search Console
sampleGA4 traffic (28d)
sampleCloudflare traffic (7d)
sampledCrUX field data (28d, phone)
sampleGoogle NLP entities
localChangelog
Updated Jul 18, 2026.
Editorial summary and recorded change details.Summary
Corrected 'zero JavaScript' and 'crawling is fine' claims to match Qwik's and SolidJS's current official docs, and added the constraints each mechanism has in practice.
Change details
-
Named Qwikloader as the initial JavaScript that runs under Qwik resumability (registers a global listener, resolves QRLs, loads handler code on interaction) instead of describing resumability as zero JS.
-
Added a Qwik failure-modes section: $ serialization boundaries, noSerialize() values going undefined after resumption, and useVisibleTask$ as an eager browser-only escape hatch.
-
Separated SolidJS's fine-grained reactivity from SolidStart's rendering-mode choice (CSR / SSR sync-async-streaming / SSG) and its no-bundled-router-or-metadata-library default.
-
Rewrote the SEO section to separate crawlable HTML/metadata/links/status from browser runtime cost from measured Core Web Vitals, and removed unqualified 'crawling and indexing are fine' and CWV-guarantee language.
-
Labeled 'next-gen' explicitly as this article's own editorial taxonomy, not a standardized category, and version-scoped it to Qwik v2 (beta) and SolidStart 1.0 (docs beta, updated 2026-04-28).
Full comparison unavailable — no prior snapshot was archived for this revision.