solid-js
SolidJS — fine-grained reactivity, no VDOM
One rule governs everything else: the component function runs ONCE. Reactivity does not live in re-running the body — it lives in the reads. You read state by calling a getter (count()), and Solid re-runs only the exact DOM expression or effect that read it. There is no virtual DOM and no reconciliation; JSX compiles straight to DOM nodes. If you carry React habits here (destructuring props, expecting the body to re-run, deriving state in an effect), reactivity breaks silently — the code runs, it just stops updating.
Versions: stable is solid-js 1.9.x (1.9.11/1.9.13 line). Solid 2.0 is in beta on the next npm tag with a new reactive core (@solidjs/signals), createAsync, and automatic batching. Default to 1.9.x APIs unless the task says 2.0; flag the divergence where it matters.
When to use / when not
| Situation | Skill |
|---|---|
Solid signals/stores/effects/memos/resources, JSX-to-DOM, <For>/<Index> |
this skill |
React useState/hooks/re-render model (the body re-runs) |
react |
| Next.js routing, server actions, RSC | nextjs |
Svelte 5 $state/$derived runes (similar look, different compiler) |
svelte |
Vue/Nuxt ref/reactive/computed |
vue-nuxt |
| Astro island architecture / what ships to the client (can host a Solid island) | astro |
| Plain TypeScript questions with no Solid surface | ../typescript/SKILL.md |
| Deploying the built app (Vercel/SolidStart adapter) | ../vercel/SKILL.md |