Nuxt 4 + @nuxt/content + Vercel:個人ブログにおける技術選定とアーキテクチャ設計
本記事はチュートリアルではなく、 プロジェクト開始時に行った技術選定の記録です。
このブログの目的は UI の実験やフレームワーク学習ではなく、 長期的に文章と技術知見を蓄積するためのプラットフォームを構築することです。
アーキテクチャの観点から見ると、本ブログは典型的な content-driven site(コンテンツ駆動型サイト)です。
目的は、コンテンツ制作・パフォーマンス・運用コストの 長期的なバランスを維持することにあります。
そのため技術選定では以下を重視しました:
- 長期的な保守性
- Content-first な設計
- 低い運用コスト
🧭 技術スタック概要
- Framework: Nuxt 4
- Content: @nuxt/content
- UI: @nuxt/ui + Tailwind
- i18n: @nuxtjs/i18n
- Image: @nuxt/image + build metadata
- Deploy: Vercel
- Analytics:Google Analytics (GA4)
🚀 なぜ Nuxt 4 なのか
SSG と比較すると、 継続的に更新される developer blog において SSR はより安定した初期表示性能と SEO を提供します。
主な理由:
- SSR が標準で統合されている
- ルーティングとレイアウトが規約ベース
- コンテンツ・画像・i18n との高い統合性
📝 @nuxt/content を採用した理由
ブログは本質的にコンテンツプロダクトです。
重視した点:
- Markdown 執筆体験
- Git 管理
- 多言語コンテンツ管理
この構成は static-first architecture に近く、 Strapi や Contentful のような Headless CMS の 運用コストを回避できます。
🎨 UI レイヤー
- 一貫性を優先
- 必要に応じてカスタマイズ
@nuxt/ui が基盤コンポーネントを提供し、 Tailwind がデザイン調整を担います。
🌍 i18n をアーキテクチャの中核へ
初期段階から多言語対応(zh / ja / en)を前提に設計。
利点:
- ルーティングと言語構造の一致
- locale ベースのコンテンツ管理
- UI と記事の独立進化
🖼 画像最適化戦略
画像はパフォーマンス上の主要リスクです。
二層構成:
- @nuxt/image による表示最適化
- ビルド時のメタデータ生成
事前にサイズを定義することで Cumulative Layout Shift(CLS)を効果的に削減できます。
☁️ Vercel でのデプロイ
理由:
- Nuxt との高い親和性
- Preview 環境
- 低運用コスト
📊 Analytics:Google Analytics (GA4)
コンテンツサイトを継続的に改善していくためには、 フィードバックループの存在が欠かせません。 アクセス解析ツールとしては、 デプロイプラットフォームに付属する分析機能ではなく、 Google Analytics (GA4) を採用しています。
主な理由は次の3つです。
- コンテンツサイトの分析において GA4 はより成熟しており、取得できるデータの粒度も豊富である
- アクセスデータを長期間保存でき、コンテンツの傾向を継続的に観察できる
- プラットフォームと疎結合であり、特定のホスティングサービスに依存しない
個人ブログにおいて、実際に必要な分析内容はそれほど複雑ではありません。
- どの記事が継続的に読まれているのか
- ユーザーは主にどの国・地域からアクセスしているのか
- どのテーマのコンテンツに関心が集まっているのか
GA4 はイベントベースのデータモデルを採用しており、 従来のアクセス解析よりも構造は複雑ですが、 ブログのようなサイトでは基本的なページビュー計測だけでも十分な分析が可能です。
Nuxt プロジェクトへの GA4 の導入も比較的簡単で、
nuxt-gtag モジュールを利用すればアプリケーションレベルで統一的に組み込むことができます。
// nuxt.config.ts
export default defineNuxtConfig({
modules: ["nuxt-gtag"],
gtag: {
id: "G-XXXXXXXXXX",
},
});
⚖️ トレードオフ
- 依存関係の更新管理
- 多言語運用コスト
✅ 結論
本構成は developer blog architecture の実践例であり、 技術的な複雑さではなく、 長期的なコンテンツ生成を支えることを目的としています。