設定とファイル
framework()のオプションと、src/routes/に置けるファイル、@k8ordo/serverの各入口からimportできるものの一覧です。それぞれの使い方は、ガイドの各ページで説明しています。
このページの内容
4つの入口
@k8ordo/serverは、コードが動く場所ごとに入口を分けています。デプロイしたアプリが読み込むのはruntimeとserveだけで、どちらもViteを読み込みません。
@k8ordo/server:vite.config.tsで使うプラグインのframework()です。Viteを読み込みます。@k8ordo/server/runtime:ハンドラの中で動くコードがimportするものです。Node.jsにしか無いものを使わないので、ハンドラと一緒にどのランタイムでも動きます。@k8ordo/server/serve:ビルドをNode.jsで動かすserve()です。@k8ordo/server/vercel:Vercel向けの出力を書くプラグインのvercel()です。
framework
import元 @k8ordo/server
アプリをサーバーで動かすViteのプラグインです。ReactのプラグインとRSCのパイプラインを含んだ配列を返すので、pluginsにそのまま渡します。
framework(options?: ServerOptions): PluginOption[]引数
options.routesDirstring- ルートのディレクトリです。プロジェクトのルートからの相対パスで、既定は
src/routesです。変えても、生成されるファイルは.k8ordo/に書かれます。
戻り値
PluginOption[] — Viteのプラグインの配列。
vite.config.tsimport { framework } from '@k8ordo/server';
import { defineConfig } from 'vite';
export default defineConfig({ plugins: [framework()] });ルートのファイル
src/routes/のディレクトリに置けるファイルと、それぞれがexportするもの、受け取るものです。これ以外の名前のファイルは、_で始まるディレクトリに置きます。
page.tsx
- default export:そのディレクトリのURLに答えるページのコンポーネントです。
paramsとpathnameを受け取ります。 - このモードでは、
requestも受け取ります。リクエストのヘッダーとCookieが入っています。 paramsSchema:パラメータを検証するスキーマです。Standard Schemaを実装したものを渡します。省略できます。search:読むurlスキーマです。宣言したページは、そのスロットをsearchとして受け取ります。
layout.tsx
- default export:その下で描かれるものを
childrenで受け取って包むコンポーネントです。paramsとpathnameも受け取りますが、paramsは文字列として型が付きます。 - このモードでは、
requestも受け取ります。リクエストのヘッダーとCookieが入っています。 paramsSchema:その下のすべてのページで、ページ自身のスキーマより先に走ります。
not-found.tsx
- default export:その下で、どのルートにも当たらなかったURLに答えるコンポーネントです。
paramsとpathnameを受け取り、paramsの値は検証されていない文字列です。 - このモードでは、
requestも受け取ります。リクエストのヘッダーとCookieが入っています。 - このモードでは404のステータスで答えます。ディレクトリごとに置けます。
error.tsx
'use client'のファイルにします。- default export:
errorとresetを受け取るコンポーネントです。その下で例外が投げられたとき、代わりに描かれます。paramsは受け取りません。
loading.tsx
- default export:propsを受け取らないコンポーネントです。その下のページを待つ間、
<Suspense>のfallbackとして描かれます。
redirect.ts
- default export:行き先の文字列か、
{ to, permanent }です。toはルート表のパターンで書き、パラメータは当たった値で埋まります。 - このモードでは、
GETとHEADに307で答え、permanentなら308で答えます。
route.ts
GETやPOSTなどのメソッド名のexport:{ request, params }を受け取り、Responseを返す関数です。paramsSchema:ページと同じく、パラメータを検証します。- このモードでは7つのメソッドのどれもexportできます。
HEADが無ければ、GETの答えから本文を外して返します。
guard.ts
- default export:
{ request, params }を受け取る関数です。Responseを返すとそこで打ち切り、何も返さなければ通します。その下のURLに答える前に走ります。
@k8ordo/routerから使うもの
ルートのファイルが使う型と関数は、モードのパッケージではなく@k8ordo/routerから来ます。そのためページは、どちらのモードでも同じに書けます。
PageProps<pattern>:ページが受け取るpropsの型です。LayoutProps<pattern>:レイアウトが受け取るpropsの型です。ErrorProps:error.tsxが受け取るpropsの型です。RouteContext<pattern>:route.tsの関数が受け取る値の型です。notFound():ページから投げると、いちばん近いnot-found.tsxが404として答えます。href():ルート表に対して型の付いたURLを作ります。usePathname()とuseMatch():ブラウザで今のURLを読むフックです。usePendingPathname():遷移している途中の行き先を読むフックです。
cookies
import元 @k8ordo/server/runtime
リクエストのCookieを読み書きします。guard.ts、route.ts、Server Actionの中で呼びます。
cookies(): Cookiesフィールド
get(name: string) => string | undefined- 名前で値を読みます。無ければ
undefinedです。 has(name: string) => boolean- その名前のCookieがあるかどうかを返します。
set(name: string, value: string, options?: CookieOptions) => void- 値を書きます。3つ目の引数で、
CookieOptionsの属性を渡します。 delete(name: string, scope?: { path?: string; domain?: string }) => void- Cookieを消します。書いたときと同じ
pathとdomainを渡します。
注意
- 読むと、リクエストが運んできたCookieに、同じリクエストの中で先に書いたものが重なって見えます。
- 書いたものは、答えが何であっても、その答えの
Set-Cookieとしてブラウザに届きます。 - ページの描画の中で呼ぶと、例外を投げます。ページは
request.cookiesを読みます。
cookies().get('session');
cookies().set('session', token, { maxAge: 60 * 60 * 24 });
cookies().delete('session');CookieOptions
import元 @k8ordo/server/runtime
cookies().set()の3つ目の引数で渡す、Cookieの属性です。何も渡さなければ、セッションに合った値になります。
type CookieOptions = {
path?: string;
domain?: string;
maxAge?: number;
expires?: Date;
httpOnly?: boolean;
secure?: boolean;
sameSite?: 'strict' | 'lax' | 'none';
};フィールド
pathstring- 既定は
/です。 domainstring- 既定では付けません。
maxAgenumber- 有効期間を秒で渡します。
0を渡すと、すぐに切れます。 expiresDate- 期限を
Dateで渡します。 httpOnlyboolean- 既定は
trueで、ページのスクリプトからは読めません。 secureboolean- 既定は
trueで、HTTPSでしか送られません。この機械(localhostなど)に素のHTTPで届いたリクエストでは、既定がfalseになります。 sameSite'strict' | 'lax' | 'none'- 既定は
'lax'です。'none'はsecureのときだけ使えます。
responseHeaders
import元 @k8ordo/server/runtime
最終的な応答が持つHeadersを返します。ここに書いたヘッダーは、ページでもペイロードでも、guardが返したResponseでも、答えに付きます。
responseHeaders(): Headers注意
- 答えがすでに持っているヘッダーは置き換えます。
guard.ts、route.ts、Server Actionの外で呼ぶと、例外を投げます。
requestHeaders
import元 @k8ordo/server/runtime
リクエストが運んできたヘッダーを返します。引数しか受け取らないServer Actionの中で、ヘッダーを読むのに使います。
requestHeaders(): Headers注意
guard.ts、route.ts、Server Actionの外で呼ぶと、例外を投げます。
redirect
import元 @k8ordo/server/runtime
Server Actionを終え、訪問者を別のURLへ送ります。
redirect(to: string): never引数
tostring- 行き先のURLです。書いたまま送られるので、
href()で作ります。
戻り値
never — 値を返さず、例外を投げます。
注意
- 例外を投げて終わるので、
tryの中では呼びません。 - JavaScriptが届く前に送られたフォームには
303で、クライアントのランタイムからの呼び出しには、行き先へ移るよう伝えるペイロードで答えます。
nonce
import元 @k8ordo/server/runtime
この答えのインラインスクリプトに付けるnonceを返します。リクエストごとに新しい値です。
nonce(): string注意
- リクエストに答えている間なら、描画の中でも同じ値を返します。
- リクエストの外で呼ぶと、例外を投げます。
Guard
import元 @k8ordo/server/runtime
guard.tsがdefault exportする関数の型です。そのディレクトリのパターンを型引数に渡します。
type Guard<P extends string = string> = (context: {
request: Request;
params: ParamsOf<P>;
}) => Response | void | Promise<Response | void>;フィールド
requestRequest- 届いたままの
Requestです。 paramsParamsOf<P>- そのディレクトリのパターンのパラメータです。guardはスキーマより前に走るので、URLの文字列のままです。
RouteRequest
import元 @k8ordo/server/runtime
ページとレイアウト、not-found.tsxが受け取るrequestの型です。どちらのフィールドも読むだけです。
type RouteRequest = {
headers: Headers;
cookies: ReadonlyMap<string, string>;
};フィールド
headersHeaders- リクエストのヘッダーです。
cookiesReadonlyMap<string, string>Cookieヘッダーを名前ごとに読み取ったものです。同じ名前が2回あれば、最初のものを使います。
RedirectTarget
import元 @k8ordo/server/runtime
redirect.tsがdefault exportする値の型です。satisfies RedirectTargetと書くと、書いたその場で形を検査できます。
type RedirectTarget =
| string
| { to: string; permanent?: boolean };serve
import元 @k8ordo/server/serve
ビルドをNode.jsのHTTPサーバーで動かします。待ち受けを始めてから、待ち受けている場所と止め方を返します。
serve(options?: ServeOptions): Promise<Server>引数
options.diststring- ビルドの出力ディレクトリです。既定は
distで、今の作業ディレクトリから解決します。 options.portnumber- 待ち受けるポートです。既定は
3000で、0を渡すと空いているポートをシステムが選びます。 options.hoststring- 待ち受けるホストです。既定の
localhostには同じマシンからしか届かないので、コンテナの中などでは0.0.0.0を渡します。
戻り値
Promise<Server> — 待ち受けを始めたサーバー。
フィールド
portnumber- 実際に待ち受けているポートです。
urlstringhttp://<host>:<port>の形のURLです。close() => Promise<void>- サーバーを止めます。止まると解決するPromiseを返します。
注意
GETとHEADのうち、dist/client/の中のファイルを指すものにはそのファイルを返し、それ以外はハンドラに渡します。- ハンドラが例外を投げたときは、
500と本文internal errorだけを返し、内容はサーバーのログに出します。
serve.jsimport { serve } from '@k8ordo/server/serve';
const server = await serve({ port: 3000 });
console.log(server.url);vercel
import元 @k8ordo/server/vercel
vite buildに、VercelのBuild Output API(v3)の形で.vercel/output/も書かせるプラグインです。framework()の隣に置きます。
vercel(): Plugin戻り値
Plugin — Viteのプラグイン。
注意
- ハンドラをすべての依存ごとバンドルします。そのため、ネイティブのバイナリを持つ依存や、自分のファイルをパスで読む依存は動きません。
vite.config.tsimport { framework } from '@k8ordo/server';
import { vercel } from '@k8ordo/server/vercel';
import { defineConfig } from 'vite';
export default defineConfig({ plugins: [framework(), vercel()] });