PractiX Code Lab

【実践】NewtからmicroCMSへNext.jsブログを移行した全記録と解決策

Share this post

🚪はじめに

こんにちは、管理人のTKGです。

当ブログ「PractiX Code Lab」は、これまでヘッドレスCMSの Newt を利用してきましたが、Newtのサービス終了に伴い、無料でも利用できるAPI上限が拡大した microCMS へ移行することを決定しました。

今回の移行は単なるデータ引っ越しではなく、両サービスのAPI設計思想の違いに起因するビルドエラーやテキスト崩れとの戦い――その全記録を共有します。
実際にNewtから引っ越しを検討されている方の参考になれば幸いです。


🗺️移行の全体像と戦略

  1. 計画・分析 – Newtで管理していた「記事/著者/タグ」3モデルの構造を完全に洗い出す
  2. 設計 – microCMSの機能(コンテンツ参照・オブジェクトフィールドなど)を活かし、APIスキーマを再設計
  3. 実装/lib/microcms.ts を“変換アダプター”として実装し、フロントエンドUIの変更を最小化
  4. データ移行 – 記事16件はコンテンツ品質を見直しつつ手動再登録、タグはCSV変換スクリプトで一括登録
  5. テスト&デプロイ – Vercelのプレビューデプロイで最終確認し、安全に本番へマージ

🧱直面した壁と乗り越え方

壁1:API仕様の微妙な違い(ビルドエラー祭り)

症状

  • npm run dev では正常でも、npm run build でTypeScript型エラーが多発

主な原因

  • ページネーションが skip ではなく offset
  • OR検索が専用キーではなく filters パラメータで指定
  • idtotalCount などレスポンスに含まれるプロパティの型定義漏れ

解決策

  • ビルドエラーと公式ドキュメントを突き合わせ、クエリ形式と型定義を修正
  • microcms-js-sdk の公式型(MicroCMSQueries など)を積極活用

学び

ビルドエラーはAPI仕様の理解不足を炙り出すレッドフラッグ。公式ドキュメントこそが常に信頼できる唯一の情報源。


壁2:最大の難関 ― リッチテキストの表示崩れ

症状

  • microCMSのリッチテキストに入力したMarkdown見出し(##)やテーブル(|)が、スタイル適用されずただの文字列として表示

原因究明

  • DevToolsで確認すると、APIが <h2> を返さず <p>## 見出し</p> のようにMarkdownを文字列のまま返却していた

解決策:Markdown-Firstへの転換

  1. CMS側 – リッチテキストをやめ、本文フィールドを 複数行テキスト に変更
  2. コンテンツ – 純粋なMarkdownをそのまま入力
  3. フロントreact-markdown + remark-gfm でMarkdownをHTMLへ変換・描画

学び

CMSのリッチテキストは便利な一方、意図しないデータ形式を生むリスクもある。Markdown-First はシンプルで堅牢、かつ保守コストが低い。


壁3:Next.js App Routerの静的生成の罠

症状

  • 本番デプロイ後、新規記事を追加してもページネーションの2ページ目で404

原因

  • generateStaticParamsdynamicParams = false の組み合わせで、ビルド時に存在しなかったページが拒否されていた

解決策

  • dynamicParams = true へ設定し、アクセス時に動的生成を許可

✏️まとめ

  • API差分は“アダプター”で吸収
  • Markdown-First でリッチテキスト問題を根本解決
  • ビルドエラーは理解不足を教えてくれるサイン

これらの教訓を経て、当ブログはより堅牢で運用しやすい技術基盤へ進化しました。この記事が、同じようにCMS移行に挑戦する誰かの助けになれば幸いです。


📎関連リンク


🏁おわりに

ヘッドレスCMSの移行は簡単ではありませんが、その過程には技術的な学びが詰まっています。この記事があなたの次のチャレンジへの道標になれば嬉しいです。

それでは、また!

Share this post