TL;DR

  • Svelte 公式チュートリアルの Basic SvelteKit。SvelteKit のデータの読み込み、ヘッダと Cookie、フォーム、API routes、$app/state、エラーとリダイレクトを扱う。
  • +page.js の load は、初回アクセス時にはサーバで、ページ遷移時にはブラウザで実行される。error を使わずに投げたエラーのメッセージは、ユーザには公開されない。

内容

Loading data

SvelteKit 2 から、load 関数が返すオブジェクトのトップレベルにある Promise は自動で await されなくなった。load から $props で受け取った data は Deep reactivity ではないので、再代入しないと再描画されない。

+page.server.js は常にサーバで実行される。一方、+page.js はページが SSR されるときはサーバで、CSR されるときはブラウザで実行される。そのため、デフォルトでは初回アクセス時にはサーバで、ページ遷移時にはブラウザで呼ばれる。

Headers and cookies

load、Form actions、Hooks、API routes で使える setHeaders は、主に Cache-Control を変えるのに使う。Set-Cookie は setHeaders では設定できないので、cookies.get と cookies.set を使う。ブラウザはデフォルトで現在のパスの親を Cookie のパスにするので、アプリケーション全体で使うには path: '/' を明示する。cookies.set は内部の map も更新するので、同じリクエストの中の cookies.get は更新後の値を返す。

オプションは cookie モジュールの parse と serialize のものに対応する。SvelteKit は set のデフォルトとして httpOnly: true、secure: true、sameSite: 'lax' を指定している。

Forms

Form actions でバリデーションエラーを返すときは、fail にステータスコードとデータを渡す。そのデータはページの Props の form で受け取れる。fail で包まなくても、返した値は Props で受け取れる。

return fail(422, { description: data.get("description"), error: error.message })

use:enhance を付けると、ページを再読み込みせずにブラウザ標準の POST の挙動をまねるので(Progressive Enhancement)、トランジションで装飾できる。

API routes

@sveltejs/kit の json を使うと JSON を簡単に返せ、json({ id }, { status: 201 }) のように Response コンストラクタと同じオプションを渡せる。

$app/state

$app/state は、読み取り専用の page、navigating、updated を提供する。以前の $app/stores は非推奨になった。page は現在のページの url、params、data などを持ち、内部で $state.raw を使っているのでリアクティブである。navigating はナビゲーション中だけ from、to、type を持つオブジェクトになり、ローディング表示に使える。updated はページを開いた後に新しいバージョンがデプロイされたかを表す。

Errors and redirects

@sveltejs/kit の error で作る想定されたエラーは、指定したメッセージがユーザに公開される。それ以外の予期せぬエラーは機密情報を含むかもしれないので、メッセージもスタックトレースも公開されず、デフォルトでは { "message": "Internal Error" } になる。この挙動は handleError フックで変えられる。

load 中にエラーが起きると、いちばん近い +error.svelte が描画される。ルートの +layout.svelte の load や +error.svelte の描画中のエラーでは、静的な src/error.html にフォールバックする。

リダイレクトには redirect(307, "/b") のように redirect を使う。load のほか、Form actions、API routes、handle フックの中でも使える。

キーワード

関連