• #nuxt
  • #nuxt-content
  • #D1
  • #sqlite
  • #cloudflare
  • #architecture

Nuxt Content v3:D1データベースは本当に必要なのか?

問い

Nuxt Contentはcontent/ディレクトリにMarkdownを置くと、自動で.data/content/contents.sqliteにデータが格納される。このSQLiteをD1に同じような形でデプロイしているという理解だった。したがってNuxt Contentでアプリケーションを作る上ではD1は必須という認識だったが、そうではないのか?


答え(結論)

D1は使われていない。wrangler.tomlの設定は死んでいる。

現在のnuxt.config.tsの設定:

content: {
  database: {
    type: "sqlite"   // ← "d1"ではない
  }
}

D1を使うにはtype: "d1"と明示的に指定する必要がある。type: "sqlite"の場合、SQLiteダンプはJavaScriptファイルとしてバンドルされ、D1は一切使われない。


詳細解説

Nuxt Content v3 の2つのモード

モード設定データの場所用途
静的モードtype: "sqlite"JSバンドル内ブログ、ドキュメント
動的モードtype: "d1"Cloudflare D1CMS、動的コンテンツ

このプロジェクトはtype: "sqlite"なので静的モード


データフロー:開発時

content/2025-12-05/article.md
         ↓
    Nuxt Content がパース
         ↓
.data/content/contents.sqlite  ← ローカルSQLite(開発専用)
         ↓
    開発サーバーがクエリ実行

ここまでは正しい理解。


データフロー:ビルド時

.data/content/contents.sqlite
         ↓
    ビルドプロセス
         ↓
.nuxt/content/database.compressed.mjs  ← SQLiteをJSに変換
         ↓
dist/_nuxt/xxxxx.js として含まれる

重要:D1にはデプロイされない。JSファイルとしてバンドルされる。


データフロー:本番環境(現状 = SSR)

ユーザーがページにアクセス
         ↓
Cloudflare Worker起動
         ↓
database.compressed.mjs を読み込み
         ↓
Worker内メモリでSQLiteクエリ実行  ← D1ではない!
         ↓
SSRでHTML生成
         ↓
クライアントに返却

D1データベースには一切アクセスしていない。


データフロー:本番環境(静的生成 = あるべき姿)

【ビルド時】
database.compressed.mjs
         ↓
全ページのHTMLを事前生成
         ↓
dist/blog/index.html
dist/2025-12-05/article/index.html
...

【ランタイム】
初回アクセス → CDNから静的HTML配信(10-50ms)

クライアントサイドナビゲーション
         ↓
ブラウザ内のWASM SQLiteがクエリ実行  ← ブラウザで動く!
         ↓
Vue Routerでページ遷移

静的生成でもqueryCollection()は動作する。ブラウザ内のWASM SQLiteで。


D1を使う場合の設定(参考)

もしD1を使いたい場合は、以下のように設定する:

// nuxt.config.ts
content: {
  database: {
    type: 'd1',      // ← d1を明示的に指定
    binding: 'DB'    // ← wrangler.tomlのbinding名と一致させる
  }
}
# wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "nuxt-content-db"
database_id = "your-database-id"

この設定の場合、ビルド時にD1へデータがマイグレーションされ、ランタイムでD1にクエリを発行する。

しかし、純粋なブログサイトにはオーバースペック。


wrangler.toml の D1 設定は削除してよいか?

削除してよい。

現在の設定:

# wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "nuxt-content-db"
database_id = "a7eeae1d-68ea-4358-a6ba-49414e011b18"

これはnuxt.config.tstype: "sqlite"が指定されているため、一度も使われていない

削除しても何も壊れない。Cloudflareのダッシュボードから該当のD1データベースも削除可能。


まとめ

項目誤解事実
D1データベース使っている使っていない
wrangler.tomlのD1設定必要不要(削除可)
SQLiteダンプD1にデプロイされるJSとしてバンドルされる
本番でのクエリ実行D1で実行Worker内JS(SSR)or ブラウザWASM(静的)
Nuxt Contentに必須D1が必要静的生成なら不要

関連ドキュメント