Beyond React: Exploring Svelte and SolidJS

Beyond React: Exploring Svelte and SolidJS

Beyond React: Exploring Svelte and SolidJS


The Architecture of Modern UI: React, Svelte, and SolidJS

To borrow from Vitruvius, the Roman architect, a sound structure requires firmitas, utilitas, and venustas—strength, utility, and beauty. In the realm of front-end frameworks, these virtues manifest as performance, developer ergonomics, and expressive syntax. Let us survey Svelte and SolidJS as two compelling heirs to React’s architectural legacy, each reimagining how we build the grand facades and hidden corridors of the modern web.


Core Philosophies: A Comparative Table

Attribute React Svelte SolidJS
Rendering Model Virtual DOM Diffing Compile-time DOM Generation Fine-grained Reactivity
Component Model Function/Class Compiled Functions Functions
Reactivity State/Props, Hooks Assignments/Stores Signals
Bundle Size Medium–Large Small Tiny
Learning Curve Moderate Shallow Moderate
Ecosystem Vast Growing Growing
SSR Support Yes Yes Yes
Typescript Support Strong Good Excellent

Svelte: The Compiler as Craftsman

Svelte takes a path not unlike Brunelleschi’s dome—eschewing heavy scaffolding (runtime) in favor of precise pre-fabrication (compile-time). Rather than ship a virtual DOM, Svelte compiles your declarative components into efficient, imperative JavaScript that surgically updates the DOM.

The Svelte Syntax: Simplicity in Action

<script>
  let count = 0;
</script>

<button on:click={() => count++}>
  Count: {count}
</button>
  • Reactivity by Assignment: Svelte tracks assignments (count = ...) and wires reactivity automatically—no need for hooks or useEffect.
  • Stores for Shared State: For state shared across components, Svelte provides stores:
// store.js
import { writable } from 'svelte/store';
export const user = writable({ name: "Dante" });

// In a component
<script>
  import { user } from './store.js';
</script>

<p>{$user.name}</p>
  • Transitions & Animations: Like adding a flying buttress, Svelte’s transitions are declarative and unobtrusive:
<div transition:fade>
  Hello, subtle world!
</div>

Svelte: Building and Running

Svelte projects are scaffolded via npm create vite@latest my-app -- --template svelte. The build process generates pure JavaScript, with no Svelte runtime in the bundle—resulting in minuscule payloads and swift start-up.


SolidJS: The Fine-grained Mechanism

If Svelte is the master sculptor, pre-chiseling marble, SolidJS is the watchmaker—constructing intricate, reactive mechanisms that tick with minimal overhead. SolidJS eschews the virtual DOM entirely, instead tracking dependencies at the level of individual computations.

Signals: The Heart of Reactivity

import { createSignal } from "solid-js";

function Counter() {
  const [count, setCount] = createSignal(0);

  return (
    <button onClick={() => setCount(count() + 1)}>
      Count: {count()}
    </button>
  );
}
  • Signals: Like the gears in an orrery, signals represent reactive values. When setCount is called, only the dependent DOM nodes are updated.
  • JSX Syntax: SolidJS uses JSX, easing transitions for those versed in React.
  • No Component Re-renders: Components are invoked once. Only the reactive expressions (e.g., {count()}) update, ensuring precision.

Advanced Patterns: Control Flow and Effects

import { createSignal, createEffect, Show } from "solid-js";

const [visible, setVisible] = createSignal(true);

<Show when={visible()}>
  <p>This is visible.</p>
</Show>

createEffect(() => {
  console.log("Visibility changed:", visible());
});
  • Show: For conditional rendering, reminiscent of Chaucer’s subtle asides—rendered only when necessary.
  • createEffect: Runs side effects when dependencies change, akin to React’s useEffect, but with deterministic dependency tracking.

Practical Comparison: Rendering a List

Let us observe how each framework renders a dynamic list—a frequent motif in the developer’s repertoire.

React

function List({ items }) {
  return (
    <ul>
      {items.map(item => <li key={item.id}>{item.text}</li>)}
    </ul>
  );
}

Svelte

<script>
  export let items = [];
</script>

<ul>
  {#each items as item (item.id)}
    <li>{item.text}</li>
  {/each}
</ul>

SolidJS

import { For } from "solid-js";

function List(props) {
  return (
    <ul>
      <For each={props.items}>
        {item => <li>{item.text}</li>}
      </For>
    </ul>
  );
}
  • Observation: SolidJS’s <For> and Svelte’s {#each} are purpose-built for efficient iteration, updating only changed elements—like a master restorer touching up a single mosaic tile.

Performance: Benchmarks at a Glance

Operation React (17.x) Svelte (3.x) SolidJS (1.x)
Initial Render Good Excellent Excellent
Update 1,000 Items Moderate Excellent Outstanding
Bundle Size (Hello World) ~42 KB ~1.7 KB ~2.5 KB
Memory Usage Moderate Low Very Low

Source: krausest/js-framework-benchmark

Take these numbers as one would a weathered map—subject to interpretation, but revealing of the terrain.


Interoperability and Ecosystem Considerations

  • React: The city-state of Athens—cosmopolitan, with a library for every need, yet sometimes crowded.
  • Svelte: The Florentine atelier—lean, focused, with artisan-crafted tools (SvelteKit, Svelte Material UI).
  • SolidJS: The scholar’s study—compact, with a growing collection of thoughtful, type-safe libraries.

Migration: From React to Svelte/SolidJS

Svelte

  • State: Replace useState and useEffect with local variables and assignments.
  • Props: Export variables in <script>.
  • Events: Use on:event syntax.
  • Lifecycle: Svelte’s onMount, beforeUpdate, and afterUpdate map to React’s lifecycle hooks.

SolidJS

  • State: Swap useState for createSignal.
  • Effects: Use createEffect for side effects.
  • JSX: Minimal migration friction; adjust hooks and reactivity patterns.
  • Component Invocation: Remember, components are not re-invoked on state change.

When to Choose Which

Use Case React Svelte SolidJS
Large team, vast ecosystem ★★★★★ ★★★☆☆ ★★☆☆☆
Rapid prototyping ★★★★☆ ★★★★☆ ★★★★☆
Smallest possible bundle ★★☆☆☆ ★★★★★ ★★★★★
Maximum runtime performance ★★★☆☆ ★★★★☆ ★★★★★
Learning curve for newcomers ★★☆☆☆ ★★★★☆ ★★★☆☆
SSR/Static Site Generation ★★★★☆ ★★★★☆ ★★★★☆

Closing Notes: The Invitation to Discovery

In the spirit of old master builders, remember: the choice of framework is less a matter of dogma, more a matter of fit. Examine the grain of your project’s wood, the span of your team’s ambition, and the weight of your constraints. Svelte and SolidJS invite us to rethink the scaffolding of our web architectures, offering new tools to chisel, carve, and polish our creations with both efficiency and elegance.

May your next foundation be laid with both innovation and care.

Ettore Sabbatini

Ettore Sabbatini

Senior Web Solutions Architect

With over three decades in the digital realm, Ettore Sabbatini has become a master at weaving technology and artistry into cohesive, impactful web experiences. His journey began in the early days of the internet, where curiosity and a love for elegant problem-solving drew him into the evolving world of web development. At SpicaMag - Spicanet Studio, Ettore is renowned for his meticulous approach to custom website architecture and his sharp eye for data-driven content strategies. Colleagues admire his patience, humility, and the quiet enthusiasm he brings to team collaborations. Beyond his technical prowess, Ettore’s mentorship has shaped the next generation of creative minds, always encouraging thoughtful innovation and integrity.

Comments (0)

There are no comments here yet, you can be the first!

Leave a Reply

Your email address will not be published. Required fields are marked *