Solid.js Frontend Website Development
Solid.js is a reactive framework that compiles into native DOM code without virtual tree. No reconciliation overhead, no re-render of entire component tree. If you need React-like DX with performance close to vanilla JS, Solid.js covers it.
Why Solid.js, not React or Vue
| Criterion | React 18 | Vue 3 | Solid.js 1.x |
|---|---|---|---|
| Virtual DOM | Yes | Yes | No |
| Granular reactivity | No | Partial | Yes |
| Bundle size (hello world) | ~45 KB | ~34 KB | ~7 KB |
| TTI on weak devices | Higher | Medium | Lower |
| JSX | Yes | Optional | Yes |
Components in Solid run once. No hooks with rules, no dependence on call order. Reactivity built via createSignal, createMemo, and createEffect — compile-time primitives that generate precise DOM subscriptions.
Project architecture
Standard stack for production Solid.js project:
- SolidStart — full-stack meta-framework (SSR/SSG/SPA modes)
- @solidjs/router — client and server routing
- @tanstack/solid-query — async data and caching
- solid-primitives — additional reactive primitives
- Vite — build, HMR, code splitting
// Example component with reactive state
import { createSignal, createMemo, For } from 'solid-js';
function ProductList(props) {
const [filter, setFilter] = createSignal('');
const filtered = createMemo(() =>
props.items.filter(p =>
p.name.toLowerCase().includes(filter().toLowerCase())
)
);
return (
<div>
<input value={filter()} onInput={e => setFilter(e.target.value)} />
<For each={filtered()}>
{item => <ProductCard item={item} />}
</For>
</div>
);
}
createMemo recalculates only when filter() or props.items change — without unnecessary iterations.
What's included in development
Basic integration (1–2 weeks)
- SolidStart + Vite + TypeScript setup
- Routing configuration with lazy-loading routes
- TanStack Query integration for API work
- Basic animations via Motion One
Full frontend (3–5 weeks)
- Component library matching client design system
- Forms with validation via
@modular-forms/solid - REST/GraphQL API integration (Axios or fetch + typing)
- SSR mode via SolidStart with
createRouteData - Core Web Vitals optimization: LCP < 1.5s, CLS = 0
Implementation specifics
State management solved via built-in primitives without external state managers. For global state use Context + Signal pattern:
import { createContext, useContext, createSignal } from 'solid-js';
const CartContext = createContext();
export function CartProvider(props) {
const [items, setItems] = createSignal([]);
const add = (item) => setItems(prev => [...prev, item]);
return (
<CartContext.Provider value={{ items, add }}>
{props.children}
</CartContext.Provider>
);
}
export const useCart = () => useContext(CartContext);
Streaming SSR available out of box in SolidStart — components delivered to client as ready via Suspense and <Show>, without HTML stream blocking.
Timeline and stages
- Week 1: environment setup, component base, routing
- Weeks 2–3: business logic, API integration, forms
- Week 4: SEO, SSR or SSG, bundle optimization
- Week 5: testing (Vitest + @solidjs/testing-library), deployment
Deployment and infrastructure
SolidStart supports adapters for Vercel, Netlify, Cloudflare Workers, Node.js. Static mode generates clean HTML + minimal JS hydrator. For Cloudflare Workers bundle size matters — Solid.js bundle at 7 KB has direct business value here.
If project already on React — migration possible gradually. Solid.js components can be embedded in existing page via render() without rebuilding everything.







