SvelteKit 3.0が2026年10月1日に公開されました。Svelteチームの公式ブログによると、設定ファイルはsvelte.config.jsからvite.config.tsへ移り、$libのエイリアスは#libに変わります。移行ガイドが示す最低要件は、Node.js 22.17、TypeScript 6、Svelte 5.57.1、Vite 8.0.12、@sveltejs/vite-plugin-svelte 7です。既存のSvelteKit 2系のアプリは、設定やimportの書き換えが必要になると考えられます。この記事では、移行前に確かめたい点と、自動移行コマンドの使いどころを整理します。
この記事の目次
svelte.config.jsが使えなくなった
SvelteKit 3ではsvelte.config.jsが非対応になり、設定はvite.config.ts(JavaScript版ならvite.config.js)のsveltekit()プラグインのオプションに書きます。Publickeyは、Svelteのコンパイラ設定、SvelteKitの設定、Viteの設定を近い場所で管理できるようになった点を挙げています。
移行ガイドによると、次のオプションは削除されました。
files.libexperimental.handleRenderingErrorsexperimental.instrumentationvitePluginpreloadStrategyprerender.origincsrf.checkOrigin
後継として、csrf.checkOriginにはcsrf.trustedOrigins、prerender.originにはpaths.originが用意されました。experimental.tracingは、トップレベルのtracingオプションになりました。上のオプションを設定に書いているプロジェクトは、移行後の設定を見直すことになります。
$libが#libに。拡張子も書く
自動生成されていた$libエイリアスは、Node.jsのサブパスインポートを使う#libに変わりました。定義はpackage.jsonのimportsで行います。移行ガイドの例は次のとおりです。
{
"imports": {
"#lib": "./src/lib/index.js",
"#lib/*": "./src/lib/*"
}
}
コード側では$libを#libに置き換え、拡張子(.jsや.ts)を明示します。たとえばimport { foo } from '$lib/foo'はimport { foo } from '#lib/foo.js'になります。拡張子の指定が必要なので、置換後にビルドで確かめるのが確実です。
$app/*・CSRF・エラー処理の破壊的変更
移行ガイドには、設定とエイリアスのほかにも多くの破壊的変更が載っています。影響が大きそうなものを挙げます。
$app/environmentは$app/envに改名。$app/storesは削除され、$app/stateを使う。$app/pathsのbase・assets・resolveRouteは削除され、asset()とresolve()を使う。$app/navigationのinvalidateAllは非推奨になり、refreshAllを使う。json()とtext()は非推奨。Response.json()やnew Response()を使う。- CSRF保護は常に有効。許可するオリジンは
csrf.trustedOriginsで指定する。 error()の第2引数は文字列のみで、追加のプロパティは第3引数に渡す。handleValidationErrorは削除され、検証エラーはhandleErrorにkind: 'validation'として渡る。- 公式アダプターはすべてSvelteKit 3が必要。
adapter-vercelはedgeランタイムをサポートしない。
とくにCSRFは、外部からPOSTを受けるアプリで動作が変わる可能性があります。移行ガイドによると、Content-Typeヘッダーのない、異なるオリジンからの変更系リクエストは拒否されます。また、このチェックはローカル開発では働かないとされているため、手元で動いても安心できません。adapter-nodeで使っていた環境変数ORIGINはpaths.originに置き換わっているので、リバースプロキシの背後で動かしているアプリも確認が必要です。
移行は、2.xの最新版に上げてからコマンドを実行する
公式ブログと移行ガイドが示す移行コマンドは、次のとおりです。
npx sv migrate sveltekit-3
公式ブログの例では--tasks all --confirmが付いています。多くの破壊的変更は自動で書き換えられ、自動化できない部分はTODOリストとして出力されます。移行ガイドは、先に最新の2.xへ上げておくと、対象箇所に警告が出て作業しやすいと説明しています。新規作成はnpx sv create my-new-appです。
手順にすると、次のようになります。
- Node.js、TypeScript、Svelte、Vite、vite-plugin-svelteのバージョンが、最低要件を満たしているかを確認する。
- SvelteKit 2系の最新版に上げ、出た警告を片づける。
- ブランチを切って、
npx sv migrate sveltekit-3を実行する。 - 出力されたTODOを処理し、ビルドとテストを通す。
- CSRFの設定(本番相当の環境で確認)と、アダプターのバージョンを確認する。
Remote FunctionsとAsync Svelteは、まだ実験段階
公式ブログによると、Remote Functionsは準備中で、チームの最優先課題です。クライアントとサーバーの間で、安全かつ効率的で、型安全な通信を行うためのユーティリティ群で、利用にはAsync Svelteが必要です。公式ブログによると、Async Svelteは現時点でexperimentalフラグが必要です。移行ガイドでは、リモート関数を使うにはexperimental.remoteFunctionsを有効にする必要があるとされています。本番に入れるかどうかは、フラグが外れてから決めるのが無難でしょう。
Vite 8とアダプターの対応を見てから上げる
個人的には、要件のVite 8が最大のハードルだと考えます。SvelteKitだけの話ではなく、プロジェクト全体のビルド周りを動かすことになるので、使っているViteプラグインが8系に対応しているかを先に確かめたいところです。設定をVite側に書く方式は2.62から使えるとされているので、2.xのうちに設定の移動と#libへの置き換えを済ませておけば、3.0への切り替えは依存関係の更新が中心になります。adapter-nodeで運用しているなら、環境変数ORIGINの扱いの変更が、デプロイ手順に直接響きます。外部からPOSTを受けるアプリは、CSRFのチェックがローカルでは働かない点を踏まえ、本番相当の環境で確かめてから切り替えるのが安全でしょう。新規プロジェクトなら、はじめから3.0で始めるのが素直です。
参考にした情報
- Svelte「SvelteKit 3 is here」(2026年10月1日)
- SvelteKit ドキュメント「Migrating to SvelteKit v3」
- Publickeyの紹介記事(2026年10月14日)
2026年10月18日時点の情報です。
