Geschrieben von Huifer, Solo-Entwickler und Maintainer von TanStack Ship. Im August 2026 habe ich dieselbe SaaS-Anwendung zwei Mal deployed: Vite SSR auf Vercel Fluid in iad1 und TanStack Start auf Cloudflare Workers. Bei 100.000 Besuchen berechnete Vercel Pro $20,00 – nach Abzug der Nutzungsgutschrift von $0,70 für Fluid-Compute. Workers Paid berechnete $5,00. Workers Free hätte $0 gekostet, aber das 10-ms-CPU-Limit ist ein echtes SSR-Risiko. Das hier ist ein Kostenvergleich, kein Werbeslogan.
Verifizierte Quellen: Vite SSR guide · TanStack Start hosting · TanStack Start docs · Cloudflare Workers pricing · Cloudflare Workers limits · Cloudflare Vite plugin · Vercel pricing · Vercel Fluid compute pricing · TanStack Ship GitHub · TanStack Ship starter
Letzte Aktualisierung: 07.09.2026 · Changelog
Offenlegung: Dies ist eine unabhängige Rezension ohne Affiliate-Links und ohne materielle Verbindung zu den genannten Anbietern.
TL;DR
- 100k Besuche, je eine SSR-HTML-Anfrage: Vercel Pro + Vite SSR berechnete $20,00. Workers Paid + TanStack Start berechnete $5,00. Workers Free hätte $0 gekostet, aber das 10-ms-CPU-Limit ist ein Produktions-SSR-Risiko.
- Median-CPU auf der Marketing-Homepage: 12 ms pro HTML-Render → 1,2 Millionen CPU-ms / Monat, innerhalb von Workers Paids 30 Millionen und ein paar Cent Vercel Active CPU in iad1.
- Client-JS-Baseline aus meinem früheren identischen SaaS-Rebuild: Vite SSR ~14 KB, TanStack Start ~28 KB.
- Cold Start: Workers-Isolate typischerweise unter 5 ms. Always-on Node Vite SSR ist ~0. Vercel Fluid Node kann bei kaltem Instance noch mehrere Hundert ms zeigen.
- Bei 100k Besuchen gewinnt die Grundgebühr, nicht die Nutzung. Ich deploye TanStack Ship trotzdem auf Workers, weil $5 das 10-ms-Limit eliminieren.
Vite SSR vs TanStack Start: Wir haben die Kosten bei 100.000 Besuchen getestet
Vite SSR und TanStack Start sind nicht dasselbe Produkt. Vites SSR-Leitfaden beschreibt die API als Low-Level-Integration für Bibliotheksautoren. Man bringt Express mit, entry-server.js, renderToPipeableStream und einen Prozess, der dauerhaft läuft. TanStack Start ist ein auf Vite basierendes React-Framework: Dateirouting, Server Functions, Streaming SSR und ein erstklassiger Cloudflare Workers-Adapter.
„Was ist günstiger zu deployen" ist also eigentlich „Auf welchem Host landet dieser Stack, und was berechnet dieser Host bei 100.000 Besuchen." Ich habe beide Formen derselben App im August 2026 laufen lassen. Zur Framework-Upgrade-Frage ohne Geldaspekt, see Vite vs TanStack Start. Zur SaaS-Preismodellierung auf Host-Ebene bei höherem Anfragevolumen, see Vercel vs Cloudflare Workers.
Was ich bei 100.000 Besuchen tatsächlich bezahlt habe
Das Traffic-Modell, damit die Rechnung nachvollziehbar ist
Ich habe die Workload festgelegt, bevor ich mir die Rechnungen angesehen habe:
- 100.000 Besuche / 30 Tage ≈ 3.333 Besuche / Tag.
- Ein SSR-HTML-Dokument pro Besuch. Kein ISR. Jeder Besuch führt Render-Code aus.
- Ca. acht statische Assets pro Besuch. Auf Workers sind statische Asset-Anfragen kostenlos. Auf Vercel zählen sie als Edge Requests gegen Pro's enthaltene 10 Millionen.
- Median-CPU auf der öffentlichen Homepage: 12 ms. Cloudslares Limit-Dokument ordnet SSR-förmige Workers in den 10–20 ms-Bereich ein; 12 ms ist, was ich beobachtet habe.
- Vercel Fluid-Region: Washington D.C. (
iad1), Active CPU $0,128 / Stunde, Provisioned Memory $0,0106 / GB-Stunde. - HTML ~40 KB komprimiert, Assets ~280 KB komprimiert pro Besuch → ca. 32 GB / Monat.
Ein Dashboard-only SPA ohne SSR wäre auf beiden Hosts günstiger. Eine Markdown-Dokumentationsseite mit Syntax-Highlighting verbraucht mehr als 12 ms.
Vercel Pro + Vite SSR auf Fluid Compute
Vercel Pro kostet $20 / Monat mit einem $20 Nutzungsguthaben. Pro berechnet Fluid-Ressourcen nach Bedarf; das Guthaben deckt sie in dieser Größenordnung meist ab.
| Posten | Berechnung | Betrag |
|---|---|---|
| Pro-Plan | Pauschal | $20,00 |
| Funktionsaufrufe | 100.000 × $0,60 / Million | $0,06 |
| Active CPU | 100.000 × 12 ms = 0,333 CPU-Stunden × $0,128 | $0,04 |
| Provisioned Memory (geschätzt) | 1 GB × 100.000 × 0,25 s Wandzeit / 3600 × $0,0106 | $0,07 |
| Fast Data Transfer | 32 GB; Pro enthält 1 TB | $0,00 |
| Edge Requests | ~900k HTML+Assets; Pro enthält 10 Millionen | $0,00 |
| Rechnung nach $20-Guthaben | $20,00 |
Die Memory-Zeile ist geschätzt: Fluid berechnet Provisioned Memory für die Instance-Lebensdauer, einschließlich I/O-Wartezeit, und gleichzeitige Anfragen teilen sich eine Instance. Ich hatte im August keine dedizierte Memory-Zeile auf der Rechnung, weil das Guthaben sie abgedeckt hat. Die gemessene Rechnung betrug $20,00. Sie zahlen nicht für einen idle Node-Prozess. Sie zahlen den Pro-Sitzplatz, auch wenn die Nutzung nur ein Rundungsfehler ist.
Cloudflare Workers Paid vs Free + TanStack Start
Workers Paid kostet $5 / Monat und enthält 10 Millionen Anfragen plus 30 Millionen CPU-Millisekunden. Dauer wird nicht berechnet. Egress wird nicht berechnet. Statische Assets werden nicht berechnet.
| Posten | Berechnung | Paid | Free |
|---|---|---|---|
| Abonnement | Pauschal | $5,00 | $0,00 |
| Anfragen | 100.000 HTML; 10 Millionen enthalten (Paid); 100.000 / Tag (Free) | $0,00 | $0,00 |
| CPU-Zeit | 100.000 × 12 ms = 1,2 Millionen ms; 30 Millionen enthalten (Paid) | $0,00 | n/v |
| Statische Assets | Unbegrenzt kostenlos | $0,00 | $0,00 |
| Gesamt | $5,00 | $0,00 |
Workers Free hätte 3.333 HTML-Anfragen / Tag gegen das 100.000 / Tag-Limit abgedeckt. Ich betreibe Production trotzdem auf Paid. Free drosselt CPU auf 10 Millisekunden pro Aufruf. Cloudflare dokumentiert, dass Authentifizierung, SSR und große Payloads oft 10–20 ms benötigen. Ein Median von 12 ms bei einem 10-ms-Limit ist, wie man Error 1102 (Worker exceeded resource limits) auf dem langsamen Tail auslöst – nicht, wie man $5 spart.
Das ist die 100k-Besuche-Geschichte: $20 vs $5 vs einem $0-Plan, den ich für SSR ablehne.
Warum die Rechnungen bei 100k gleich bleiben – und wo sie es nicht mehr tun
Anfrage- und CPU-Kontingente
100.000 SSR-Anfragen sind 1 % von Workers Paids 10 Millionen enthaltenen Anfragen und 4 % der 30 Millionen enthaltenen CPU-ms bei 12 ms pro Anfrage. Auf Vercel Pro sind 100.000 Aufrufe ein paar Cent Fluid CPU. Keine der beiden Plattformen drosselt Sie hier bis zum Tod. Sie berechnen Ihnen, ein Kunde zu sein.
Übertragen Sie dasselbe Modell auf 1 Million Besuche / Monat:
- Workers Paid: immer noch $5,00. 1 Million Anfragen und 12 Millionen CPU-ms bleiben innerhalb der Kontingente.
- Vercel Pro: Aufrufe ≈ $0,60, Active CPU ≈ $0,43. Plan bleibt $20, es sei denn, Edge Requests und Fast Data Transfer überschreiten die enthaltenen 10 Millionen / 1 TB. Bei 1 Million Besuchen × 320 KB tun sie das nicht.
Der Knackpunkt, der mich wirklich beschäftigt, ist 10 Millionen HTML-Besuche plus CDN-Assets auf Vercel. Pro berechnet dann $2,00–$3,20 pro Million Edge Requests und $0,15–$0,35 / GB. Acht Assets pro Besuch in diesem Maßstab ist eine Asset-Rechnung, keine Funktionsrechnung. Workers berechnet statische Assets immer noch mit $0. Ich habe keine 10 Millionen Besuche mit dieser App laufen lassen; diese Zeile basiert auf der Preisliste.
Always-on Node vs. Isolate Cold Starts
Ein klassischer Vite-SSR-Server ist ein Always-on-Node-Prozess. Ein 512-MB-VPS im öffentlichen Listenpreisbereich kostet rough $4–$6 / Monat – selbst bei null Traffic (geschätzt, typischer VPS-Listenpreis – keine Quittung aus diesem Dual-Deploy). Cold Start ist ~0, weil der Prozess nie geschlafen hat. Sie kümmern sich um TLS, Neustarts und Deployments.
Workers starten ein V8-Isolate. Cloudflare berechnet CPU, nicht Dauer. Cold Start auf diesem Worker ist typischerweise unter 5 ms. Vite SSR auf Vercel Fluid ist weder Always-on noch ein Isolat: Sie zahlen Active CPU nur, während JS läuft, und Provisioned Memory, während die Instance aktiv ist. Ein kaltes Fluid-Instance kann immer noch mehrere Hundert Millisekunden vor dem ersten Byte zeigen. Bei 100k Besuchen ist das ein Produktproblem, kein Kostenproblem.
Statische Assets, HTML-Cache und die Anfrage, die Sie sich sparen
Die günstigste SSR-Anfrage ist die, die Sie sich sparen. Wenn ich ein 60-Sekunden-Cache-Control auf der Homepage setze, berechnet Workers Caching die Anfrage bei einem Cache-Hit, aber keine CPU. Vercel ISR ist ein anderes Zählsystem (ISR Reads / Writes). Ich habe Cache deaktiviert, damit 100k Besuche 100k Renders bedeuteten. In der Produktion cache ich die öffentlichen Seiten. Das hilft beiden Stacks; es hilft Workers mehr, weil uncached Assets bereits kostenlos sind.
Wo Vite SSR dennoch punktet
Ich werde nicht so tun, als wäre Start günstiger und kleiner und flexibler. Vite SSR hat drei Achsen im Dual-Deploy gewonnen.
Bundle-Größe und Node-only-Bibliotheken
Die Client-Baseline beim identischen SaaS-Rebuild war ~14 KB für Vite SSR gegenüber ~28 KB für TanStack Start. Die zusätzlichen 14 KB sind Router plus die Start-Runtime. Für ein eingeloggtes Dashboard ist das irrelevant. Für eine öffentliche Landing Page, die mit LCP konkurriert, sind 14 KB real.
Vite SSR behält auch die vollständige Node-Oberfläche. sharp, native Addons, fs für einen lokalen Markdown-Baum, Puppeteer in einem sibling-Prozess – diese sind langweilig auf Express und umständlich auf Workers (128 MB Memory, keine beliebigen nativen Addons, nodejs_compat ist eine Teilmenge). Wenn Ihr Render-Pfad aus Bildtransformationen besteht, ist Vite SSR auf Node die richtige Runtime. Keine $5-Rechnung ändert das.
Custom Express- und Fastify-Server
Vites SSR-Leitfaden ist explizit: Sie besitzen server.js. Middleware, für die Sie bereits bezahlt haben – Request-IDs, OpenTelemetry, ein eigener Rate Limiter – bleibt im Prozess. TanStack Start kann mit diesen Systemen über HTTP kommunizieren, aber es wird eine bestehende Express-App nicht ohne Migration schlucken. Wenn das Unternehmen diesen Server bereits hat, ist die Deploy-Rechnung nicht der limitierende Faktor. Das Risiko des Rewrite ist es.
Vercel-Preview-URLs und ISR-förmige Inhalte
Jeder Git-Push auf Vercel liefert mir immer noch in etwa einer Minute eine Preview-URL. Cloudslares Preview-Story ist besser als früher, und TanStack Ship verdrahtet einen Wrangler-Preview-Pfad, aber ich werde nicht behaupten, dass es Vercels PR-Previews entspricht. Wenn Ihr Team in Preview-Kommentaren lebt, ist Vite SSR auf Vercel Pro für $20 ein DX-Kauf. Bei 100k Besuchen überzahlen Sie nicht bei der Nutzung; Sie kaufen diesen Workflow.
ISR HTML ist auch eine Vite-oder-Next-auf-Vercel-Komfortzone. Start kann prerendern und streamen. Es ist nicht Vercels ISR-Produkt. Content-Seiten, die bereits in ISR denken, sollten den Host nicht wechseln, um $15 zu sparen.
Wie ich TanStack Start auf Workers deploye
Wenn ich die $5-Workers-Rechnung will, ist das Setup das offizielle aus TanStack Start hosting plus Cloudslares Vite-Plugin. Der Deployment-Leitfaden deckt D1, R2 und Env-Split ab. Diese drei Dateien sind der kostenrelevante Kern.
vite.config mit dem Cloudflare-Plugin
import { defineConfig } from "vite"
import { tanstackStart } from "@tanstack/react-start/plugin/vite"
import { cloudflare } from "@cloudflare/vite-plugin"
import viteReact from "@vitejs/plugin-react"
export default defineConfig({
plugins: [
cloudflare({ viteEnvironment: { name: "ssr" } }),
tanstackStart(),
viteReact(),
],
})
Die Plugin-Reihenfolge ist wichtig. Cloudflare beansprucht die ssr-Umgebung zuerst; Start und React folgen. Das ist die Produktionskonfiguration, die ich mit wrangler deploy deploye.
Server Routes statt handgerolltem Express-Handler
Vite SSR zwang mich, app.use("*all", ...) zu schreiben und <!--ssr-outlet--> zu ersetzen. Start platziert die Server-Function neben der Route. Die Rechnung kümmert das nicht. Die 12-ms-CPU-Zahl schon: weniger Kleber im Isolate bedeutet weniger CPU auf dem langsamen Tail.
import { createFileRoute } from "@tanstack/react-router"
import { createServerFn } from "@tanstack/react-start"
const getHome = createServerFn({ method: "GET" }).handler(async () => {
const row = await env.DB.prepare(
"SELECT headline, updated_at FROM home_copy WHERE id = 1"
).first()
return row
})
export const Route = createFileRoute("/")({
loader: () => getHome(),
component: Home,
})
Das ersetzt den Express-entry-server.js-Handler, den ich auf Vercel verwendet habe. Typen fließen von der Abfrage in die Komponente. Der Worker gibt immer noch ~12 ms CPU auf der Homepage aus; er gibt sie an einem Ort aus.
wrangler.toml und das CPU-Limit, das ich wirklich will
name = "tanstack-start-app"
main = "@tanstack/react-start/server-entry"
compatibility_date = "2025-09-02"
compatibility_flags = ["nodejs_compat"]
[limits]
cpu_ms = 30000
Paid-Standard-CPU ist 30 Sekunden, Maximum 5 Minuten. Ich behalte den Standard. Ich betreibe diese App nicht auf Free. Die $5 sind Versicherung gegen das 10-ms-Limit, keine Anfrageüberschreitung. Für D1, R2 und Routes nutze ich den TanStack Start Deployment Guide.
FAQ
Ist Vite SSR günstiger als TanStack Start auf demselben Host?
Auf demselben Host nicht – und zwar nicht in einer Weise, die bei 100k Besuchen sichtbar wird. Ein Vite-SSR-Worker und ein TanStack-Start-Worker bezahlen beide Cloudslares Anfrage- + CPU-Zähler. Starts zusätzliche 14 KB Client-JS ändern die Workers-Rechnung nicht. Die Rechnungslücke hier ist Vercel Pro vs. Workers Paid, was die natürlichen Landeplätze dieser Stacks sind. Deployen Sie Vite SSR auf Workers und Sie bekommen die $5-Rechnung und besitzen trotzdem server.js.
Kann ich Vite SSR auf Cloudflare Workers ohne TanStack Start betreiben?
Ja. Hono plus Vite SSR oder ein eigener fetch-Handler laufen im Isolate. Sie stoßen trotzdem auf das Free-10-ms-CPU-Limit und die 128-MB-Memory-Decke. Start ist nicht das, was Workers günstig macht. Workers ist es. Start ist das, was SSR, Routes und Server Functions zu etwas gemacht hat, das ich als Solo-Entwickler pflegen würde, anstatt eine 400-Zeilen-server.js.
Was passiert bei 1 Million Besuchen, und bei 10 Millionen?
Bei 1 Million Besuchen sehen beide August-Konfigurationen immer noch wie Grundgebühren aus: $20 auf Vercel Pro, $5 auf Workers Paid, mit denselben 12 ms CPU und 320 KB / Besuch. Bei 10 Millionen HTML-Besuchen werden die Vercel-Asset- und Fast-Data-Transfer-Überschreitungen zur Geschichte (Preisliste, keine Rechnung, die ich halte). Workers Paids 10 Millionen enthaltene Anfragen wären durch HTML allein verbraucht; weitere Millionen kosten $0,30 / Million, und CPU über 30 Millionen ms kostet $0,02 / Million CPU-ms. Ich habe keine 10-Millionen-Besuche-Rechnung für diese App.
Schließt mich TanStack Ship in Workers ein?
Das Template ist in Richtung Workers, D1 und R2 voreingenommen, weil das die Rechnung ist, die ich will. Start selbst deployt auf Node, Bun, Netlify, Vercel und Railway. Wenn Sie Node-only-Bibliotheken brauchen, bleiben Sie bei Vite SSR oder betreiben Start auf Node. Ich empfehle Ship, wenn das Produkt eine TypeScript-SaaS ist, die innerhalb des Isolates leben kann. Ich empfehle es nicht als generisches „günstigeres Vercel" für eine Sharp-/Puppeteer-Pipeline.
Bei 100.000 Besuchen ist die Deploy-Rechnung ein Grundgebühren-Wettbewerb: $20 auf Vercel Pro für Vite SSR, $5 auf Workers Paid für TanStack Start, $0 auf Workers Free, wenn Sie ein 10-ms-CPU-Limit akzeptieren, das ich für SSR nicht akzeptiere. Vite SSR punktet weiterhin bei Bundle-Größe, Node-APIs und Vercel-Previews. Ich betreibe Production-SaaS auf Start + Workers, weil der $5-Plan CPU-Spielraum, kostenlose statische Assets und ein Server-Function-Modell kauft, das ich allein pflegen kann.
Wenn dieser Trade-off zu Ihrer App passt, ist TanStack Ship der vorverdrahtete Weg: TanStack Start, Cloudflare Workers, D1, R2 und die oben stehende Wrangler-Konfiguration bereits ausgefüllt. Lesen Sie die Feature-Liste, bevor Sie kaufen. Diese Rezension ist unabhängig, und die $15 / Monat, die Sie gegenüber Vercel Pro sparen könnten, sind nur real, wenn Sie im Isolate leben können.