フレームワーク プログラミング ソフトウェア 公開日 2026.05.15 更新日 2026.05.20

Svelte / SvelteKit とは何か?コンパイル型 UI フレームワークの特徴と React との使い分け

Svelte は 「仮想 DOM ではなくコンパイル時に最適化された JS を出力する UI フレームワーク」 で、Svelte 5 では新しい 「Runes API」 によりリアクティビティが大きく刷新されました。SvelteKit はそれを土台にしたフルスタックフレームワークで、SSR / SSG / Edge をサポート。React との違い、書き味、採用判断軸を整理します。

先に要点

  • Svelte は 「仮想 DOM を持たず、コンパイル時に効率的な JS に変換する UI フレームワーク」。React / Vue とは設計の根っこから違うアプローチで、「バンドルが小さい」 「書く量が少ない」 のが特徴。
  • Svelte 5 から導入された Runes(「$state」 「$derived」 「$effect」) でリアクティビティが刷新。「変数を更新すれば UI が追従する」 という体験を、新しい構文で明示的に書けるようになった。
  • SvelteKit は Svelte を土台にした フルスタック / メタフレームワークNext.js のような立ち位置で、SSR / SSG / Edge / Server Functions まで一通り揃う。Cloudflare WorkersVercel Edge にもデプロイできる。
  • 本命の使い所は バンドルサイズを軽くしたい / 個人〜中小規模で書く量を減らしたい / Web 標準に近い書き心地が好き な案件。「巨大エコシステムが必要」 なら React、「軽量で書きやすい」 なら Svelte、と棲み分ける。

Svelte ってよく聞くけど、React との違いは? 「SvelteKit は Next.js の代わりになる?」 「Svelte 5 で Runes が入って何が変わった?」 ── 2016年に登場した Svelte は、「コンパイル型 UI フレームワーク」 という独自の立ち位置を貫きながら、2024年の Svelte 5 で大きな進化を遂げました。

ざっくり言うと、Svelte は 「 ブラウザに仮想 DOM ライブラリを送らず、ビルド時に必要最小限の更新コードを生成する」 設計の UI フレームワーク です。 React / Vue が 「ランタイムでの差分計算」 を中心に据えているのに対し、Svelte は コンパイル時にロジックを最適化する という発想で、書く量とバンドルサイズの両方を抑えます。

この記事では、2026年5月時点の Svelte 5 / SvelteKit の状況をベースに、何ができるか・React との違い・Runes の使い方・SvelteKit のフルスタック機能・採用判断軸 を整理します。 仕様は活発に変化しているので、最終確認は 公式ドキュメント を見るのが安全です。

Svelte の根本的な発想 — コンパイル型

「Svelte が React / Vue と何が違うか」 は、「いつ仕事をするか」 を見ると一発で理解できます。

React / Vue

ランタイムで 仮想 DOM の差分を計算 → 実 DOM に反映 する。「コンポーネントツリーを毎回比較する」 仕組みのコストを払うが、「どんなコードでも対応できる柔軟さ」 を得ている。

Svelte

コンパイル時に 「 この変数が変わったらこの DOM ノードを更新する」 コードを生成。ランタイムは 「生成されたコードを動かすだけ」。仮想 DOM のオーバーヘッドが消える。

体感の差

「 バンドルが小さい」 「初回表示が速い」 のが Svelte の特徴。「React のランタイム+ライブラリ」 の重さを払わなくていい。

トレードオフ

「 コンパイル時に決められない構造」 は得意ではない。「動的にコンポーネント構造を組み立てる」 ような場面は React 寄りの解法が必要なこともある。

「仮想 DOM が悪い」 のではなく、「コンパイル時に最適化できる範囲があるなら、そっちに寄せたほうがいい」 というのが Svelte の哲学です。

Svelte 5 の Runes API

Svelte 5 で最大の変化が、新しいリアクティビティ API Runes です。

<script>
  let count = $state(0);
  let doubled = $derived(count * 2);

  $effect(() => {
    console.log('count が変わった:', count);
  });
</script>

<button onclick={() => count++}>
  カウント: {count}
</button>

<p>2倍: {doubled}</p>

「$state」

値を持つリアクティブな変数。React の 「useState」 に似ているが、「変数として直接書ける」 ので 「count++」 のような自然な書き方ができる。

「$derived」

` 他の 「$state」 から派生する計算値」。「count * 2」 のような派生を 自動で再計算される変数 として書ける。React の 「useMemo」 に相当するが、依存配列を書かなくていい。

「$effect」

「 リアクティブな副作用」。「count が変わったら何かする」 を、依存配列なしで書ける。React の 「useEffect」 相当だが、追跡は自動。

「$props」

コンポーネントの props を 分割代入のように受け取れる。「let { name, age = 0 } = $props()」 のような自然な書き方。

「変数のように書けるリアクティブ」 が Svelte 5 の体感の中心で、「React の hooks の作法を全部覚えなくていい」 という軽さが評価ポイントです。

React との比較

「React と Svelte、どう違う?」 を実コードで並べると、差がはっきりします。

React Svelte 5
UI 記述 JSX(JS 内に HTML) 「.svelte」(HTML + script + style)
状態管理 「useState」 / hooks 「$state」 / Runes
更新検知 仮想 DOM 差分計算 コンパイル時に追跡
バンドルサイズ 大きめ(React + react-dom) 小さい(必要分だけ)
書く量 多め 少なめ
エコシステム 圧倒的 急成長中
学習コスト hooks + 設計思想で長い 短い(HTML / CSS に近い)
採用案件 大規模 / フロントチーム多人数 個人 / 中小 / 軽量サイト

要点は、React は重いが選択肢豊富、Svelte は軽いが選択肢が React より少ない という構造です。 「軽さと書きやすさ」 を取るか、「エコシステムの厚み」 を取るかの判断になります。

SvelteKit — メタフレームワーク

Svelte 単体は UI ライブラリですが、「実用的なアプリを作る」 ためには SvelteKit がセットになります。

立ち位置

Next.js / Nuxt / Remix の Svelte 版。「SSR / SSG / Edge / Server Functions / ルーティング / データ取得」 を一通り揃えるフルスタックフレームワーク

ファイルベースルーティング

「src/routes/users/[id]/+page.svelte」 のように、「ファイル構造 = URL 構造」 という設計。「+page.server.ts」 でサーバ側のデータ取得 が書ける。

マルチデプロイターゲット

「adapter」 を切り替えるだけで Node / Vercel / Cloudflare Workers / Netlify / 静的サイト」 に出力できる。「どこで動かすか」 を後から選べる柔軟性。

Form Actions

「 HTML form の標準動作」 をベースにした、サーバアクション。「JS が無効でも動くフォーム」 が自然に書けて、「プログレッシブエンハンスメント」 が標準。

「Svelte で書いたコンポーネントを、SvelteKit で実用アプリにする」 のが標準的な流れです。 「Svelte 単体だけで Web サイト全部を作る」 ことはあまりなく、ほぼ常に SvelteKit とセットで使われます。

データ取得の基本

SvelteKit でデータを取って表示する典型コードです。

// src/routes/users/[id]/+page.server.ts
export async function load({ params, fetch }) {
  const res = await fetch(`/api/users/${params.id}`);
  const user = await res.json();
  return { user };
}
<!-- src/routes/users/[id]/+page.svelte -->
<script>
  let { data } = $props();
</script>

<h1>{data.user.name}</h1>
<p>{data.user.bio}</p>

「+page.server.ts」

サーバ側でだけ動く load 関数。「DB / 内部 API / 秘密情報」 を直接読める。React Server Components と同じ思想。

「+page.ts」

サーバとクライアントの両方で動く load 関数。「公開 API を呼ぶ」 ような共通の取得処理に使う。

「data」 経由で受け取り

「+page.svelte」 では 「$props()」 から 「data」 を取り出すだけ。「どう取られたか」 を意識せず、「データを表示する」 ことに集中できる。

エラー / ローディング

「+error.svelte」 や 「+layout.svelte」 のような特別ファイルで、エラー画面・共通レイアウトを宣言的に書ける。

「ファイル名で役割を表現する」 という割り切りが、SvelteKit の体感を分かりやすくしている部分です。

いつ Svelte / SvelteKit を選ぶか

採用判断の目安を整理します。

向いている

① 軽量サイト・LP・ブログ、② 個人〜中小規模 SaaS、③ パフォーマンス最優先のメディア / 業務 UI、④ 「React の hooks 文化が合わない」 と感じるチーム。

向いていない

① 既存 React チームでの再採用、② 大規模 SPA / 数十人のフロント分業、③ 「React 専用ライブラリ」 への強い依存があるプロジェクト、④ React Native でモバイル UI 共有予定。

迷うケース

「 軽さは欲しいが、エコシステムも気になる」 中規模案件。「v0 / shadcn の React 系 AI 連携」 を使いたいかが判断軸になる。

学習時間

React 経験者なら 1〜2日で書き始められる。「HTML / CSS が好きだが React は冗長と感じる」 人ほど馴染みやすい。

「一気に React を捨てる」 のではなく、「新規プロジェクト / 小さなアプリで Svelte を試す」 段階導入が現実的なアプローチです。

どこで詰まりやすいか

便利な反面、現場で踏みやすい注意点も整理します。

①エコシステムの厚み

React の 「何でもライブラリがある」 状態と比べると、「特定ニッチで使えるものが少ない」 場面がある。自前で書くか、React 用のものを Svelte に持ち込む工夫が必要

② Svelte 4 → 5 の移行

Runes が入って書き方が変わった。「既存の Svelte 4 コードを Svelte 5 に上げる」 ときに、「reactive ステートメント($:)」 から 「$state / $derived」 に書き換える作業が出る。

③ チームの慣れ

「 大半が React を書ける」 チームでは、「Svelte だけ別言語」 的な扱いになることも。「チーム全体でどっちに寄せるか」 を意識的に決めるのが大事。

④ React 専用ライブラリ

「 Tanstack Query」 のような汎用ライブラリは Svelte 版があるが、「React Hook Form」 のような React 特化のものは直接使えない。同等機能を Svelte で書き直す覚悟が必要。

「小さなプロジェクトで試す」 ところから始め、「チームで合うか」 を見極めるのが安全な道筋です。

AI 時代の Svelte 観

AI 連携の文脈で Svelte が活きる場面もあります。

小さなバンドル × AI UI

AI チャット UI / AI ダッシュボードを 「軽量に提供」 したいときに、「Svelte 起動 + Hono on Workers」 構成は強力。コスト最適化にも効く。

プロンプトと書く量

「Svelte の方が書く量が少ない」 ことは、「AI に書かせる時に出力トークンが少なくなる」 ことに直結。AI 駆動開発で 「生成コストが下がる」。

React 系 AI ツールの恩恵は薄め

[v0](/articles/what-is-v0-vercel-ai-ui-generator-usage) や shadcn/ui の 「React 出力前提」 の AI ツールはそのままは使えない。「AI が出した UI コードを Svelte に書き換える」 必要がある。

SvelteKit + Workers AI

SvelteKit を Cloudflare adapter でデプロイし、Workers AI と組み合わせる構成。「Cloudflare 完結で軽量 AI アプリ」 を立ち上げるシナリオで強力。

「AI × 軽量 UI × 低コスト」 の構成で、Svelte は React に対する別の合理性を提示します。

Svelte / SvelteKit に関するよくある質問

Q. Svelte は本番運用に耐えますか?

A. 十分耐えます。The New York Times、Apple Music の一部、IBM の社内ツール、Brave Browser など多くの本番事例があります。「React 採用時の安心感」 とは別種の安心感(「小さく速い」)が得られます。

Q. Svelte 5 の Runes は Svelte 4 とどう違いますか?

A. リアクティビティの仕組みが明示的になったのが最大の変化です。Svelte 4 では 「let」 だけで自動的にリアクティブでしたが、Svelte 5 では 「$state(...)」 と明示的に書きます。「 暗黙のリアクティブ」 が 「明示のリアクティブ」 に変わったことで、大規模プロジェクトでの予測可能性が上がりました

Q. Svelte と Vue、どちらを学ぶべきですか?

A. 用途で分けます。Vue は中国・アジア圏で強く、エコシステムも厚いSvelte は新興だが書き心地が独特で軽量。「新興フレームワークを試したい」 なら Svelte、「安定した中庸を取りたい」 なら Vue が無難です。

Q. SvelteKit と Next.js、どちらが速いですか?

A. 純粋なバンドルサイズと初回表示は SvelteKit が速い傾向 です。「大規模アプリの実用速度」 は両方とも十分速く、「どちらかが圧倒的に遅い」 ということはありません。「書きやすさ」 と 「エコシステム」 のトレードオフの方が判断材料として大きいです。

Q. shadcn/ui の Svelte 版はありますか?

A. shadcn-svelte という非公式ですがコミュニティで広く使われているプロジェクトがあります。shadcn/ui と同等の 「コピペ前提コンポーネント」 体験を Svelte 5 + Tailwind で得られます。

Q. SvelteKit は Cloudflare Workers にデプロイできますか?

A. はい。@sveltejs/adapter-cloudflare を使えば、Cloudflare Workers / Pages で SvelteKit がそのまま動きます。Cloudflare スタック と組み合わせて 「Workers + SvelteKit + D1 + R2」 のフルスタックを組めます。

Q. React からの移行コストは?

A. 概念理解は1日、書き換えは規模次第です。状態管理(「useState → $state」)、副作用(「useEffect → $effect」)、コンポーネントの書き方(「JSX → .svelte」)が主な学習対象です。React 経験者は2日もあれば SvelteKit で動くアプリを書けるのが体感です。

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。