sobria は、次のファイルとディレクトリを名前で認識します。Vite プラグインの設定は sobria/vite の API に記述しています。
src/
routes/ # ページ、レイアウト、API のルート
elements/ # 要素
server.ts # サーバーのエントリー(任意)
.sobria/ # sobria prepare が生成するファイル要素を TSX のソースのまま配布するライブラリは、package.json に sobria のフィールドを記述し、prefix に接頭辞を、elements に要素のディレクトリを指定します(外部からの利用)。
src/routes/ のファイル
| ファイル | 拡張子 | export | 内容 |
|---|---|---|---|
page | .tsx と登録した拡張子 | default、prerender | ディレクトリの URL のページ |
layout | .tsx と登録した拡張子 | default | 配下のページ、not-found、error を包むレイアウト |
route | .ts | GET、POST、PUT、PATCH、DELETE、prerender | ディレクトリの URL の API |
middleware | .ts | default | 配下のリクエストに適用する Hono のミドルウェア |
not-found | .tsx と登録した拡張子 | default | 404 のページ |
error | .tsx と登録した拡張子 | default | 500 のページ |
ほかの名前のファイルはルートになりません。ページが使用する部品は、ページと同じディレクトリに配置できます。
page
default export したサーバーコンポーネントを、GET のリクエストで描画します。props は params と url です(PageProps)。prerender を export すると、ビルドの時点で HTML のファイルに書き出します。
layout
ページ、not-found、error は、src/routes/layout.tsx を最も外側にして、そのファイルのディレクトリまでのすべての layout.tsx で包まれます。props は params、url、children です(LayoutProps)。
route
HTTP のメソッド名の関数を export します。
| リクエスト | レスポンス |
|---|---|
| export したメソッド | 関数の戻り値 |
| HEAD | GET の関数の戻り値 |
| export していないメソッド | 405。Allow ヘッダーに、export したメソッドを列挙します。GET を export していれば、HEAD も列挙します |
関数の戻り値は、次のようにレスポンスにします。
| 戻り値 | レスポンス |
|---|---|
| Response | その Response |
undefined | 204 |
| そのほかの値 | 値を JSON にしたレスポンス |
sobria/server の defineHandler(Hono の defineHandler)で包んだ関数の戻り値には、上の表と異なる Hono の規則を適用します。この規則では、文字列は HTML に、null も 204 になります。
middleware
defineMiddleware で作成したミドルウェアを default export します。
| 配置 | 適用する範囲 |
|---|---|
src/routes/middleware.ts | サーバー関数の呼び出しとフォームの送信を含む、すべてのリクエスト |
| そのほかのディレクトリ | 配下のページと route.ts。存在しない URL に配下の not-found で応答するときと、フォームの送信が失敗して配下の error を描画するときにも適用します。サーバー関数には適用しません |
ディレクトリの layout、not-found、error は、そのディレクトリまでのすべての middleware.ts を通過したリクエストでだけ描画します。
not-found と error
| ファイル | 使用する場面 | props |
|---|---|---|
not-found | 配下の存在しない URL と、notFound() を投げたとき | params、url(NotFoundProps) |
error | 配下のページのシェルの描画で投げたエラーを <Errored> が受け止めなかったときと、フォームの送信先のサーバー関数が失敗したとき | params、url、error(ErrorProps) |
- ページで投げた
notFound()とエラーには、ページのディレクトリか祖先のディレクトリのうち、最も近いものを使用します - ミドルウェアが投げた
notFound()には、そのミドルウェアのディレクトリの親から祖先に向かって探索し、最も近いものを使用します。src/routes/middleware.tsが投げたときは、Not Foundのテキストを 404 で返します route.tsが投げたnotFound()には、route.tsのディレクトリか祖先のディレクトリのうち、最も近いものを使用します- フォームの送信先のサーバー関数が失敗したときは、送信したページのディレクトリか祖先のディレクトリのうち、最も近い
errorを使用します。送信したページの URL に一致するページが無いときは、その URL に使用するnot-foundのディレクトリか祖先のディレクトリのうち、最も近いerrorを使用します - 存在しない URL には、URL の先頭から区切りが一致するディレクトリの
not-foundのうち、URL の区切りの数で数えて最も深いものを使用します - どちらも、そのディレクトリまでのすべての
layout.tsxで包みます not-foundが無ければ、Not Foundのテキストを返しますerrorが無ければ、本番はInternal Server Errorのテキストを返し、開発中は Vite のエラーのオーバーレイを表示する HTML を返します
使い方はルーティングに記述しています。
ディレクトリの名前
ディレクトリの名前が、URL の 1 つの区切りになります。
| 名前 | 意味 | 例 |
|---|---|---|
users | 静的な区切り | users/page.tsx は /users |
[id] | 動的な区切り。値はパラメータ id になります | users/[id]/page.tsx は /users/3 |
[...slug] | キャッチオール。1 つ以上の区切りに一致し、値は / を含む文字列になります | docs/[...slug]/page.tsx は /docs/a/b |
(marketing) | グループ。URL に含めません | (marketing)/about/page.tsx は /about |
- パラメータの名前には、ASCII の英数字と
_を使用します - 同じ位置で複数のルートが一致するときは、静的な区切り、動的な区切り、キャッチオールの順に優先します
- グループに配置した
layout.tsxとmiddleware.tsは、そのグループのルートだけに適用します
エラーになる配置
次の配置は、ルートを走査した時点でエラーになります。
[か(で始まり、上の表のどの形でもない名前のディレクトリ- 同じ URL を扱う 2 つの
pageかroute。グループを経由した場合と、同じディレクトリにpageとrouteを配置した場合を含みます - 同じ URL を扱い、グループを含めたディレクトリの深さが同じ 2 つの
not-found - キャッチオールのディレクトリの配下のディレクトリにある
page、route、not-found - 同じディレクトリにある、拡張子を除いた名前が同じ 2 つのルートのファイル(
page.tsxとpage.mdxなど)
src/elements/
拡張子が .tsx か .jsx のファイルが default export した関数が、要素になります。ディレクトリは、Vite プラグインの設定 elementsDir で変更できます。
| ファイル | 扱い |
|---|---|
_ で始まるファイルと、_ で始まるディレクトリの中のファイル | 補助コンポーネント。要素になりません |
.ts と .js のファイル | 普通のモジュール |
| 登録した拡張子のファイル | 普通のモジュール |
タグ名
タグ名は、接頭辞と、src/elements/ からのファイルのパスから決まります。接頭辞は Vite プラグインの設定 prefix で指定します。
| ファイル | 接頭辞がデフォルトの sobria のときのタグ名 |
|---|---|
user-card.tsx | sobria-user-card |
forms/DatePicker.tsx | sobria-forms-date-picker |
forms/index.tsx | sobria-forms |
HTMLViewer.tsx | sobria-html-viewer |
- パスの区切りは
-で連結します。camelCase、PascalCase、snake_case の名前は kebab-case にします indexのファイルのタグ名は、ディレクトリの名前になりますsrc/elements/の直下のindexのファイルはビルドのエラーになります- ファイル名とディレクトリ名に英数字、
-、_以外の文字を含むと、ビルドのエラーになります - 2 つのファイルが同じタグ名になると、ビルドのエラーになります。例えば、
forms/date-picker.tsxとforms-date-picker.tsxはどちらもsobria-forms-date-pickerになります
要素のファイルの export
| export | 内容 |
|---|---|
| default | 要素の関数 |
load | デフォルトの起動のタイミング(load:*) |
src/ のそのほかのファイル
src/routes/ と src/elements/ の外のファイルには、サーバー関数、データの取得、共通のコンポーネントを配置します。
- サーバー関数は、
src/の中の、拡張子が.ts、.tsx、.js、.jsxのファイルで定義できます - 要素は、
src/routes/の中のファイルを import できません。要素から呼び出すサーバー関数は、src/routes/の外に配置します
src/server.ts
src/server.ts は、サーバーのエントリーです。fetch を持つ値(Hono のアプリなど)を default export します。
src/server.ts が無ければ、sobria/app をサーバーのエントリーにします。sobria/app は、src/routes/ のファイルとサーバー関数から sobria が構築した Hono のアプリを default export します。
開発サーバー、vite build の出力、vite preview は、どれも同じエントリーにリクエストを渡します。書き方は Hono との連携とデプロイに記述しています。
.sobria/
.sobria/ には、型の検査に使用するファイルを生成します。
| ファイル | 内容 |
|---|---|
routes.d.ts | ページのパスとパラメータの型。href() と PageProps が使用します |
env.d.ts | Vite のアセットの型、*.css の型、グローバルの JSX.Element。Vite プラグインの設定 globalJSX: false を指定すると、グローバルの JSX.Element を宣言しません |
elements.d.ts | アプリの要素のタグの型 |
tsconfig.shared.json | src/routes/ と src/elements/ の外のファイルの tsconfig |
tsconfig.elements.json | src/elements/ の tsconfig |
tsconfig.server.json | src/routes/ の tsconfig |
out/ | tsc -b が出力する型宣言 |
- 生成するのは、開発サーバーとビルドの開始時と、
sobria prepareを実行したときです。開発中は、src/routes/か要素のディレクトリの中でファイルかディレクトリを追加か削除したときと、tsconfig.base.jsonを追加か削除したときにも生成します - 内容が変わったファイルだけを書き込みます
- 生成する tsconfig は、アプリの
tsconfig.base.jsonがあれば、それを extends します - アプリの
tsconfig.jsonには、3 つの tsconfig をreferencesに列挙します .sobria/は git で管理しません
登録した拡張子
Vite プラグインの設定 extensions に、ほかのプラグインが TSX に変換するファイルの拡張子(.mdx など)を登録できます。変換するプラグインは、plugins の配列で sobria より前に配置します。
// vite.config.ts
export default defineConfig({
plugins: [mdx(), sobria({ extensions: [".mdx"] })],
});| 場所 | 登録した拡張子のファイルの扱い |
|---|---|
src/routes/ | page、layout、not-found、error に使用できます |
src/elements/ | 要素にならず、普通のモジュールになります |
| サーバー関数 | 定義すると、変換のエラーになります |
| 型の検査 | 生成する tsconfig の対象にしません |
次の拡張子は、sobria() を呼び出した時点でエラーになります。
.ts、.tsx、.js、.jsx、.mts、.cts、.mjs、.cjs、.json、.css.の後に英数字以外の文字を含む拡張子(.page.mdなど)- 2 回登録した拡張子