Trailhead: 6 Builds, 1 Site
Same 3-page site. Six stacks. What each one actually costs — and what a crawler actually sees.
What was tested
The same 3-page hiking-trail site, built six separate times: two vanilla approaches (vanilla-static, a fully static multi-page build, and vanilla-spa, a client-side-routed single-page build), a custom Rust backend (site-server, real per-request server rendering), and the three mainstream frameworks — React, Vue, and Angular. Every stack implements the same four features — routing/transitions, a component, shared state, and a form + list — and every measurement below comes from each stack's actual production build (npm run build / cargo build --release, or used as-is for the two vanilla builds) served over real http://, not file:// and not a dev server.
What was found — deployable footprint
The three vanilla-ish stacks (vanilla-static, vanilla-spa, site-server) all ship 27–28KB of files a browser ever has to fetch for the same 3 pages. Vue ships 110.7KB, Angular 242.5KB, and React 293.0KB — React alone ships roughly 10x the browser-facing bytes of any vanilla stack for identical pages and features. (site-server's 1.55MB Rust binary lives on the server and is never downloaded by a visitor — it doesn't count against the browser-facing number.)
Dev-time tooling weight tells a similar story: the vanilla stacks need zero installed packages. Angular's node_modules alone comes to 210.1MB across 577 lockfile entries — bigger than roughly 7,000 copies of the entire vanilla-static site.
The standout finding — SEO/GEO crawlability
The sharper result isn't about bytes at all. Search crawlers and most LLM crawlers/retrievers (GPTBot, ClaudeBot, PerplexityBot, CCBot) fetch raw HTML — they don't execute JavaScript. Checked directly with curl against each stack's production build: React, Vue, Angular, and vanilla-spa all serve one generic <title> and zero of the seven trails' content in their raw HTML, for every route.
That's 4 of the 6 builds functionally invisible to a non-JS crawler. Only vanilla-static (real per-route files, hand-authored) and site-server (real per-request server rendering, with robots.txt/sitemap.xml/llms.txt generated at startup so they can't drift) actually deliver real per-page titles and content to anything that isn't running a browser.
| Stack | Browser-facing size | Visible to a non-JS crawler |
|---|---|---|
vanilla-static | 27–28KB | Yes |
vanilla-spa | 27–28KB | No |
site-server (Rust) | 27–28KB | Yes |
| Vue | 110.7KB | No |
| Angular | 242.5KB | No |
| React | 293.0KB | No |
The trap
The four "invisible" stacks aren't skipping SEO on purpose — each one got a real code change that updates document.title and the meta description client-side (Angular's Title/Meta services, Vue's router meta + afterEach, the others directly in a hook). It works, in the sense that a real visitor's browser tab updates correctly. But a plain HTTP crawler never runs that code, so it receives the exact same generic title and empty content it did before the "fix" — the change only ever reaches people, never crawlers.
Honest caveats
Not every number favors the vanilla stacks. On localhost — near-zero network latency — the framework builds had faster DOMContentLoaded despite shipping far more bytes, because they bundle everything into a single JS file (3 requests total) while the vanilla stacks split logic across 6–7 small files (8–10 requests). On a latency-bound network more requests cost more; on a bandwidth-bound network more bytes cost more — neither number alone settles which approach is "faster," and it depends on the network the site actually runs on.
Lines-of-code told an inverse story too: Vue needed the least hand-written glue for the four shared features, and the vanilla stacks needed the most, since they implement their own router, store, and component system instead of importing one.
The full 9-page comparison deck below covers all of this visually, including the raw data tables — page 9 is explicitly the author's personal case for the Rust server, marked as such, not the deck's neutral verdict.
01. Overview
02. Server Footprint
03. Download Speed
04. Bugs Found
05. Testing Quirks
06. SEO/GEO Crawlability
07. SEO/GEO Dynamic Files
08. Scorecard
09. The Builder's Case
justhtml