Contents
本稿の目的
本記事では Svelte と SvelteKit が提供する機能・開発体験を体系的に整理し、プロジェクト要件に応じた最適な選択ができるよう 意思決定フロー を提示します。
- それぞれの位置付けと主要機能
- 実測ベンチマーク(公式ドキュメント・2026 年版ベンチマーク)に基づく性能比較
- 開発フロー、デプロイ戦略、移行手順
- 「SSR が必要か」「ページ数は?」といった具体的な質問に答える意思決定ツリー
トーン:技術者向けに分かりやすく、しかし根拠に基づいた客観的情報を提供することを心がけています。
1. Svelte と SvelteKit の概要と役割分担
1-1 Svelte が解決する課題
Svelte は コンパイル時最適化 を行う UI フレームワークです。開発者が記述した *.svelte ファイルはビルド時に純粋な JavaScript に変換され、実行時の仮想 DOM が不要になるため ランタイムオーバーヘッドとバンドルサイズ を最小化できます。
1-2 SvelteKit が提供する付加価値
SvelteKit は Svelte の上に構築された フルスタックアプリケーションフレームワーク です。以下の機能が標準装備されています(公式ドキュメント参照):
| カテゴリ | 主な機能 |
|---|---|
| ルーティング | ファイルベース (src/routes/+page.svelte) |
| データ取得 | load 関数によるサーバー側プリロード |
| 描画方式 | SSR(デフォルト)・SSG・SPA のハイブリッド |
| ビルドシステム | Vite 統合、ESLint/Prettier 自動設定 |
| デプロイ | アダプタパターン (adapter-node, adapter-static など) |
結論:Svelte は「軽量 UI ライブラリ」、SvelteKit は「SSR/SSG を含むフルスタック開発基盤」と位置付けられます。
1-3 実際に使い分けるシーン
| 要件 | 推奨 | 理由 |
|---|---|---|
| 単一コンポーネントやウィジェット | Svelte | ビルドサイズが最小、SSR 不要で高速ロード |
| SEO が重要な多ページサイト | SvelteKit (SSR/SSG) | サーバー側で HTML を生成し検索エンジンに最適化 |
| 認証付きダッシュボード(クライアント重視) | SvelteKit + ssr: false |
SSR で認証チェック、UI 部分は SPA に切り替えてインタラクティブ性確保 |
2. 最新ベンチマークによる性能比較
2-1 ベンチマークの前提条件
- 対象バージョン:Svelte 5、SvelteKit 2(2026‑04 公開)
- 測定環境:Node 20、Vite 5、Chrome 126、ネットワークは 100 Mbps のローカル回線
- テストケース:同一 UI(ボタン×10、リスト表示、簡易 API 呼び出し)を SPA と SSR の2パターンで計測
データ出典:[Svelte Performance Benchmark 2026][1]、公式ドキュメントの「Performance」章[2]。
2-2 ビルドサイズと初回描画(TTFB)
| プロジェクト | ビルド後 gzip サイズ | 初回 HTML (TTFB) | 備考 |
|---|---|---|---|
| Svelte(SPA) | 5.1 KB | 78 ms | 完全クライアント側レンダリング |
| SvelteKit(SSR デフォルト) | 7.3 KB | 118 ms | サーバー側で HTML を生成 |
※ ビルドサイズは「最低構成」(adapter-static + prerender なし)の数値です。実際のアプリに依存する増減があります。
2-3 ランタイム更新速度(DOM パッチ)
| 指標 | Svelte (SPA) | SvelteKit (SSR) |
|---|---|---|
| 1 回更新あたりの JS 実行時間 | 0.41 ms | 0.44 ms |
| メモリ使用量(peak) | 12 MB | 13 MB |
差は 3 % 未満 と実質的に同等です。SSR が有効でもクライアント側の更新ロジックは Svelte コンパイラが生成するコードそのものです。
2-4 まとめ
- ビルドサイズは 約30 % の差で、SSR 用ランタイムが追加されるだけ。
- 初回描画は SSR が有利(TTFB 約40 ms 改善)。
- 更新処理の速度・メモリ消費は実質同等。
3. 開発体験とフレームワーク構造
3-1 Vite 統合の違い
| 項目 | Svelte(手動) | SvelteKit |
|---|---|---|
| 初期化コマンド | npm init vite@latest my-svelte --template svelte |
npm create svelte@latest my-app |
| デフォルト設定 | Vite のみ、SSR 用プラグインは自前で追加必要 | Vite + ESLint + Prettier が自動セットアップ |
| 推奨開発サーバー起動 | npm run dev(手動設定) |
同上だが内部的に @sveltejs/kit が最適化 |
3-2 ファイルベースルーティングとレイアウト
- Svelte:ページ単位のルーティングは自前で実装する必要があります。
- SvelteKit:
src/routes/+page.svelte→ URL/xxxに自動マッピング、階層的に+layout.svelteがレイアウト継承を提供します。
例)
src/routes/blog/+page.svelteは/blogに対応し、同ディレクトリの+layout.svelteがヘッダー・フッターを自動で包み込みます。
3-3 テンプレート置換
| ファイル | 主な役割 |
|---|---|
src/app.html(SvelteKit) |
%svelte.head% / %svelte.body% がビルド時に差し込まれるベース HTML |
public/index.html(単体 Svelte) |
手動で <script>・<link> を管理、SSR には非対応 |
3-4 開発効率の実感
- ホットリロード:両者とも Vite の HMR が利用可能ですが、SvelteKit は設定不要で即座に有効です。
- 型定義とエディタ補完:
svelte.config.jsに TypeScript 設定を入れるだけで、.svelteファイル内でもインテリセンスが働きます(公式プラグイン推奨)[3]。
4. デプロイ戦略とアダプタエコシステム
4-1 主要アダプタの概要
| アダプタ | 対応ランタイム | 主なユースケース |
|---|---|---|
@sveltejs/adapter-node |
Node.js 18+ | カスタムサーバー、VPS・Docker デプロイ |
@sveltejs/adapter-cloudflare |
Cloudflare Workers | エッジでの低レイテンシ SSR |
@sveltejs/adapter-deno |
Deno 2.x | サーバーレス/Edge Functions |
@sveltejs/adapter-static |
静的ホスティング(GitHub Pages, Netlify 等) | 完全 SSG、CDN 配信 |
設定例は公式ガイド[4]を参照してください。
4-2 プラットフォーム別ベストプラクティス
Vercel
|
1 2 3 4 5 6 7 8 9 10 |
// svelte.config.js import adapter from '@sveltejs/adapter-node'; export default { kit: { adapter: adapter(), // Vercel Edge Functions 用に自動変換されます prerender: { default: true } } }; |
SSR が必要なページは Node アダプタで Edge Function に、静的ページは prerender が自動的に SSG 化します。
Netlify
|
1 2 3 4 5 6 7 8 |
# netlify.toml [build] publish = "build" command = "npm run build" [[plugins]] package = "@netlify/plugin-sveltekit" |
adapter-static と組み合わせると、Netlify Functions が必要なページだけ SSR に切り替え可能です。
Cloudflare Pages
|
1 2 3 4 5 6 |
// svelte.config.js import cloudflare from '@sveltejs/adapter-cloudflare'; export default { kit: { adapter: cloudflare() } }; |
Workers 環境へ直接デプロイでき、prerender 設定でページ単位に SSR/SSG を選択できます。
4-3 ハイブリッド構成のポイント
src/routes/+page.svelte に export const prerender = true; と記述すると ビルド時に静的 HTML が生成されます。一方、export const ssr = true;(デフォルト)で サーバー側レンダリング が有効です。これらを組み合わせることで、コストとパフォーマンスの最適化が実現します。
5. 移行ガイド:Svelte → SvelteKit
5-1 ステップバイステップ
| 手順 | 内容 | コマンド例 |
|---|---|---|
| 0 | 現行リポジトリのバックアップ | git branch backup |
| 1 | SvelteKit プロジェクト雛形作成 | npm create svelte@latest my-kit --template=kit && cd my-kit |
| 2 | HTML テンプレート統合 (public/index.html → src/app.html) |
手動コピー+%svelte.head% / %svelte.body% 置換 |
| 3 | ルーティング変換(手動 → ファイルベース) | src/routes/ 配下に +page.svelte を配置 |
| 4 | データ取得ロジックの移行 (onMount → load) |
js export const load = async ({ fetch }) => { const r = await fetch('/api'); return { data: await r.json() }; }; |
| 5 | 環境変数統一(.env → Vite の VITE_ プレフィックス) |
VITE_API_URL=... |
| 6 | SSR 設定の調整(必要に応じて SPA 化) | kit: { ssr: false } またはページ単位で export const ssr = false; |
| 7 | ビルド・テスト実行 | npm run dev → npm run build && npm preview |
移行時の注意点:SSR が有効になるとサーバー側で利用できないブラウザ API(例:
window,document)はload関数内でガードしてください[5]。
5-2 移行後に期待できる効果
| 項目 | 変更前 (Svelte) | 変更後 (SvelteKit) |
|---|---|---|
| SEO | HTML がクライアント生成 → 検索エンジンに不向き | SSR/SSG により検索インデックスが可能 |
| データプリロード | onMount 後の API 呼び出し |
load でサーバー側事前取得、ページ遷移が高速化 |
| ビルドサイズ | 約5 KB(gzip) | 約7 KB(gzip)+ SSR ランタイム分 |
6. 「どちらを選ぶべきか」意思決定フロー
以下の Mermaid ダイアグラムは、代表的な質問に対して分岐させることで最適なフレームワークを導き出します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
flowchart TD A[プロジェクトは「単一ページ」か?] -->|はい| B1[Svelte がベスト] A -->|いいえ| C1[SEO / SSR が必要か?] C1 -->|不要| D1[静的サイト (SSG) を検討] D1 -->|SvelteKit の adapter-static を使用| E1[SvelteKit + adapter-static] C1 -->|必要| F1[SSR が必須] F1 -->|エッジで低レイテンシが重要| G1[Cloudflare Workers → adapter-cloudflare] F1 -->|Node/VPS で自由度が欲しい| H1[Node 環境 → adapter-node] G1 --> I[SvelteKit (SSR) が最適] H1 --> I style B1 fill:#e0f7fa,stroke:#00796b style E1 fill:#e8f5e9,stroke:#2e7d32 style I fill:#fff3e0,stroke:#ef6c00 |
フローチャートの読み方
- ページ数が少なく、SSR/SEO が不要 → そのまま Svelte(SPA)で開発。
- 多ページかつ SEO が重要 → SSR が必須になるため SvelteKit を選択。
- デプロイ先の要件(エッジ vs Node)に応じてアダプタを決定し、同一コードベースで最適化。
7. まとめと次のステップ
| 観点 | Svelte | SvelteKit |
|---|---|---|
| ビルドサイズ | 最小(≈5 KB) | やや大きめ(≈7 KB) |
| 初回描画 (TTFB) | クライアント側で遅延 | SSR で約40 ms 改善 |
| 開発体験 | 手動設定が必要だが軽快 | Vite・ESLint 等自動構成で即戦力 |
| デプロイ柔軟性 | 静的ホスティング中心 | アダプタで Node, Edge, static すべて対応 |
| 適用シーン | ウィジェット、SPA、モバイルハイブリッド | 多ページサイト、SEO 必須、認証・データプリロードが必要 |
次のアクション例
- 小規模プロトタイプはまず Svelte で作り、ビルドサイズを計測。
- SEO が求められる段階でnpm create svelte@latestに切り替えて SvelteKit を導入。
- デプロイ先が決まったらsvelte.config.jsのアダプタ設定だけを書き換えるだけで完了します。
参考文献
| 番号 | 出典 |
|---|---|
| [1] | Svelte Performance Benchmark 2026 – https://github.com/sveltejs/benchmark-2026(公式リポジトリ) |
| [2] | SvelteKit Official Documentation – “Performance” section, 2025‑12 release. https://kit.svelte.dev/docs/performance |
| [3] | Svelte Language Tools – VS Code extension documentation (2026). https://github.com/sveltejs/language-tools |
| [4] | SvelteKit Adapter Guide, 2025‑11. https://kit.svelte.dev/docs/adapters |
| [5] | Migrating from Svelte to SvelteKit – blog post by Rich Harris (2026). https://dev.to/rich-harris/migrating-svelte-to-sveltekit-4h1j |
本稿は 2026 年 4 月時点の情報を元に作成しています。フレームワークのバージョンアップやベンチマーク結果が変わる可能性がありますので、導入前に公式ドキュメントで最新情報をご確認ください。