ページとナビゲーション
ナビゲーションを変える
ヘッダーやフッターに表示するリンクは、riebeckite.config.ts に登録する@riebeckite/plugin-navigationプラグインが提供します。
plugins: [
navigation({
items: [
{ label: "Guide", href: "/guide" },
{
label: "Notes",
href: "/notes/planning",
children: [
{ label: "Planning", href: "/notes/planning" },
{ label: "Writing", href: "/notes/writing" },
],
},
],
secondary: [{ label: "GitHub", href: "https://github.com/example/site" }],
}),
]
引数なしの navigation() は Vault からリンクを導出します。items を渡すと手動で選んだリンクに、secondary には補助リンクを指定できます。
リンクのモデルを返し、SiteNav でツリーを描画するのはプラグインです。描画したリストをどこに置くかはサイトが決めます。スターターでは app/components/site-header.tsx が SiteNav を使い、app/routes/_renderer.tsx が解決済みのモデルと現在のパスを渡します。
そのため、変更したい内容に応じて次のように考えます。
- リンクを追加・削除したい →
navigation({ items })を変更する - Vault からリンクを導出したい → 引数なしの
navigation()を使う - ヘッダーの見た目や HTML を変えたい →
site-header.tsxを変更する - ヘッダー / フッター自体の配置を変えたい →
_renderer.tsxを変更する
子の再帰描画、現在のパスの判定、言語を考慮した正規化、外部リンク、aria-current といった描画の仕組みは SiteNav にあります。サイト側で再実装する必要はありません。設定できる項目はナビゲーションの設定を参照してください。
プラグインが作るページとリンク
Riebeckite では、ヘッダーやフッターのナビゲーションとは別に、プラグインがページやリンクを追加することがあります。大きく分けると、次の2種類があります。
閲覧するためのページ
検索、タグやフォルダーの一覧、タクソノミーのページ、フィード、サイトマップなどです。これらはプラグインが必要なページやエンドポイントを生成します。
有効化しただけでヘッダーやフッターにリンクが追加されるわけではありません。ヘッダーに表示したい場合は、通常のページと同じように navigation へ追加してください。
記事同士をつなぐUI
パンくずリスト、バックリンク、関連記事、シリーズの前後リンク、ローカルグラフなどです。これらは主に記事ページの中へ表示されます。プラグインがコンポーネントを公開し、サイトが記事のヘッダーやフッターなど好きな場所へ描画します。
つまり、次のような違いがあります。
ヘッダー / フッターのリンク
↓
riebeckite.config.ts の navigation
検索・タグ・フォルダーなどのページ
↓
プラグインのページ種別
パンくずリスト・バックリンクなど
↓
プラグインのコンポーネント
ルートを追加する
app/routes/ は通常の HonoX のルートディレクトリです。そのため、サイト独自のページも通常どおり追加できます。たとえば /about を作りたい場合は、HonoX のルートとして追加できます。
一方、Markdown のコンテンツやプラグインが提供するページについては、基本的に自分でルートを追加する必要はありません。スターターの catch-all ルートが、contentRouteSsgParams、riebeckiteSsgParams、resolveRiebeckiteContentRequest を利用して、コンテンツとプラグインのページ種別を自動的に解決します。
プラグインのページをヘッダーやフッターに表示したい場合も、新しいルートを作るのではなく、navigation にリンクを追加します。
404(ページが見つからない)
存在しない URL は、HonoX 標準の _404.tsx ルートが処理します。サイト側の通常のファイルなので、これを編集すると「ページが見つからない」画面を変更できます。
// app/routes/_404.tsx
import type { NotFoundHandler } from "hono";
const handler: NotFoundHandler = (c) => {
c.status(404);
return c.render(
<div class="not-found">
<h1>Page not found</h1>
<p>The page you requested does not exist or is not available.</p>
<a href="/">Back to home</a>
</div>,
);
};
export default handler;
「見つからない」と判断するのは Riebeckite です。描画は _renderer.tsx を通るため、404画面でもサイトのテーマ、head、ヘッダー、フッターがそのまま使われます。
押さえておくべき点は2つです。
- ステータスは必ず404のままにします。生成されるプリセットは
c.status(404)を呼びます。見た目を整えた画面を200で返してはいけません。 - 見た目はサイトのものです。マークアップ、文言、リンク、CSS はすべてサイト側で決められます。Riebeckite が上書き対象となる「既定の404コンポーネント」を用意することはありません。
404画面に到達するのは「見つからない」リクエストだけです。下書き、公開日が未来のコンテンツ、非公開のコンテンツがここへ来ることはないため、404から非公開コンテンツの存在が漏れることはありません。
実行時エラーの画面(任意)
Hono の標準のエラー処理がエラーをログに記録し、500 Internal Server Error を返すため、サイト側で何かを追加する必要はありません。訪問者向けのエラー画面をサイトのものとして用意したい場合は、HonoX の app/routes/_error.tsx(ErrorHandler)を利用できます。生成されるプリセットはこれを追加していません。設定、プラグイン、ビルドのエラーは開発者向けであり、ページに偽装せずそのまま見えるべきだからです。