React re-renders your entire component tree when state changes. Vue tracks dependencies but still batches updates. Svelte compiles away the framework but loses ecosystem size.
What if your framework only updated the exact DOM node that changed? No virtual DOM. No diffing. No wasted renders.
That's SolidJS. And SolidStart is its full-stack framework.
What SolidStart Gives You
SolidStart is to Solid what Next.js is to React — a batteries-included full-stack framework:
- Fine-grained reactivity — only the specific text node or attribute updates, not the whole component
-
Server functions — call backend code directly from components with
"use server" - File-based routing — nested layouts, dynamic params, catch-all routes
- SSR, SSG, and streaming — pick your rendering strategy per route
- Vinxi-powered — Vite + Nitro under the hood for universal deployment
- Zero config — works out of the box with TypeScript
Quick Start
npm init solid@latest my-app
cd my-app && npm install && npm run dev
Fine-Grained Reactivity in Action
import { createSignal } from "solid-js";
function Counter() {
const [count, setCount] = createSignal(0);
console.log("This runs ONCE — not on every update");
return (
<div>
{/* Only THIS text node updates when count changes */}
<p>Count: {count()}</p>
<button onClick={() => setCount(c => c + 1)}>Increment</button>
</div>
);
}
In React, the entire Counter function re-executes on every click. In Solid, only the {count()} text node updates. The component function runs exactly once.
Server Functions — Backend Without an API Layer
// src/routes/dashboard.tsx
import { createAsync } from "@solidjs/router";
// This function runs on the server — never exposed to the client
async function getMetrics() {
"use server";
const db = await connectToDatabase();
return db.query("SELECT * FROM metrics ORDER BY date DESC LIMIT 30");
}
export default function Dashboard() {
const metrics = createAsync(() => getMetrics());
return (
<div>
<h1>Dashboard</h1>
<For each={metrics()}>
{(metric) => <MetricCard data={metric} />}
</For>
</div>
);
}
No API routes. No fetch calls. No loading state boilerplate. The "use server" directive handles serialization, error handling, and hydration.
Nested Layouts with File-Based Routing
src/routes/
(auth)/
login.tsx
register.tsx
dashboard/
index.tsx
settings.tsx
[projectId]/
index.tsx
analytics.tsx
layout.tsx ← wraps everything
Performance: Solid vs React vs Svelte
Solid consistently benchmarks as the fastest JavaScript UI framework:
| Benchmark | Solid | React | Svelte |
|---|---|---|---|
| JS Framework Benchmark (weighted) | 1.06x | 1.63x | 1.18x |
| Startup time | 13ms | 47ms | 19ms |
| Memory (10K rows) | 3.2MB | 8.1MB | 4.7MB |
When to Choose SolidStart
Pick SolidStart when:
- Performance is critical (dashboards, data-heavy apps, real-time UIs)
- You want React-like DX without React's re-rendering overhead
- You need SSR/streaming with minimal TTFB
Skip SolidStart when:
- You need a massive component ecosystem (React has more third-party components)
- Your team already knows Next.js and doesn't want to learn new patterns
- SEO-only sites (Astro might be simpler)
The Bottom Line
SolidStart proves you don't need a virtual DOM to build complex full-stack apps. Fine-grained reactivity means your app gets faster as it grows more complex — the opposite of most frameworks.
Start here: start.solidjs.com
Need custom data extraction, scraping, or automation? I build tools that collect and process data at scale — 78 actors on Apify Store and 265+ open-source repos. Email me: Spinov001@gmail.com | My Apify Actors
Top comments (0)