perf: fallback: 'blocking' とISRでNotion APIの呼び出し回数を削減 - #201
Open
Riku-0801 wants to merge 1 commit into
Open
Conversation
ブログの動的ルート([id]/tag/writer)はビルド時に全パスを事前生成しており、 記事数に比例してNotion APIを大量に呼び出していた(各記事でgetBlocks/getPage/ getArticlesを実行)。6時間ごとの定期ビルドでこれが繰り返されていた。 - 動的ルートのgetStaticPathsをpaths:[] + fallback:'blocking'に変更し、 リクエスト時のオンデマンド生成 + ISR(revalidate: 1時間)でキャッシュ - blog/[id]では公開記事一覧を存在確認とおすすめ記事で使い回し、 重複していたgetArticles呼び出しを削減。非公開/存在しないIDは404に - tag/writerは公開記事が無い場合に404を返すよう変更 - Notionを参照する静的ページ(top/products/achievements/blog)にも revalidateを付与しISR化 - fallback:'blocking'ではgetStaticPropsがリクエスト時(サーバーレス)で 実行されpublic/へ書き込めないため、createOGPImage/cacheRemoteImageの ファイル書き込みをガードし、失敗時はビルド時生成物/元URLにフォールバック Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
関連issue
なし(
fallback: 'blocking'でNotion API呼び出しを削減する依頼)やったこと
背景・課題
ブログの動的ルート(
blog/[id]/blog/tag/[tag]/blog/writer/[writer])がgetStaticPathsで全パスを事前生成しており、記事数に比例してNotion APIを大量に呼び出していました。特にblog/[id]は記事ごとにgetBlocks/getPage/getArticles(おすすめ用にDB全件クエリ)を実行します。さらに.github/workflows/build.ymlで6時間ごとに全ビルドが走るため、この呼び出しが繰り返されていました。変更内容
fallback: 'blocking'化:getStaticPathsを{ paths: [], fallback: "blocking" }に変更。ビルド時の事前生成をやめ、リクエスト時にオンデマンド生成 → ISR(revalidate: 3600= 1時間)でキャッシュ。tag / writer のgetStaticPathsから不要になったgetDatabase呼び出しも削除。blog/[id]の重複クエリ削減:公開記事一覧(getArticles())を「記事の存在確認」と「おすすめ記事」で使い回し、重複していたgetArticles呼び出しを1回に集約。fallback: 'blocking'では任意のIDでアクセスされ得るため、公開記事に含まれないID(非公開・存在しない・公開日前)はnotFoundで404に。top/products/achievements/blog(一覧) にもrevalidateを付与。fallback: 'blocking'ではgetStaticPropsがリクエスト時(Vercelのサーバーレス=読み取り専用FS)で実行され、public/への書き込みやフォント読み込みに失敗します。createOGPImage/cacheRemoteImageのファイル操作をtry/catchで保護し、失敗時はビルド時生成物のパス(CDN配信)/元のNotion URLにフォールバックしてページ生成を継続するようにしました。revalidateを1時間にしているのはNotion画像URLの有効期限(約1時間)と揃える意図もあります。revalidateの値はsrc/constants/index.tsのISR_REVALIDATE_SECONDSに集約。効果
確認事項 / レビュー観点
tsc --noEmit/next lintともにエラーなし。revalidateの間隔(現状1時間)は運用に合わせて調整可能です。ISR_REVALIDATE_SECONDS一箇所で変更できます。.prettierrc.jsのparser: "typescript" | "scss"は不正値(JS評価で0)になっておりprettierがエラーになります。本PRの対象外のため未修正ですが、別途修正推奨です。🤖 Generated with Claude Code