DEV Community

Alex Spinov
Alex Spinov

Posted on

SolidStart Has a Free Full-Stack Framework: Build Lightning-Fast Apps With Fine-Grained Reactivity

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
Enter fullscreen mode Exit fullscreen mode

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>
  );
}
Enter fullscreen mode Exit fullscreen mode

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>
  );
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)