Svelte / SvelteKit 徹底解説
概要と歴史
Svelteとは
Svelteは、Rich Harris(現Vercel所属)が2016年に公開したUIフレームワークである。React、Vue、Angularが「ランタイム」でUIを更新するのに対し、Svelteは「コンパイル時」にUIの更新コードを生成する。このアプローチにより、仮想DOMのオーバーヘッドをゼロにし、極めて軽量で高速なアプリケーションを実現する。
Rich Harrisは、New York Timesのインタラクティブグラフィックスチームで働いていた際、パフォーマンスに厳しい要件を持つデータビジュアライゼーションを開発する中でSvelteを着想した。
主要なマイルストーン
| 年 | 出来事 |
|---|---|
| 2016年 | Svelte v1リリース |
| 2018年 | Svelte v2リリース |
| 2019年 | Svelte v3リリース(大幅な設計変更、リアクティビティの簡素化) |
| 2020年 | SvelteKit発表(Sapperの後継) |
| 2021年 | Rich HarrisがVercelに入社、SvelteKit開発が加速 |
| 2022年 | SvelteKit v1.0正式リリース |
| 2023年 | Svelte v4リリース(パッケージサイズ縮小) |
| 2024年 | Svelte v5リリース(Runes導入、リアクティビティ刷新) |
SvelteKitとは
SvelteKitは、Svelteのための公式フルスタックフレームワークである。Next.jsやNuxtと同様の位置づけで、SSR、SSG、ファイルベースルーティング、APIエンドポイントなどを提供する。Viteをビルドツールとして採用し、高速な開発体験を実現している。
強みと弱み
| 観点 | 強み | 弱み |
|---|---|---|
| コンパイラ方式 | 仮想DOMなし、極めて軽量 | コンパイラの挙動を理解する必要がある |
| バンドルサイズ | 最小クラスの出力サイズ | 大規模アプリではReactとの差が縮小 |
| パフォーマンス | DOM操作が最小限で高速 | ベンチマーク上の優位性は縮小傾向 |
| 学習曲線 | HTML/CSS/JSの延長で学べる | Svelte独自の構文がある |
| 記述量 | ボイラープレートが少ない | 独自構文のためエディタ対応が必要 |
| DX | コンパイルエラーが親切 | Svelte 5でRunes導入により学び直しが必要 |
| エコシステム | 必要十分なライブラリ | React/Vueと比較すると圧倒的に小さい |
| 求人市場 | 先進的な企業で需要あり | 求人数はReact/Vueに大きく劣る |
| TypeScript | 対応済み | .svelteファイル内のTS対応に制約あり |
| コミュニティ | 熱心で質が高い | 規模が小さい |
コアコンセプト解説
コンパイラ方式とは
従来のフレームワーク(React、Vue)は、ブラウザ上で動作する「ランタイム」を含んでいる。仮想DOMを使って差分を計算し、DOMを更新する。このランタイム自体がバンドルサイズに含まれる。
Svelteは、ビルド時にコンポーネントを純粋なJavaScriptに変換する。この生成コードは、状態が変更されたときにどのDOMノードを更新すべきかを直接知っている。
React/Vueのアプローチ:
コンポーネント → ランタイム(仮想DOM + diff算法) → DOM更新
ブラウザに送られるもの: アプリコード + ランタイム(約40-60KB)
Svelteのアプローチ:
コンポーネント → コンパイラ → 最適化されたDOM操作コード
ブラウザに送られるもの: 最適化されたアプリコードのみ
Runes(Svelte 5以降)
Svelte 5で導入されたRunesは、新しいリアクティビティシステムである。Svelte 3/4の暗黙的なリアクティビティ($:ラベル構文)に代わり、明示的な関数ベースのリアクティビティを導入した。
| Rune | 用途 | 他FWとの対応 |
|---|---|---|
$state | リアクティブな状態の宣言 | React: useState、Vue: ref |
$derived | 派生状態(自動計算) | React: useMemo、Vue: computed |
$effect | 副作用の実行 | React: useEffect、Vue: watchEffect |
$props | コンポーネントプロパティの受け取り | React: props、Vue: defineProps |
$bindable | 双方向バインディング可能なプロパティ | Vue: v-model |
ファイル構造
Svelteのコンポーネントは.svelteファイルとして定義される。VueのSFCに似た構造だが、よりシンプルである。
<script lang="ts">
// ロジック(Svelte 5ではRunesを使用)
let count = $state(0);
let doubled = $derived(count * 2);
</script>
<!-- テンプレート(特別なラッパー不要) -->
<button onclick={() => count++}>
{count} x 2 = {doubled}
</button>
<style>
/* スコープ付きCSS(デフォルト) */
button { font-size: 1.5rem; }
</style>
SvelteKitのルーティング
SvelteKitはファイルベースルーティングを採用している。
src/routes/
+page.svelte # / (トップページ)
+layout.svelte # 共通レイアウト
about/
+page.svelte # /about
blog/
+page.svelte # /blog(一覧)
[slug]/
+page.svelte # /blog/:slug(動的ルート)
+page.server.ts # サーバーサイドのデータ取得
api/
hello/
+server.ts # API エンドポイント /api/hello
適しているユースケース
Svelteが適しているケース
- パフォーマンスが最重要なアプリ: データビジュアライゼーション、アニメーション重視のサイト
- 軽量なWebアプリ: バンドルサイズを最小化したい場合
- 組み込みウィジェット: 既存サイトに埋め込む小さなインタラクティブ要素
- プロトタイピング: 記述量が少なく、素早く形にできる
- 個人プロジェクト・スタートアップ: 少ない人数で高品質なアプリを作りたい場合
- コンテンツサイト: SvelteKitのSSG機能で高速な静的サイトを生成
適していないケース
- 大規模エンタープライズ: エコシステムの小ささがリスクになる
- 大量の人材確保が必要なプロジェクト: Svelte経験者は少ない
- React Native的なモバイル開発が必要: Svelteにはモバイル対応が弱い
- 複雑な状態管理: Redux DevToolsのような成熟したデバッグツールが不足
- 既存のReact/Vueプロジェクトへの統合: 別フレームワークとの混在は困難
採用企業の実例
| 企業 | 用途 | 備考 |
|---|---|---|
| New York Times | インタラクティブ記事 | Rich Harrisの元勤務先 |
| Apple | 一部のWebコンテンツ | Apple Music Webなど |
| Spotify | 一部の内部ツール | パフォーマンス重視 |
| Square(Block) | 決済関連のUI | 軽量性を活用 |
| Ikea | WebアプリのUI | ECサイトの一部 |
| The Guardian | インタラクティブコンテンツ | ニュースのビジュアライゼーション |
| Vercel | 内部プロジェクト | Rich Harrisの現勤務先 |
| 1Password | ブラウザ拡張 | 軽量なUIが必要 |
パフォーマンス特性
バンドルサイズ比較
| フレームワーク | Hello Worldのgzip圧縮後サイズ(概算) |
|---|---|
| Svelte | 約2KB |
| Vue 3 | 約16KB |
| React + ReactDOM | 約42KB |
| Angular | 約65KB |
Svelteの圧倒的な軽量さは、コンパイラ方式によるものである。ただし、アプリケーションの規模が大きくなるにつれて、コンポーネントごとに生成されるコードが増えるため、差は縮小する。
ランタイムパフォーマンス
js-framework-benchmarkの結果によると、Svelteは以下の操作で優れたパフォーマンスを示す。
| 操作 | Svelteの特徴 |
|---|---|
| 初期レンダリング | 仮想DOMのオーバーヘッドがないため高速 |
| 行の追加・削除 | 直接DOM操作で最小限の更新 |
| 部分更新 | 変更箇所のみをコンパイル時に特定して更新 |
| メモリ使用量 | ランタイムが小さく、メモリ効率が良い |
アニメーション
Svelteにはアニメーション機能が組み込まれている。
- transition: 要素の出現・消失時のアニメーション(fade、slide、scale等)
- animate: リスト要素の移動アニメーション
- motion: tweenとspringによるスムーズな値の遷移
エコシステム
公式・準公式ライブラリ
| ライブラリ | 用途 |
|---|---|
| SvelteKit | フルスタックフレームワーク |
| svelte/motion | アニメーション |
| svelte/transition | トランジション |
| svelte/store | 状態管理(Svelte 4まで) |
コミュニティライブラリ
| ライブラリ | 用途 |
|---|---|
| Skeleton UI | UIコンポーネントライブラリ |
| Flowbite Svelte | Tailwind CSSベースのコンポーネント |
| svelte-french-toast | トースト通知 |
| sveltekit-superforms | フォーム管理 |
| Paraglide JS | 国際化(i18n) |
他フレームワークとの比較
| 観点 | Svelte | React | Vue |
|---|---|---|---|
| 仕組み | コンパイラ | ランタイム(仮想DOM) | ランタイム(仮想DOM) |
| バンドルサイズ | 最小 | 中 | 小 |
| 学習曲線 | 緩やか | 中 | 緩やか |
| 記述量 | 最小 | 中 | 小 |
| エコシステム | 小 | 最大 | 大 |
| 求人数 | 少 | 最多 | 多 |
| TypeScript | 対応 | 対応 | 対応 |
| アニメーション | 組み込み | 外部ライブラリ | 組み込み |
| SSR/SSG | SvelteKit | Next.js | Nuxt |
Svelte 5のRunes: 変更点まとめ
Svelte 5は大きなパラダイムシフトであり、Svelte 3/4からの移行を検討する際に理解が必要である。
| Svelte 3/4 | Svelte 5 (Runes) | 変更理由 |
|---|---|---|
let count = 0;(暗黙的リアクティブ) | let count = $state(0); | 明示的で予測可能 |
$: doubled = count * 2; | let doubled = $derived(count * 2); | 構文の統一 |
$: { console.log(count); } | $effect(() => { console.log(count); }); | ライフサイクルとの統一 |
export let name; | let { name } = $props(); | 分割代入との統一 |
createEventDispatcher() | コールバックprop | Reactと同様のパターン |
学習ロードマップ
Svelte初学者向け
- HTML/CSS/JavaScriptの基礎
- Svelteの基本: コンポーネント、テンプレート構文、イベント処理
- リアクティビティ: $state、$derived、$effect(Runes)
- コンポーネント間通信: $props、コールバック、Context API
- アニメーション: transition、animate、motion
- SvelteKit: ルーティング、レイアウト、データ取得
- サーバーサイド: load関数、フォームアクション、APIエンドポイント
- デプロイ: アダプターによる各プラットフォームへのデプロイ
学習リソース
- Svelte公式チュートリアルはインタラクティブで、最も効果的な学習手段である
- Svelte REPLでブラウザ上で即座に試せる
まとめ
Svelteは「コンパイラ方式」という独自のアプローチで、フロントエンド開発に新しい風を吹き込んだ。仮想DOMなし、最小のバンドルサイズ、少ないボイラープレートという特徴は、特にパフォーマンスが重要なプロジェクトや、シンプルさを重視する開発者に支持されている。
Svelte 5のRunes導入により、リアクティビティの仕組みがより明示的になり、大規模プロジェクトでも扱いやすくなった。また、Rich HarrisがVercelに加わったことで、SvelteKitの開発が加速し、エコシステムの成熟度も向上している。
ただし、エコシステムの規模と求人市場の観点では、ReactやVueに大きく差をつけられている。メインの技術選択としてSvelteを選ぶ場合は、この点を十分に考慮する必要がある。