はじめに:なぜ今、Svelteが注目されるのか
モダンなフロントエンド開発において、React、Vue、Angularは「3大フレームワーク」として君臨してきました。しかし、これらは共通して「実行時(Runtime)」にフレームワークの本体をブラウザで動かす必要があります。これに対し、2019年頃から急速に支持を広げたSvelteは、これまでの常識を覆す「コンパイラ」というアプローチを取りました。
開発者が書いたコードを、ブラウザに送る前に「純粋なJavaScript」へと変換してしまう。この発想の転換が、ウェブサイトのパフォーマンスと開発体験に革命をもたらしました。本記事では、環境構築を終えたばかりの初心者の皆さんに向け、Svelteの真髄をコードと共に徹底解説します。
仮想DOMの終焉と「消えるフレームワーク」
多くのエンジニアが「仮想DOM(Virtual DOM)は高速だ」と教わってきました。しかし、Svelteの生みの親であるRich Harris氏は「仮想DOMは純粋なオーバーヘッドである」と主張します。
仮想DOMの限界
Reactなどは、メモリ上に「仮想のDOMツリー」を持ち、状態が変わるたびに新しいツリーを作成して古いものと比較(Diffing)します。一見効率的ですが、ブラウザ上では常に「比較計算」という仕事が発生しています。
Svelteの「事前コンパイル」
Svelteには仮想DOMがありません。ビルド時に「どの変数が変わったら、どのDOMを書き換えるか」という命令的なJSを生成します。
Svelteコンポーネントの解剖学
Svelteのコンポーネントは .svelte ファイルに記述します。まずは基本形を見てみましょう。
<script>
// ロジック(JavaScript)
let count = 0;
function handleClick() {
count += 1;
}
</script>
<main>
<h1>カウンター</h1>
<p>現在の値: {count}</p>
<button on:click={handleClick}>
カウントアップ
</button>
</main>
<style>
/* 見た目(CSS) - 自動的にカプセル化されます */
main {
text-align: center;
padding: 1em;
}
h1 {
color: #ff3e00;
}
</style>スタイルのカプセル化
上記の h1 へのスタイルは、このコンポーネント内にのみ適用されます。他のファイルの h1 が赤くなることはありません。これにより、BEMなどの複雑な命名規則から解放されます。
リアクティビティ:JavaScriptの限界を超える
Svelteを触って最も感動するのは、状態管理のシンプルさです。
代入による更新
Reactの useState のようなセッター関数は不要です。変数の値を書き換える(代入する)だけで、Svelteはそれを検知します。
// 配列の更新例(スプレッド構文で再代入するのがSvelte流)
let items = ['Apple', 'Banana'];
function addItem() {
items = [...items, 'Orange']; // 再代入によりリアクティビティが発動
}リアクティブ宣言($記号)
「ある変数が変わったときに、連動して別の処理をしたい」場合に使うのが、魔法の記号 $: です。
<script>
let count = 1;
let price = 100;
// count または price が変わるたびに total が自動再計算される
$: total = count * price;
// 条件付きの実行も可能
$: if (total > 1000) {
console.log('買いすぎです!');
}
</script>
<p>合計: {total}円</p>これはJavaScriptの「ラベル付き文」という仕様を応用したSvelte独自の構文です。Excelの数式のように、依存関係を自動で解決してくれます。
コンポーネント間通信とデータの流れ
5-1. Props(プロップス)の受け取り
親から子へデータを渡す際、Svelteでは export let を使います。
<script>
// exportを付けることで「外部からの入力」を受け付ける
export let userName = "ゲスト";
</script>
<p>こんにちは、{userName}さん!</p><script>
import Child from './Child.svelte';
</script>
<Child userName="山田" />5-2. イベントディスパッチ(子から親へ)
子から親へアクションを伝えるには、createEventDispatcher を使います。
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function notify() {
dispatch('message', { text: 'こんにちは!' });
}
</script>
<button on:click={notify}>親へ通知</button>Svelte Store:洗練されたグローバル状態管理
複数のコンポーネントで共有したいデータがある場合、Svelteは標準で「ストア」を提供しています。
import { writable } from 'svelte/store';
export const theme = writable('light');<script>
import { theme } from './stores.js';
</script>
<div class="container {$theme}">
現在のテーマ: {$theme}
<button on:click={() => theme.set('dark')}>ダークモードへ</button>
</div>ストア名の頭に $ を付けるだけで、メモリリークを防ぎつつ簡潔に記述できるこの機能は、Svelteの大きな武器です。
ロジックブロック:{#if} と {#each}
HTMLの中で条件分岐やループを書く際、Svelteは独自のブロック構文を使用します。これにより、JSの map 関数などを使う必要がなくなります。
<script>
let users = [
{ id: 1, name: '田中', active: true },
{ id: 2, name: '佐藤', active: false }
];
</script>
<ul>
{#each users as user (user.id)}
<li>
{user.name}
{#if user.active}
<span class="status">オンライン</span>
{:else}
<span class="status">オフライン</span>
{/if}
</li>
{:else}
<p>ユーザーが見つかりません。</p>
{/each}
</ul>{:else} ブロックを each 内で使える(配列が空の場合の処理)のも、地味ながら非常に便利な点です。
フォームバインディング:bind:value
フォーム入力と変数の同期も、直感的な bind 指示子で行えます。
<script>
let name = '';
let checked = false;
</script>
<input type="text" bind:value={name}>
<input type="checkbox" bind:checked={checked}>
<p>{name}さんは、利用規約に {checked ? '同意しています' : '同意していません'}</p>トランジションとアニメーション:心地よいUIを標準機能で
SvelteはUIフレームワークとして、アニメーション機能をエンジンレベルで持っています。
<script>
import { fade, slide } from 'svelte/transition';
let isVisible = false;
</script>
<label>
<input type="checkbox" bind:checked={isVisible}> 表示切り替え
</label>
{#if isVisible}
<div transition:fade>ふわっと表示されます</div>
<div transition:slide={{ duration: 500 }}>スライドしながら現れます</div>
{/if}外部ライブラリを入れずに、これほど滑らかな動きを実装できるのはSvelteならではです。
まとめと次のステップ
Svelteは、エンジニアに「書く喜び」を取り戻させてくれるツールです。 学習を終えた後の次のステップとして、以下をおすすめします。
- 公式チュートリアルを完走する: Svelte公式サイトのチュートリアルは、ブラウザ上でコードを書きながら学べる最高傑作です。
- SvelteKitを学ぶ: 本格的なWebアプリ(ルーティングやSSRが必要なもの)を作るなら、SvelteKitの出番です。
- 小さなツールを作ってみる: 電卓、Todoアプリ、天気予報アプリなど、簡単なものから作り始めてみてください。
「Reactよりも学習コストが低く、かつパフォーマンスも妥協しない」。そんな贅沢な願いを叶えてくれるSvelteの世界へ、ようこそ。あなたのアイデアが、この軽快なフレームワークを通じて形になるのを楽しみにしています。
今回のコードをさらに発展させたい方へ
「APIからデータを取得して表示する実戦的なコードが見たい」「Material UIのようなコンポーネントライブラリをSvelteで使うには?」といった疑問があれば、いつでも聞いてくださいね。一緒に素晴らしいアプリを作っていきましょう!

コメント