Svelte完全ガイド:コンパイラが変えるフロントエンド開発の未来

この記事は約8分で読めます。

はじめに:なぜ今、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は、エンジニアに「書く喜び」を取り戻させてくれるツールです。 学習を終えた後の次のステップとして、以下をおすすめします。

  1. 公式チュートリアルを完走する: Svelte公式サイトのチュートリアルは、ブラウザ上でコードを書きながら学べる最高傑作です。
  2. SvelteKitを学ぶ: 本格的なWebアプリ(ルーティングやSSRが必要なもの)を作るなら、SvelteKitの出番です。
  3. 小さなツールを作ってみる: 電卓、Todoアプリ、天気予報アプリなど、簡単なものから作り始めてみてください。

「Reactよりも学習コストが低く、かつパフォーマンスも妥協しない」。そんな贅沢な願いを叶えてくれるSvelteの世界へ、ようこそ。あなたのアイデアが、この軽快なフレームワークを通じて形になるのを楽しみにしています。


今回のコードをさらに発展させたい方へ

「APIからデータを取得して表示する実戦的なコードが見たい」「Material UIのようなコンポーネントライブラリをSvelteで使うには?」といった疑問があれば、いつでも聞いてくださいね。一緒に素晴らしいアプリを作っていきましょう!

コメント

タイトルとURLをコピーしました