Bochi

Bochi開発:投稿が反映されなかった原因とNext.js静的ビルドの話

1

個人開発をしている皆さん、そしてBochiを使ってくれている(かもしれない)皆さん、こんにちは

Bochiは、エンジニアが日々の機能開発やプロダクト作成での挑戦、失敗、学びを記録するためのサービスです。

「よし、ほぼ完成だ!」と意気揚々と自分で最初の投稿をしてみた瞬間。 「これで僕の挑戦も記録されたぞ」とトップページを開くと…あれ?

「いつになっても自分の記事がトップページに表示されない」

ローカル環境ではあんなに完璧に動いていたのに…。 この記事では、個人開発で多くの人が(僕も含めて)ぶつかる**「開発環境と本番環境の違い」**という大きな壁と、その乗り越え方について、実体験を交えてお話しします。


2. 調査と仮説:なぜ「aaaa」が消えない?

最初に疑ったのは、お決まりの「ブラウザキャッシュ」です。

「またキャッシュか」と、開発者ツールを開いては何度もキャッシュを削除し、スーパーリロード(Cmd+Shift+R)を繰り返しました。

しかし、結果は変わらず。 それどころか、ビルド前にテストで入れておいた「aaaa」という記事がゾンビのように表示され続けます。

(正直、この時の心境は「なんで!?」「もう嫌だ…」という焦りでいっぱいでした。)


3. 原因特定:コード比較で見えた光 ✨

キャッシュでないなら、次はデータそのものです。 DBに使っているSupabaseの管理画面を恐る恐る確認しました。

すると、投稿データは正しくDBに保存されていました。

データはある。でも表示されない。 この時点で、「これはNext.jsのビルド方式(静的/動的)が怪しい」という仮説が浮かびました。

【解決の鍵】は、正常に動いている「記事一覧(articles)ページ」のコードと、問題の「トップページ」のコードを比較することでした。

両方の page.tsx を見比べると、原因はすぐに分かりました。 トップページのファイルに、たった一行、書かれているべきコードが書き忘れられていたのです。


4. 解決策:なぜISRではなくSSRを選んだか 🚄

根本的な原因は、トップページに export const dynamic = 'force-dynamic'; の一行がなかったことでした。

これがなかったため、意図せずトップページが「静的ビルド(SSG)」になっており、Vercelにデプロイした「ビルド時」の古いHTML(あの「aaaa」が書かれたページ)が表示され続けていたのです。

ローカル環境(next dev)では、すべてのページがリクエストごとにレンダリングされる(SSRのように振る舞う)ため、この問題に気づけませんでした。

解決コード

// Before: (コードなし、またはデフォルト)
// Next.jsはこれを静的ページ(SSG)と判断し、
// ビルド時のデータでHTMLを生成していた。

// After: ファイルの先頭に追加
export const dynamic = 'force-dynamic';

// これで、このページは毎リクエストごとに
// サーバーで動的レンダリング(SSR)されるよう強制する。

なぜISRではない?

Next.jsにはISR(Incremental Static Regeneration)という、一定時間ごとにページを再生成する仕組みもあります。 export const revalidate = 60; (60秒ごとに再生成)のように。

これも検討しましたが、Bochiのサービス体験として「投稿したらすぐに反映されてほしい」というUX(ユーザー体験)を最優先しました。 そのため、毎リクエストごとに最新のデータを取得・描画する動的レンダリング(SSR)を採用しました。


5. 結論:今回の挑戦で得た学び 📚

今回の挑戦で得た学びは、非常にシンプルかつ重要なものでした。

  1. 「"開発環境と本番環境は違う"という言葉の重みを痛感した」
  2. 「Next.jsのビルド方式を曖昧に理解したまま進めてはいけない」

当たり前のことですが、「公開前(デプロイ後)の本番環境での動作確認は絶対に大事」という基本に立ち返るきっかけとなりました。

もし今、この記事を読んでいるあなたが「なんかおかしくないか?」と焦っていたら、まずは深呼吸して、「正常に動いている部分」と「問題の部分」のコードを徹底的に比較してみてください。

また、一人で抱え込まず、ChatGPTのようなAIに「こういう問題が起きてるんだけど、何が考えられる?」と壁打ちしてみるのも、非常に有効なデバッグ手段です。


6. 挑戦の記録を、Bochiで。

Bochiは、まさに僕が今書いたような、日々の「挑戦の記録」や「失敗からの学び」を投稿するためのサービスです。

皆さんの挑戦も、ぜひBochiで記録してみてください。

(ここにBochiのサービスURLを記載)