Svelte

Svelte 5 Runesガイド: $state/$derived/$effectの使い方

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

Svelte 5 Runesとは何か?

Svelte 5で導入されたRunesシステムは、リアクティブな状態管理をよりシンプルかつパワフルに実現する仕組みです。従来の$reactiveやストアAPIと比べて、コード量が減り、読みやすさが向上している点が特徴です。特にJavaScript開発者にとって、ReactやVueから移行しやすい設計となっています。

Svelte 5は2024年1月に正式リリースされ、v5.0.0が現在の安定版として提供されています。Runesシステムはこのバージョンで導入された新機能であり、開発者は従来のリアクティブ構文と併用しながら段階的な移行が可能です。


Runesシステムの概要

Svelte 5では、$state, $derived, $effectといった3つの基本的なリアクティブ構文を通じて、状態管理と副作用処理を実現します。これらはJavaScriptの関数や変数と同じように扱えるため、コードが見やすくなり、ミスも減るという利点があります。

Rune 説明
$state システム内で変更可能な状態を管理する
$derived 他の状態から自動的に計算される値を定義する
$effect 状態の変化に応じて実行される副作用(例:API呼び出しなど)

従来のリアクティブステートメントとの違い

従来のSvelteでは、リアクティブな処理を記述するために$:で囲うなどの方法が用いられていました。これに対し、Runesは明示的に宣言する必要がなく、より自然な構文で書ける点が大きな違いです。

従来の構文とRunesの比較

比較項目 従来のリアクティブステートメント Runesシステム
読みやすさ 関数や変数との区別が難しい 一般的なJavaScript構文に近い
実装コスト $:で囲むなどの記法が必要 簡潔な宣言のみで実現可能
マイグレーション Svelte 4以前との互換性がある Svelte 5から導入されており、移行が必須

$state/$derived/$effectの動作原理

Svelte 5のRunesシステムでは、$state, $derived, $effectという3つの基本的な要素が状態管理を支えています。それぞれの役割を理解することで、実装時のミスや冗長なコードを回避できます。

各Runeの役割と使い分け

  • $state: コンポーネント内で変更可能なデータ(例:カウンター)を定義します。
  • 変数のように扱え、$state()で初期化されます。
  • リアクティブな更新が自動的に行われます。
  • $derived: 他の$stateから自動的に計算される値(例:合計金額)を生成します。
  • 計算式に従って常に最新の値を保持します。
  • 値自体は変更不可ですが、依存する状態に応じて再計算されます。
  • $effect: 状態の変化に応じて副作用(例:ログ出力、API呼び出し)を実行します。
  • リアクティブな依存関係を自動的に追跡し、更新時に実行されます。

この使い分けにより、コードの構造が明確になり、保守性が向上します。


実装例で見る挙動

以下は簡単なカウンターコンポーネントの例です。$stateでカウント値を管理し、$effectで変更時にログを出力しています。

このコードでは、$effectcount変更時に自動的に実行されます。依存配列の指定が不要で、従来のReact Hooksと比べてシンプルです。


TypeScriptとの連携方法

Svelte 5ではTypeScriptとの連携が非常にスムーズに行えます。特に$stateやカスタムRunesでの型定義を正しく行うことで、開発効率が向上します。

型定義ファイルの活用

SvelteでTypeScriptを使用する際は、.svelteファイルに.ts拡張子をつけた上で、<script lang="ts">で記述します。これにより、JavaScriptと同様の構文で型チェックが可能になります。

カスタムRunesでの型定義例

このカスタムRunesをコンポーネントで使用すると、TypeScriptがincrement()関数の返り値や型を自動的に検出します。


コンパイラ設定の最適化

Svelteプロジェクトではtsconfig.jsonに以下の設定を加えることで、型推論の精度を高められます。

この設定により、SvelteとTypeScriptの連携がさらにスムーズになります。


SvelteKitとの連携方法

SvelteKitではRunesシステムを活用することで、データフェッチングやルーター処理をシンプルに実装できます。特にページコンポーネントで$derived$effectを使うと、UIのリアクティブ性が向上します。

ページコンポーネントでの実装例

以下はSvelteKitの+page.svelteファイル内でRunesを用いたデータフェッチングの一例です。

このコードでは$effect内でAPIを呼び出し、取得したデータをitemsに格納しています。UIは自動的に更新されるため、手動でのレンダリング処理が不要です。


ロジック分離のコツ

SvelteKitでRunesを使う際は、ロジックをコンポーネント内だけでなく、カスタムRunesとして外部ファイルにまとめることをおすすめします。これにより、テスト性と再利用性が向上します。

カスタムRunesの作成例(useFetch.ts

このようにカスタムRunesを作成し、+page.svelteで使用することで、コードの見通しが良くなります。


双方向バインディング実装ガイド

Svelteでは$bindableというRuneを用いて、双方向バインディングが容易に実現できます。特にフォーム処理や入力欄のバリデーションで効果的です。

フォーム処理での具体例

以下は入力欄と状態変数が連動する簡単なフォームです。

このコードでは、$bindable()によって、ユーザーが入力した値が自動的にnameの状態に反映されます。


バリデーションロジックの組み込み

双方向バインディングに加え、バリデーションもRunesで簡潔に実装可能です。以下は名前が必須である場合の処理です。

このように$derivedと組み合わせることで、リアルタイムなバリデーションが可能です。


Svelte 4から5への移行ガイド

Svelte 5ではRunesシステムが導入されており、従来の構文との互換性は一部に制限があります。ただし、段階的な移行が可能であり、プロジェクトに合わせて柔軟に対応できます。

互換性のあるアップグレード手順

  1. Svelte CLIを最新版に更新する
  2. $reactiveやストアAPIの使用箇所を確認し、Runesに置き換え
  3. TypeScriptコンパイラ設定をSvelte 5向けに調整

このように段階的に変更することで、移行時のリスクを最小限に抑えられます


旧APIの置き換え方針

従来のAPI Runesへの置き換え方法
$: (リアクティブステートメント) $stateや$effectで再構築
writable() $stateを使って定義可能
derived() $derivedを使う

旧APIをRunesに変換する際には、テストを必ず実施し、動作が変わる可能性があることを意識してください。


まとめ

Svelte 5のRunesシステムは、$state, $derived, $effectといったリアクティブな構文で状態管理を行うことで、開発効率とコードの可読性を向上させています。TypeScriptとの連携により型安全性が向上し、SvelteKitとの組み合わせではロジック分離やデータフェッチングを簡潔に実装可能です。

双方向バインディングは$bindableを使って簡単に実現でき、UIのリアクティブ性を向上させられます。従来構文からRunesへの移行は段階的に進め、テストをしっかり実施してください。

Svelte 5 Runesは、JavaScript開発者にとって非常に使いやすく、かつパワフルな仕組みです。公式ドキュメントと併せて実際にコードを書きながら確認してみましょう。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Svelte