サンプル
リポジトリの examples/ には、3つのサンプルプロジェクトがあります。 どれも1つの Notion データベースから同じサイトを作ります。 データベースをテーブルで表示するトップページと、行ごとに本文を表示するページです。 違うのはフレームワークだけです。
| サンプル | フレームワーク | データを取得する場所 |
|---|---|---|
| nextjs-approuter | Next.js App Router | サーバーコンポーネント、generateStaticParams、generateMetadata |
| nextjs-pagerouter | Next.js Pages Router | getStaticProps、getStaticPaths |
| astro | Astro と @astrojs/react | .astro のフロントマター、getStaticPaths |
データベースの準備
次のプロパティを持つ Notion のデータベースを作り、本文のある行をいくつか追加して、インテグレーションを接続します(はじめかたを参照)。
| プロパティ | 種類 |
|---|---|
Title | タイトル |
Tags | マルチセレクト |
Date | 日付 |
名前は一致させる必要があります。
サンプルは keys に ['Title', 'Tags', 'Date'] を渡し、Title の列を /[id] にリンクしています。
サンプルの実行
どのサンプルも2つの変数を使います。
Rotion が読む NOTION_TOKEN と、サンプルのコードが読む NOTION_DATABASE_ID です。
Next.js のサンプルは、これらを .env.local から読み込みます。
cd examples/nextjs-approuter
cat > .env.local <<'EOF'
NOTION_TOKEN=ntn_xxxxxxxxxxxxxxxxxxxxxxxx
NOTION_DATABASE_ID=668d797c76fa49349b05ad288df2d136
EOF
npm install
npm run devnpm run build を実行すると、静的エクスポートが out/ に書き出されます。
サンプルは rotion をリポジトリではなく npm からインストールします。
ローカルでビルドした Rotion を npm pack で試す方法は、各サンプルの README にあります。
nextjs-approuter
app/compornents/ClientLink.tsxが、createClientLinkでnext/linkを包みます。app/page.tsxは、サーバーコンポーネントでデータベースを取得し、<Table>を包む小さなクライアントコンポーネントを通じて描画します。href: { Title: '/[id]' }とクライアント用のリンクを渡しています。app/compornents/Header.tsxは非同期のサーバーコンポーネントで、タイトルを得るために同じデータベースをもう一度取得します。2回目の呼び出しはキャッシュから返ります。app/[id]/page.tsxは、generateStaticParamsで行を列挙し、各ページをFetchPage({ page_id, last_edited_time: 'force' })で、ブロックをページのlast_edited_timeを渡して取得します。タイトルはpage.metaから読み、page.icon?.srcをnext/imageで表示します。app/layout.tsxはrotion/style-without-dark.cssを import しています。next.config.tsはoutput: 'export'とimages.unoptimizedを指定しています。
手順の解説は App Router にあります。
nextjs-pagerouter
pages/index.tsxは、getStaticPropsでデータベースを取得し、next/linkをそのままlinkに渡して<Table>を描画します。pages/[id].tsxは、getStaticPathsでfallback: falseとともにすべての行を返し、getStaticPropsでページとデータベースを並行して取得してから、ブロックを取得します。pages/_app.tsxはrotion/style.cssを import しているので、このサンプルはシステムのダークモードに従います。
手順の解説は Pages Router にあります。
astro
src/pages/index.astroは、フロントマターでデータベースを取得し、React の<Table>のラッパーを描画します。src/pages/[id].astroは、getStaticPathsですべての行を返し、各ページとそのブロックを取得します。src/components/NotionPage.tsxは<Page>を包みます。ページは React のコンポーネントをclient:loadでハイドレートします。astro.config.mjsは React のインテグレーションを追加し、output: 'static'を指定しています。
Astro のサンプルは、変数を .env から import.meta.env を通じて読みます。
cd examples/astro
cat > .env <<'EOF'
NOTION_TOKEN=ntn_xxxxxxxxxxxxxxxxxxxxxxxx
NOTION_DATABASE_ID=668d797c76fa49349b05ad288df2d136
EOF
npm install
npm run devRotion 自身は、import された時点で process.env から NOTION_TOKEN を読みます。
サンプルのページは、import.meta.env の値を process.env にコピーしています。
ビルドを実行するシェルで変数を設定すれば(NOTION_TOKEN=... npm run build)、Astro が .env をどう読み込むかにかかわらず Rotion に値が渡ります。
開発サーバーは http://localhost:4321 で動き、npm run build はサイトを dist/ に書き出します。