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 D1 | CMS、動的コンテンツ |
このプロジェクトは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.tsでtype: "sqlite"が指定されているため、一度も使われていない。
削除しても何も壊れない。Cloudflareのダッシュボードから該当のD1データベースも削除可能。
まとめ
| 項目 | 誤解 | 事実 |
|---|---|---|
| D1データベース | 使っている | 使っていない |
| wrangler.tomlのD1設定 | 必要 | 不要(削除可) |
| SQLiteダンプ | D1にデプロイされる | JSとしてバンドルされる |
| 本番でのクエリ実行 | D1で実行 | Worker内JS(SSR)or ブラウザWASM(静的) |
| Nuxt Contentに必須 | D1が必要 | 静的生成なら不要 |
関連ドキュメント
- ページ遷移が遅い問題:SSR vs SSG の選択ミス - この発見のきっかけとなった問題