← Research

Trailhead: 6 Builds, 1 Site

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.

Browser-facing footprint and non-JS crawler visibility, by stack
StackBrowser-facing sizeVisible to a non-JS crawler
vanilla-static27–28KBYes
vanilla-spa27–28KBNo
site-server (Rust)27–28KBYes
Vue110.7KBNo
Angular242.5KBNo
React293.0KBNo

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