記事をサイトに反映する流れ
Astroは標準で、ビルド時に各ページのHTMLを作る「静的生成」を使います。 このブログも、ビルド時にNotCMSから記事を取得してページを作ります。 読者には作成済みのHTMLを配信するため、アクセスのたびに記事を取得する必要がありません。 記事を更新して公開するまでの流れは次のとおりです。- Notionで記事を書く・編集する。
- 変更をNotCMSに同期する。
- Astroのサイトをビルドし、デプロイする。
ブログの一覧を作る
まず、Notionのデータベースから公開する記事を選びます。 たとえばpublished というチェックボックスを用意すると、チェックを入れた記事だけを一覧に出せます。
以下の nc は、NotCMSの初期設定で生成する、記事を取得するためのクライアントです。
例ではNotCMSに同期したデータベースを blog と呼んでいます。自分のデータベース名に置き換えてください。
これらのコードは、.astro ファイルのフロントマター(冒頭の --- で囲まれた部分)に書きます。
posts をAstroのテンプレートで繰り返し表示すれば、記事一覧になります。
記事のタイトルは post.title、詳細ページへのリンクには post.id を使えます。
記事の詳細ページを作る
一覧の次は、記事を読むためのページを作ります。src/pages/blog/[id].astro を用意すると、記事のIDごとに /blog/記事のID というURLを作れます。
Astroに作成するURLを伝えるのが getStaticPaths です。公開記事の一覧から、各記事のIDを渡します。
src/pages/blog/[id].astro では、そのIDから本文を含むページを取得します。
本文と画像を表示する
post.content にはMarkdownが入ります。サイトに合ったMarkdownレンダラーを選び、
生成したHTMLをサニタイズして表示します。実行サンプルでは、レンダラーを決める前でも取得を試せるよう、
エスケープしたテキストを表示しています。
Notionに cover というファイル&メディアのプロパティを用意すると、カバー画像も取得できます。
先頭の画像を表示する例です。
ビルドを待たずに記事を更新したい場合
アクセスのたびにNotCMSから記事を取得する「オンデマンドレンダリング」も選べます。 この方式では、NotCMSへの同期後、サイト全体を再ビルドせずに更新を反映できます。 配備先に合うAstroアダプターが必要です。 たとえば/blog/hello-world のようなURLなら、テキストの slug プロパティから
getFirst({ where: { slug, published: true } }) で記事を探せます。
詳しくは1件のページ取得を参照してください。
公開・運用時に確認すること
公開・運用時に確認すること
- 認証情報はサーバー側だけで扱います。静的生成ではビルド環境、オンデマンドでは配備先の実行環境にも設定します。環境変数の設定とサンプルを参照してください。
- 公開条件は一覧と詳細の両方に適用します。フィルターはワークスペースのキーが読める範囲を制限しません。その利用者へ提供するコンテンツだけを同期してください。メディアのURLは公開URLです。
- slugは記事ごとに一意にし、変更するときは旧URLからのリダイレクトを用意します。
- オンデマンドでは、記事が見つからない場合は404、APIの取得失敗はサービスエラーとして扱います。
Notionのプロパティを変更したら
Notionのプロパティを変えたら、同期完了後にnpx notcms pull を実行し、生成された型を確認します。
CIでのスキーマ確認を使うと、次のデプロイまでにずれを見つけられます。