Comparison
This table compares @lazarv/react-server against other popular React frameworks and routing solutions. The comparison covers full-stack features, architecture, routing, type safety, search params, scroll restoration, and developer experience.
This comparison summarizes the feature set described in the documentation. It focuses on first-class, built-in support rather than custom userland solutions. Some rows describe core architecture, others cover convenience or router ergonomics, so the table should be read as a map of tradeoffs, not a single score.
This comparison is maintained by the
@lazarv/react-serverteam. If you find an inaccuracy, please open an issue — we want this to be fair and factual.
Legend:
- ✅ — First-class, built-in support that is documented and part of the framework’s intended model
- 🟡 — Partial support, important limitations, or support that exists only in a narrower subset of use cases
- 🔶 — Possible through userland composition, community plugins, or manual setup, but not a first-class built-in feature
- 🛑 — No meaningful built-in support
| @lazarv/react-server | Next.js | TanStack Start | React Router | Waku | |
|---|---|---|---|---|---|
| React Server Components | ✅ | ✅ | 🛑 | 🟡 | ✅ |
| Server Functions (actions) | ✅ | ✅ | ✅ | 🟡 | ✅ |
| SSR | ✅ | ✅ | ✅ | ✅ | ✅ |
| Streaming SSR | ✅ | ✅ | ✅ | ✅ | ✅ |
| API Routes | ✅ | ✅ | ✅ | ✅ | ✅ |
| API / Route Middleware | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Server Function Middleware | 🟡 | 🛑 | ✅ | 🛑 | 🛑 |
| Static Site Generation | ✅ | ✅ | 🟡 | 🟡 | ✅ |
| Partial Pre-rendering (PPR) | ✅ | ✅ | 🛑 | 🛑 | 🛑 |
| Response Caching (TTL) | ✅ | ✅ | 🛑 | 🛑 | 🛑 |
| Redirects (server) | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Rewrites (server) | ✅ | ✅ | 🛑 | 🛑 | 🛑 |
| Reload / Invalidation | ✅ | ✅ | ✅ | ✅ | 🛑 |
| @lazarv/react-server | Next.js | TanStack Start | React Router | Waku | |
|---|---|---|---|---|---|
| Open Runtime (no vendor lock-in) | ✅ | 🟡 optimized for Vercel | ✅ | ✅ | ✅ |
| Vite-based | ✅ | 🛑 | ✅ | ✅ | ✅ |
| Multiple Deploy Targets | ✅ | 🟡 | ✅ | ✅ | ✅ |
| Micro-frontend / Remote Components | ✅ | 🔶 | 🛑 | 🛑 | 🛑 |
| MCP Server Integration | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Worker / Multi-threaded Rendering | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Cluster Mode | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Adapter-based Deployment | ✅ | 🟡 | ✅ | ✅ | ✅ |
| @lazarv/react-server | Next.js | TanStack Router | React Router | Waku | |
|---|---|---|---|---|---|
| Nested / Layout Routes | ✅ | ✅ | ✅ | ✅ | ✅ |
| Code-based Routes | ✅ | 🛑 | ✅ | ✅ | 🛑 |
| File-based Routes | ✅ | ✅ | ✅ | ✅ | ✅ |
| Virtual / Programmatic Routes | ✅ | 🛑 | ✅ | ✅ | 🛑 |
| Ranked Route Matching | ✅ | ✅ | ✅ | ✅ | 🛑 |
| Suspense Route Transitions | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Suspense Route Elements | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Error Boundary Elements | ✅ | ✅ | ✅ | ✅ | ✅ |
| Loading / Pending Elements | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Client-only Routes | ✅ | 🛑 | ✅ | ✅ | 🛑 |
| Parallel Routes / Outlets | ✅ | ✅ | 🛑 | 🛑 | 🟡 |
| Route Prefetching | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Automatic Prefetching | ✅ | ✅ | ✅ | ✅ | 🛑 |
| Active Link Customization | ✅ | ✅ | ✅ | ✅ | 🛑 |
| Navigation Guards / Blocker | ✅ | 🛑 | ✅ | 🟡 | 🛑 |
<Form> Component | ✅ | ✅ | 🛑 | ✅ | 🛑 |
| Deferred / Streaming Primitives | ✅ | ✅ | ✅ | ✅ | 🟡 |
| @lazarv/react-server | Next.js | TanStack Router | React Router | Waku | |
|---|---|---|---|---|---|
| Typesafe Route Paths | ✅ | 🟡 | ✅ | 🟡 | 🛑 |
| Typesafe Path Params | ✅ | 🛑 | ✅ | ✅ | 🟡 |
| Typesafe Navigation | ✅ | 🟡 | ✅ | 🟡 | 🛑 |
| Typesafe Search Params | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Path Param Validation | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Path Param Coercion / Parsing | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Typed Link Components | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Typed Hooks (useParams, useSearchParams) | ✅ | 🛑 | ✅ | 🟡 | 🛑 |
| Auto-generated Route Types (file-router) | ✅ | 🟡 | ✅ | 🛑 | 🛑 |
| Branded Outlet Types | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Multi-library Schema Support (Zod, ArkType, Valibot) | ✅ | 🛑 | 🟡 | 🛑 | 🛑 |
| Lightweight Parse Functions (no schema library) | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| @lazarv/react-server | Next.js | TanStack Router | React Router | Waku | |
|---|---|---|---|---|---|
| Basic Search Params | ✅ | ✅ | ✅ | ✅ | 🟡 |
| Search Param Hooks | ✅ | ✅ | ✅ | ✅ | 🛑 |
| Typed Search Params | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Search Param Schema Validation | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
<Link> / useNavigate Search API (object, not string) | ✅ | 🟡 | ✅ | 🟡 | 🛑 |
Functional Search Updaters (prev => next) | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Search Param Transforms (encode/decode boundary) | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Route-scoped Search Transforms | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Custom Search Parsing/Serialization | ✅ | 🛑 | ✅ | 🔶 | 🛑 |
| @lazarv/react-server | Next.js | TanStack Router | React Router | Waku | |
|---|---|---|---|---|---|
| Window Scroll Restoration | ✅ | 🟡 | ✅ | ✅ | 🟡 |
| Element / Container Scroll Restoration | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Async Content Scroll Restoration | ✅ | 🛑 | ✅ | 🛑 | 🛑 |
| Per-route Scroll Customization | ✅ | 🛑 | 🟡 | 🛑 | 🛑 |
| Zero-flash Restoration (pre-hydration script) | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
prefers-reduced-motion Aware | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Hash / Anchor Scrolling | ✅ | ✅ | ✅ | ✅ | 🛑 |
| Config-level Enable (zero code) | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Query-only Changes Preserve Scroll | ✅ | 🛑 | 🟡 | 🛑 | 🛑 |
| @lazarv/react-server | Next.js | TanStack Router | React Router | Waku | |
|---|---|---|---|---|---|
| Typed Resource Descriptors | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Schema-validated Resource Keys | ✅ | 🛑 | 🟡 | 🛑 | 🛑 |
Suspense-integrated .use() Hook | ✅ | 🛑 | ✅ | 🟡 | 🛑 |
| Resource Invalidation (per-key) | ✅ | 🟡 | ✅ | 🛑 | 🛑 |
| Resource Collections | ✅ | 🛑 | 🛑 | 🛑 | 🛑 |
| Route-Resource Binding (prefetch) | ✅ | 🛑 | ✅ | ✅ | 🛑 |
| Router Loaders (data fetching) | ✅ RSC + resources | 🟡 | ✅ | ✅ | 🟡 |
| SWR / Stale-While-Revalidate Caching | ✅ "use cache" | ✅ | ✅ | 🛑 | 🛑 |
| Server & Client Loaders | ✅ | 🟡 | ✅ | ✅ | 🛑 |
| @lazarv/react-server | Next.js | TanStack Router | React Router | Waku | |
|---|---|---|---|---|---|
| Zero-config File Router | ✅ | ✅ | 🟡 | 🟡 | ✅ |
| MDX Pages | ✅ | 🔶 | 🛑 | 🛑 | 🛑 |
| Virtual Routes Module | ✅ | 🛑 | 🟡 | 🟡 | 🛑 |
| Route-scoped Loading / Error / Fallback Files | ✅ | ✅ | 🛑 | 🛑 | 🛑 |
| Route Devtools | 🛑 | 🛑 | ✅ | 🟡 | 🛑 |
| Route Masking | 🛑 | 🛑 | ✅ | 🛑 | 🛑 |
| Route-level Typed Dependencies | ✅ Typesafe resources | 🛑 | ✅ Typesafe route context + loaders | 🛑 | 🛑 |
| Route Mount / Unmount Events | 🛑 | 🛑 | ✅ | 🛑 | 🛑 |
@lazarv/react-server is a full React Server Components runtime — not just a router. The routing system is deeply integrated with RSC streaming, server functions, and the Vite build pipeline. This means features like typed routes, client-only routes, and server-side validation work end-to-end without glue code.
Key architectural differences
- RSC-native: Unlike routers that bolt RSC support on top,
@lazarv/react-serverwas built from the ground up for React Server Components. Every route can mix server and client components freely. - Client-only routes: Pages with
"use client"in the file-system router are automatically client-only — navigation skips the server entirely. No configuration needed, and component state is preserved across navigations via React's<Activity>component. - Schema-agnostic validation: Route params and search params can be validated with any schema library (Zod, ArkType, Valibot) or lightweight parse functions — the runtime detects the validation strategy automatically.
- RSC + typed resources:
@lazarv/react-serveroffers two complementary data-fetching approaches: React Server Components withasync/await(RSC as loaders), and typed resources — schema-validated, reference-identified data descriptors with.use()(suspense),.query()(imperative),.prefetch(), and.invalidate(). Resources use"use cache"as the caching runtime — no custom cache layer, no SWR boilerplate. Route-resource bindings enable parallel prefetching on navigation. - Route-level dependencies: TanStack Router exposes route context as a first-class typed primitive for passing dependencies (auth, DB clients, etc.) down the route tree.
@lazarv/react-servermodels the same problem space through typed resources, request context, and native modules — there is no separate route-context bag because resources already carry schema-validated, route-scoped data with full type safety. - No devtools yet: Route devtools are planned. The tradeoff today is that the typed route system provides compile-time safety that catches most routing errors before they reach the browser.
- Outlets vs. parallel routes:
@lazarv/react-serveruses named outlets (@sidebar,@content) rendered as typed props to layouts. This is functionally similar to Next.js parallel routes but with stronger typing — each outlet is a branded React element that prevents accidentally swapping outlets. - Waku: Waku is another RSC-native framework built on Vite, but takes a deliberately minimal approach. It provides basic file-based routing with layouts and RSC support, but lacks the typed routing system, search param handling, scroll restoration, middleware, and most advanced routing features. Waku's
Linkcomponent supports basicscrollandprefetchOnEnter/prefetchOnViewprops, but most of its router API is still marked asunstable_. Waku is a good choice for simple RSC applications that don't need advanced routing.