![よっしー](https://yossi-note.com/wp-content/themes/cocoon-master/images/man.png)
こんにちは。よっしーです(^^)
今日は、SvelteKitにおいてSapperからの移行について解説しています。
背景
SvelteKitにおいてSapperからの移行について調査する機会がありましたので、その時の内容を備忘として記事に残しました。
Sapperからの移行について
SvelteKitはSapperの後継であり、その設計の多くの要素を共有しています。
既存のSapperアプリケーションをSvelteKitに移行する予定がある場合、いくつかの変更を加える必要があります。移行時に下記の例を参照すると役立つかもしれません。
- Sapperからの移行
- package.json
- プロジェクトファイル
- ページとレイアウト
- エンドポイント
- 統合
ページとレイアウト
ファイルの名前変更
ルートは現在、あいまいさを排除するためにフォルダ名のみで構成され、+page.svelte
に至るフォルダ名がルートに対応します。概要についてはルーティングのドキュメントを参照してください。以下に旧/新の比較を示します:
旧 | 新 |
---|---|
routes/about/index.svelte | routes/about/+page.svelte |
routes/about.svelte | routes/about/+page.svelte |
カスタムエラーページコンポーネントは_error.svelte
から+error.svelte
に名前を変更する必要があります。同様に、_layout.svelte
ファイルは+layout.svelte
に名前を変更する必要があります。その他のファイルは無視されます。
インポート
@sapper/app
からのgoto
、prefetch
、prefetchRoutes
のインポートは、それぞれ$app/navigation
からのgoto
、preloadData
、preloadCode
のインポートに置き換える必要があります。
@sapper/app
からのstores
のインポートは置き換える必要があります — 後述のストアセクションを参照してください。
src/node_modules
内のディレクトリからインポートしていたファイルは、$lib
インポートに置き換える必要があります。
プリロード
以前と同様に、ページとレイアウトは、レンダリングが行われる前にデータを読み込むことができる関数をエクスポートできます。
この関数はpreload
からload
に名前が変更され、現在は+page.svelte
(または+layout.svelte
)の隣にある+page.js
(または+layout.js
)に配置され、そのAPIも変更されています。page
とsession
という2つの引数の代わりに、単一のevent
引数があります。
this
オブジェクトはなくなり、したがってthis.fetch
、this.error
、this.redirect
もなくなりました。代わりに、入力メソッドからfetch
を取得でき、error
とredirect
は現在スローされます。
ストア
Sapperでは、以下のように提供されたストアへの参照を取得していました:
import { stores } from '@sapper/app';
const { preloading, page, session } = stores();
page
ストアは引き続き存在します。preloading
はfrom
とto
プロパティを含むnavigating
ストアに置き換えられました。page
には現在url
とparams
プロパティがありますが、path
やquery
はありません。
SvelteKitではアクセス方法が異なります。stores
は現在getStores
になっていますが、ほとんどの場合、navigating
とpage
を$app/stores
から直接インポートできるため、不要です。Svelte 5とSvelteKit 2.12以上を使用している場合は、代わりに$app/state
の使用を検討してください。
ルーティング
正規表現ルートはサポートされなくなりました。代わりに、高度なルートマッチングを使用してください。
セグメント
以前は、レイアウトコンポーネントは子セグメントを示すsegment
プロップを受け取っていました。これは削除されました。代わりに、より柔軟な$page.url.pathname
(またはpage.url.pathname
)値を使用して、必要なセグメントを導き出す必要があります。
URL
Sapperでは、すべての相対URLはベースURL(通常は/
、basepath
オプションが使用されていない限り)に対して解決されていました。
これは問題を引き起こし、SvelteKitではその方式は採用されていません。代わりに、相対URLは現在のページ(またはload
関数内のfetch
URLの場合は目的のページ)に対して解決されます。ほとんどの場合、ルート相対(つまり、/
で始まる)URLを使用する方が簡単です。これらの意味はコンテキストに依存しないためです。
属性
sapper:prefetch
は現在data-sveltekit-preload-data
になっていますsapper:noscroll
は現在data-sveltekit-noscroll
になっています
解説
このセクションは、SapperからSvelteKitへの移行における最も重要な変更点の1つを説明しています。主なポイントは:
- ファイル構造の標準化:
- より明確なファイル命名規則(
+
プレフィックスの導入) - ルーティングの単純化と明確化
- レイアウトとエラーページの統一的な命名規則
- APIの近代化:
preload
からload
への移行- よりシンプルな引数構造
- エラーハンドリングの改善
- ストアの改善:
- より直接的なアクセス方法
- ナビゲーション情報の強化
- 新しいステート管理の選択肢
- URLハンドリングの改善:
- より予測可能な相対URL解決
- ルーティングの柔軟性向上
- HTML属性の標準化
これらの変更は、より一貫性のある、理解しやすい、そして保守が容易なアプリケーション構造を目指していることを示しています。特に、ファイル構造とルーティングの明確化、およびデータ取得のシンプル化が重要な改善点として挙げられます。
おわりに
今日は、 SvelteKitにおいてSapperからの移行について解説しました。
![よっしー](https://yossi-note.com/wp-content/themes/cocoon-master/images/man.png)
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント