こんにちは。よっしーです(^^)
今日は、SvelteKitでのルーティングについて解説しています。
背景
SvelteKitでのルーティングについて調査する機会がありましたので、その時の内容を備忘として記事に残しました。
レストパラメータ
ルートセグメントの数が不明な場合、レスト構文を使用できます。例えば、GitHubのファイルビューアを次のように実装できます…
/[org]/[repo]/tree/[branch]/[...file]
…この場合、/sveltejs/kit/tree/main/documentation/docs/04-advanced-routing.md
へのリクエストは、ページで以下のパラメータが利用可能になります:
{
org: 'sveltejs',
repo: 'kit',
branch: 'main',
file: 'documentation/docs/04-advanced-routing.md'
}
src/routes/a/[...rest]/z/+page.svelte
は、/a/z
(つまり、パラメータが全くない場合)だけでなく、/a/b/z
や /a/b/c/z
などにもマッチします。レストパラメータの値が有効であることを確認してください。例えば、マッチャーを使用して検証することができます。
この機能により、柔軟なルーティングが可能になり、不特定の数のパスセグメントを含むURLに対応できます。ただし、セキュリティ上の理由から、レストパラメータの値を適切に検証することが重要です。
404ページ
レストパラメータを使用すると、カスタム404ページをレンダリングすることもできます。次のようなルート構造があるとします…
src/routes/
├ marx-brothers/
│ ├ chico/
│ ├ harpo/
│ ├ groucho/
│ └ +error.svelte
└ +error.svelte
…この場合、/marx-brothers/karl
にアクセスしても、marx-brothers/+error.svelte
ファイルはレンダリングされません。これは、マッチするルートがないためです。ネストされたエラーページをレンダリングしたい場合は、/marx-brothers/*
のリクエストに全てマッチするルートを作成し、そこから404を返す必要があります:
src/routes/
├ marx-brothers/
| ├ [...path]/
│ ├ chico/
│ ├ harpo/
│ ├ groucho/
│ └ +error.svelte
└ +error.svelte
src/routes/marx-brothers/[…path]/+page.js
import { error } from '@sveltejs/kit';
/** @type {import('./$types').PageLoad} */
export function load(event) {
error(404, 'Not Found');
}
404のケースを処理しない場合、それらはhandleError
に表示されます。
この方法を使用することで、特定のディレクトリ構造内でカスタム404ページを表示できるようになります。これにより、より細かいエラー処理と、ユーザーにとってより適切なエラーページの提供が可能になります。
オプショナルパラメータ
[lang]/home
のようなルートには、lang
という必須のパラメータが含まれています。場合によっては、これらのパラメータをオプショナルにすると便利です。例えば、home
とen/home
の両方が同じページを指すようにしたい場合があります。これを実現するには、パラメータをもう一組の角括弧で囲みます:[[lang]]/home
注意点として、オプショナルルートパラメータはレストパラメータの後に配置することはできません([...rest]/[[optional]]
)。これは、パラメータが「貪欲に」マッチングされるため、オプショナルパラメータが常に未使用になってしまうからです。
この機能を使用すると、より柔軟なルーティング構造を実現できます。例えば:
- 多言語サイトで、デフォルト言語のページと特定言語のページを同じコンポーネントで処理できます。
- オプショナルなフィルタやカテゴリをURLに含めることができます。
ただし、オプショナルパラメータを使用する際は、アプリケーションロジック内で適切に処理する必要があります。パラメータが存在しない場合のデフォルト値や動作を明確に定義することが重要です。
おわりに
今日は、 SvelteKitでのルーティングについて解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント