[{"data":1,"prerenderedAt":2704},["ShallowReactive",2],{"content-/nuxt-content-sqlite-architecture":3,"all-pages-for-dir":2681,"related-/nuxt-content-sqlite-architecture":2682,"og-image-/nuxt-content-sqlite-architecture":2703},{"id":4,"title":5,"body":6,"category":2670,"concepts":2670,"description":2671,"extension":501,"meta":2672,"navigation":212,"ogImage":2670,"path":2673,"project_name":2670,"published":2674,"publishedAt":2675,"seo":2676,"source":2670,"stem":2677,"tags":2678,"todo":2670,"unpublished":2674,"updatedAt":2670,"__hash__":2680},"pages/2025-10/2025-10-02/nuxt-content-sqlite-architecture.md","Nuxt Content の SQLite アーキテクチャ解説",{"type":7,"value":8,"toc":2629},"minimark",[9,13,18,27,55,64,68,73,78,89,94,100,104,107,390,395,412,416,628,632,636,642,646,651,810,815,821,824,827,832,994,999,1044,1047,1050,1106,1116,1120,1124,1143,1147,1205,1208,1249,1252,1257,1307,1312,1345,1350,1365,1368,1371,1458,1461,1464,1498,1503,1514,1518,1784,1787,2010,2013,2017,2088,2092,2096,2204,2209,2225,2228,2232,2464,2467,2543,2546,2550,2556,2559,2600,2603,2625],[10,11,5],"h1",{"id":12},"nuxt-content-の-sqlite-アーキテクチャ解説",[14,15,17],"h2",{"id":16},"はじめになぜ-sqlite-なのか","はじめに：なぜ SQLite なのか？",[19,20,21,22,26],"p",{},"Nuxt Content v3 では、",[23,24,25],"strong",{},"v2 のファイルベースストレージから SQLite ベースのストレージに移行","しました。この変更により、以下のメリットが得られます：",[28,29,30,37,43,49],"ul",{},[31,32,33,36],"li",{},[23,34,35],{},"I/O パフォーマンスの向上"," - ファイルシステムへの逐次アクセスから SQL クエリベースの高速検索へ",[31,38,39,42],{},[23,40,41],{},"バンドルサイズの削減"," - 必要なデータのみを効率的にロード",[31,44,45,48],{},[23,46,47],{},"エッジ環境のサポート"," - Cloudflare Workers などのサーバーレス環境での動作",[31,50,51,54],{},[23,52,53],{},"オフラインアクセス"," - ブラウザ内で WASM SQLite を使ったローカルクエリ実行",[19,56,57,58],{},"公式ドキュメント: ",[59,60,61],"a",{"href":61,"rel":62},"https://content.nuxt.com/blog/v3",[63],"nofollow",[14,65,67],{"id":66},"sqlite-データベースの構造","SQLite データベースの構造",[69,70,72],"h3",{"id":71},"_1-データベースファイルの場所","1. データベースファイルの場所",[19,74,75],{},[23,76,77],{},"開発環境：",[79,80,85],"pre",{"className":81,"code":83,"language":84},[82],"language-text",".data/content/contents.sqlite\n","text",[86,87,83],"code",{"__ignoreMap":88},"",[19,90,91],{},[23,92,93],{},"ビルド時の生成物：",[79,95,98],{"className":96,"code":97,"language":84},[82],".nuxt/content/database.compressed.mjs  # 圧縮された SQLite ダンプ\n.nuxt/content/sql_dump.txt             # SQL ダンプ（平文）\n",[86,99,97],{"__ignoreMap":88},[69,101,103],{"id":102},"_2-テーブル構造","2. テーブル構造",[19,105,106],{},"Nuxt Content は以下のテーブルを自動生成します：",[79,108,112],{"className":109,"code":110,"language":111,"meta":88,"style":88},"language-sql shiki shiki-themes vitesse-light vitesse-light","-- メタ情報テーブル\nCREATE TABLE _content_info (\n  id TEXT PRIMARY KEY,\n  ready BOOLEAN,\n  structureVersion VARCHAR,\n  version VARCHAR,\n  __hash__ TEXT UNIQUE\n);\n\n-- コレクションごとのテーブル（例：pages コレクション）\nCREATE TABLE _content_pages (\n  id TEXT PRIMARY KEY,\n  title VARCHAR,\n  body TEXT,\n  description VARCHAR,\n  extension VARCHAR,\n  meta TEXT,\n  navigation TEXT DEFAULT true,\n  path VARCHAR,\n  publishedAt DATE NULL,\n  seo TEXT DEFAULT '{}',\n  stem VARCHAR,\n  tags TEXT NULL,\n  __hash__ TEXT UNIQUE\n);\n","sql",[86,113,114,123,141,157,168,179,190,201,207,214,220,232,243,253,263,273,283,293,307,317,331,354,364,376,385],{"__ignoreMap":88},[115,116,119],"span",{"class":117,"line":118},"line",1,[115,120,122],{"class":121},"sxvE3","-- メタ情報テーブル\n",[115,124,126,130,133,137],{"class":117,"line":125},2,[115,127,129],{"class":128},"sHkkW","CREATE",[115,131,132],{"class":128}," TABLE",[115,134,136],{"class":135},"senZ8"," _content_info",[115,138,140],{"class":139},"sG7-3"," (\n",[115,142,144,147,151,154],{"class":117,"line":143},3,[115,145,146],{"class":139},"  id ",[115,148,150],{"class":149},"stQ0i","TEXT",[115,152,153],{"class":149}," PRIMARY KEY",[115,155,156],{"class":139},",\n",[115,158,160,163,166],{"class":117,"line":159},4,[115,161,162],{"class":139},"  ready ",[115,164,165],{"class":149},"BOOLEAN",[115,167,156],{"class":139},[115,169,171,174,177],{"class":117,"line":170},5,[115,172,173],{"class":139},"  structureVersion ",[115,175,176],{"class":149},"VARCHAR",[115,178,156],{"class":139},[115,180,182,185,188],{"class":117,"line":181},6,[115,183,184],{"class":128},"  version",[115,186,187],{"class":149}," VARCHAR",[115,189,156],{"class":139},[115,191,193,196,198],{"class":117,"line":192},7,[115,194,195],{"class":139},"  __hash__ ",[115,197,150],{"class":149},[115,199,200],{"class":128}," UNIQUE\n",[115,202,204],{"class":117,"line":203},8,[115,205,206],{"class":139},");\n",[115,208,210],{"class":117,"line":209},9,[115,211,213],{"emptyLinePlaceholder":212},true,"\n",[115,215,217],{"class":117,"line":216},10,[115,218,219],{"class":121},"-- コレクションごとのテーブル（例：pages コレクション）\n",[115,221,223,225,227,230],{"class":117,"line":222},11,[115,224,129],{"class":128},[115,226,132],{"class":128},[115,228,229],{"class":135}," _content_pages",[115,231,140],{"class":139},[115,233,235,237,239,241],{"class":117,"line":234},12,[115,236,146],{"class":139},[115,238,150],{"class":149},[115,240,153],{"class":149},[115,242,156],{"class":139},[115,244,246,249,251],{"class":117,"line":245},13,[115,247,248],{"class":139},"  title ",[115,250,176],{"class":149},[115,252,156],{"class":139},[115,254,256,259,261],{"class":117,"line":255},14,[115,257,258],{"class":139},"  body ",[115,260,150],{"class":149},[115,262,156],{"class":139},[115,264,266,269,271],{"class":117,"line":265},15,[115,267,268],{"class":128},"  description",[115,270,187],{"class":149},[115,272,156],{"class":139},[115,274,276,279,281],{"class":117,"line":275},16,[115,277,278],{"class":139},"  extension ",[115,280,176],{"class":149},[115,282,156],{"class":139},[115,284,286,289,291],{"class":117,"line":285},17,[115,287,288],{"class":139},"  meta ",[115,290,150],{"class":149},[115,292,156],{"class":139},[115,294,296,299,301,304],{"class":117,"line":295},18,[115,297,298],{"class":139},"  navigation ",[115,300,150],{"class":149},[115,302,303],{"class":149}," DEFAULT",[115,305,306],{"class":139}," true,\n",[115,308,310,313,315],{"class":117,"line":309},19,[115,311,312],{"class":149},"  path",[115,314,187],{"class":149},[115,316,156],{"class":139},[115,318,320,323,326,329],{"class":117,"line":319},20,[115,321,322],{"class":139},"  publishedAt ",[115,324,325],{"class":149},"DATE",[115,327,328],{"class":128}," NULL",[115,330,156],{"class":139},[115,332,334,337,339,341,345,349,352],{"class":117,"line":333},21,[115,335,336],{"class":139},"  seo ",[115,338,150],{"class":149},[115,340,303],{"class":149},[115,342,344],{"class":343},"sMJiu"," '",[115,346,348],{"class":347},"sdGka","{}",[115,350,351],{"class":343},"'",[115,353,156],{"class":139},[115,355,357,360,362],{"class":117,"line":356},22,[115,358,359],{"class":139},"  stem ",[115,361,176],{"class":149},[115,363,156],{"class":139},[115,365,367,370,372,374],{"class":117,"line":366},23,[115,368,369],{"class":139},"  tags ",[115,371,150],{"class":149},[115,373,328],{"class":128},[115,375,156],{"class":139},[115,377,379,381,383],{"class":117,"line":378},24,[115,380,195],{"class":139},[115,382,150],{"class":149},[115,384,200],{"class":128},[115,386,388],{"class":117,"line":387},25,[115,389,206],{"class":139},[19,391,392],{},[23,393,394],{},"重要なポイント：",[28,396,397,403,406],{},[31,398,399,402],{},[86,400,401],{},"content.config.ts"," で定義した各コレクションごとに、テーブルが作られる",[31,404,405],{},"フロントマターのフィールドは対応するカラムにマッピングされる",[31,407,408,411],{},[86,409,410],{},"__hash__"," は内容の整合性チェックに使用される",[69,413,415],{"id":414},"_3-実際のデータ例","3. 実際のデータ例",[79,417,419],{"className":109,"code":418,"language":111,"meta":88,"style":88},"INSERT INTO _content_pages VALUES (\n  'pages/nuxt-content-mdx-setup-guide.md',     -- id\n  'Nuxt Content + MDX サイトの初期構築手順',    -- title\n  '{\"type\":\"minimark\",\"value\":[...]}',         -- body (AST形式)\n  'Nuxt 3 と Nuxt Content を使った...',       -- description\n  'md',                                        -- extension\n  '{}',                                        -- meta\n  'true',                                      -- navigation\n  '/nuxt-content-mdx-setup-guide',             -- path\n  '2025-10-01T00:00:00.000Z',                 -- publishedAt ✅ ISO 8601形式\n  '{\"title\":\"...\",\"description\":\"...\"}',       -- seo\n  'nuxt-content-mdx-setup-guide',              -- stem\n  '[\"nuxt\",\"content\",\"mdx\",\"setup\"]',          -- tags ✅ JSON配列\n  '0usg5x4l3ZsyIKgbbuRVgu_MonHd6WwhObeEIY3Iwvg' -- __hash__\n);\n",[86,420,421,434,450,465,480,495,510,523,538,553,568,582,597,612,624],{"__ignoreMap":88},[115,422,423,426,429,432],{"class":117,"line":118},[115,424,425],{"class":128},"INSERT INTO",[115,427,428],{"class":139}," _content_pages ",[115,430,431],{"class":128},"VALUES",[115,433,140],{"class":139},[115,435,436,439,442,444,447],{"class":117,"line":125},[115,437,438],{"class":343},"  '",[115,440,441],{"class":347},"pages/nuxt-content-mdx-setup-guide.md",[115,443,351],{"class":343},[115,445,446],{"class":139},",     ",[115,448,449],{"class":121},"-- id\n",[115,451,452,454,457,459,462],{"class":117,"line":143},[115,453,438],{"class":343},[115,455,456],{"class":347},"Nuxt Content + MDX サイトの初期構築手順",[115,458,351],{"class":343},[115,460,461],{"class":139},",    ",[115,463,464],{"class":121},"-- title\n",[115,466,467,469,472,474,477],{"class":117,"line":159},[115,468,438],{"class":343},[115,470,471],{"class":347},"{\"type\":\"minimark\",\"value\":[...]}",[115,473,351],{"class":343},[115,475,476],{"class":139},",         ",[115,478,479],{"class":121},"-- body (AST形式)\n",[115,481,482,484,487,489,492],{"class":117,"line":170},[115,483,438],{"class":343},[115,485,486],{"class":347},"Nuxt 3 と Nuxt Content を使った...",[115,488,351],{"class":343},[115,490,491],{"class":139},",       ",[115,493,494],{"class":121},"-- description\n",[115,496,497,499,502,504,507],{"class":117,"line":181},[115,498,438],{"class":343},[115,500,501],{"class":347},"md",[115,503,351],{"class":343},[115,505,506],{"class":139},",                                        ",[115,508,509],{"class":121},"-- extension\n",[115,511,512,514,516,518,520],{"class":117,"line":192},[115,513,438],{"class":343},[115,515,348],{"class":347},[115,517,351],{"class":343},[115,519,506],{"class":139},[115,521,522],{"class":121},"-- meta\n",[115,524,525,527,530,532,535],{"class":117,"line":203},[115,526,438],{"class":343},[115,528,529],{"class":347},"true",[115,531,351],{"class":343},[115,533,534],{"class":139},",                                      ",[115,536,537],{"class":121},"-- navigation\n",[115,539,540,542,545,547,550],{"class":117,"line":209},[115,541,438],{"class":343},[115,543,544],{"class":347},"/nuxt-content-mdx-setup-guide",[115,546,351],{"class":343},[115,548,549],{"class":139},",             ",[115,551,552],{"class":121},"-- path\n",[115,554,555,557,560,562,565],{"class":117,"line":216},[115,556,438],{"class":343},[115,558,559],{"class":347},"2025-10-01T00:00:00.000Z",[115,561,351],{"class":343},[115,563,564],{"class":139},",                 ",[115,566,567],{"class":121},"-- publishedAt ✅ ISO 8601形式\n",[115,569,570,572,575,577,579],{"class":117,"line":222},[115,571,438],{"class":343},[115,573,574],{"class":347},"{\"title\":\"...\",\"description\":\"...\"}",[115,576,351],{"class":343},[115,578,491],{"class":139},[115,580,581],{"class":121},"-- seo\n",[115,583,584,586,589,591,594],{"class":117,"line":234},[115,585,438],{"class":343},[115,587,588],{"class":347},"nuxt-content-mdx-setup-guide",[115,590,351],{"class":343},[115,592,593],{"class":139},",              ",[115,595,596],{"class":121},"-- stem\n",[115,598,599,601,604,606,609],{"class":117,"line":245},[115,600,438],{"class":343},[115,602,603],{"class":347},"[\"nuxt\",\"content\",\"mdx\",\"setup\"]",[115,605,351],{"class":343},[115,607,608],{"class":139},",          ",[115,610,611],{"class":121},"-- tags ✅ JSON配列\n",[115,613,614,616,619,621],{"class":117,"line":255},[115,615,438],{"class":343},[115,617,618],{"class":347},"0usg5x4l3ZsyIKgbbuRVgu_MonHd6WwhObeEIY3Iwvg",[115,620,351],{"class":343},[115,622,623],{"class":121}," -- __hash__\n",[115,625,626],{"class":117,"line":265},[115,627,206],{"class":139},[14,629,631],{"id":630},"markdown-から-sqlite-へのフロー","Markdown から SQLite へのフロー",[69,633,635],{"id":634},"フェーズ-1-ビルド時のインデックス作成","フェーズ 1: ビルド時のインデックス作成",[79,637,640],{"className":638,"code":639,"language":84},[82],"┌─────────────────────────────┐\n│ 1. Markdown ファイル読み込み  │\n│    content/**/*.md           │\n└──────────────┬──────────────┘\n               │\n               │ ① ファイル監視（開発時のみ）\n               │    chokidar / Vite watch\n               ↓\n┌─────────────────────────────┐\n│ 2. フロントマター解析         │\n│    - YAML パーサー           │\n│    - BOM チェック ⚠️         │\n└──────────────┬──────────────┘\n               │\n               │ ② スキーマ検証\n               │    content.config.ts\n               ↓\n┌─────────────────────────────┐\n│ 3. Markdown → AST 変換      │\n│    - remark/rehype          │\n│    - MDX コンパイル          │\n└──────────────┬──────────────┘\n               │\n               │ ③ AST を JSON に\n               │    minimark 形式\n               ↓\n┌─────────────────────────────┐\n│ 4. SQLite テーブル生成       │\n│    - コレクション定義から     │\n│    - CREATE TABLE IF NOT EXISTS │\n└──────────────┬──────────────┘\n               │\n               │ ④ データ挿入\n               │    INSERT INTO ...\n               ↓\n┌─────────────────────────────┐\n│ 5. SQL ダンプ生成            │\n│    .nuxt/content/sql_dump.txt │\n│    database.compressed.mjs   │\n└─────────────────────────────┘\n",[86,641,639],{"__ignoreMap":88},[69,643,645],{"id":644},"フェーズ-2-ランタイムでのデータ取得","フェーズ 2: ランタイムでのデータ取得",[19,647,648],{},[23,649,650],{},"サーバーサイド（開発・本番）：",[79,652,656],{"className":653,"code":654,"language":655,"meta":88,"style":88},"language-typescript shiki shiki-themes vitesse-light vitesse-light","// apps/web/app/pages/[...slug].vue\nconst { data: doc } = await useAsyncData(\n  () => `content-${docPath.value}`,\n  () => queryCollection(\"pages\")\n       .path(docPath.value)\n       .first()\n);\n\n// ↓ 内部処理\n// 1. .data/content/contents.sqlite を開く\n// 2. SELECT * FROM _content_pages WHERE path = '/xxx'\n// 3. 結果を ParsedContent 型で返す\n","typescript",[86,657,658,663,697,731,754,772,782,786,790,795,800,805],{"__ignoreMap":88},[115,659,660],{"class":117,"line":118},[115,661,662],{"class":121},"// apps/web/app/pages/[...slug].vue\n",[115,664,665,668,672,676,679,682,685,688,691,694],{"class":117,"line":125},[115,666,667],{"class":149},"const ",[115,669,671],{"class":670},"shFtX","{",[115,673,675],{"class":674},"s4oTP"," data",[115,677,678],{"class":670},":",[115,680,681],{"class":674}," doc",[115,683,684],{"class":670}," }",[115,686,687],{"class":670}," =",[115,689,690],{"class":128}," await",[115,692,693],{"class":135}," useAsyncData",[115,695,696],{"class":670},"(\n",[115,698,699,702,705,708,711,714,717,720,723,726,729],{"class":117,"line":143},[115,700,701],{"class":670},"  ()",[115,703,704],{"class":670}," =>",[115,706,707],{"class":343}," `",[115,709,710],{"class":347},"content-",[115,712,713],{"class":128},"${",[115,715,716],{"class":347},"docPath",[115,718,719],{"class":670},".",[115,721,722],{"class":347},"value",[115,724,725],{"class":128},"}",[115,727,728],{"class":343},"`",[115,730,156],{"class":670},[115,732,733,735,737,740,743,746,749,751],{"class":117,"line":159},[115,734,701],{"class":670},[115,736,704],{"class":670},[115,738,739],{"class":135}," queryCollection",[115,741,742],{"class":670},"(",[115,744,745],{"class":343},"\"",[115,747,748],{"class":347},"pages",[115,750,745],{"class":343},[115,752,753],{"class":670},")\n",[115,755,756,759,762,764,766,768,770],{"class":117,"line":170},[115,757,758],{"class":670},"       .",[115,760,761],{"class":135},"path",[115,763,742],{"class":670},[115,765,716],{"class":674},[115,767,719],{"class":670},[115,769,722],{"class":674},[115,771,753],{"class":670},[115,773,774,776,779],{"class":117,"line":181},[115,775,758],{"class":670},[115,777,778],{"class":135},"first",[115,780,781],{"class":670},"()\n",[115,783,784],{"class":117,"line":192},[115,785,206],{"class":670},[115,787,788],{"class":117,"line":203},[115,789,213],{"emptyLinePlaceholder":212},[115,791,792],{"class":117,"line":209},[115,793,794],{"class":121},"// ↓ 内部処理\n",[115,796,797],{"class":117,"line":216},[115,798,799],{"class":121},"// 1. .data/content/contents.sqlite を開く\n",[115,801,802],{"class":117,"line":222},[115,803,804],{"class":121},"// 2. SELECT * FROM _content_pages WHERE path = '/xxx'\n",[115,806,807],{"class":117,"line":234},[115,808,809],{"class":121},"// 3. 結果を ParsedContent 型で返す\n",[19,811,812],{},[23,813,814],{},"クライアントサイド（ブラウザ）：",[79,816,819],{"className":817,"code":818,"language":84},[82],"1. 初回クエリ時に database.compressed.mjs をダウンロード\n2. WASM SQLite でブラウザ内 DB を初期化\n3. 以降のクエリはサーバーを介さずローカルで実行\n   → ページ遷移が爆速 ⚡\n",[86,820,818],{"__ignoreMap":88},[14,822,823],{"id":823},"ファイル監視と自動更新のメカニズム",[69,825,826],{"id":826},"開発環境での動作",[19,828,829],{},[23,830,831],{},"Nuxt Content の HMR（Hot Module Replacement）：",[79,833,837],{"className":834,"code":835,"language":836,"meta":88,"style":88},"language-javascript shiki shiki-themes vitesse-light vitesse-light","// 1. Vite の File Watcher が Markdown 変更を検知\n//    → content/**/*.md\n\n// 2. Nuxt Content のビルドプラグインが起動\n//    @nuxt/content/dist/runtime/server/storage/builder\n\n// 3. 変更ファイルを再パース\n//    - フロントマター解析\n//    - AST 生成\n//    - __hash__ 計算\n\n// 4. SQLite の該当レコードを UPDATE\nUPDATE _content_pages\nSET title = ?, body = ?, publishedAt = ?, __hash__ = ?\nWHERE id = 'pages/xxx.md';\n\n// 5. 整合性チェック\n//    - _content_info.ready を false → true に更新\n\n// 6. WebSocket で HMR イベント送信\n//    → ブラウザがリロード\n","javascript",[86,838,839,844,849,853,858,863,867,872,877,882,887,891,896,904,946,966,970,975,980,984,989],{"__ignoreMap":88},[115,840,841],{"class":117,"line":118},[115,842,843],{"class":121},"// 1. Vite の File Watcher が Markdown 変更を検知\n",[115,845,846],{"class":117,"line":125},[115,847,848],{"class":121},"//    → content/**/*.md\n",[115,850,851],{"class":117,"line":143},[115,852,213],{"emptyLinePlaceholder":212},[115,854,855],{"class":117,"line":159},[115,856,857],{"class":121},"// 2. Nuxt Content のビルドプラグインが起動\n",[115,859,860],{"class":117,"line":170},[115,861,862],{"class":121},"//    @nuxt/content/dist/runtime/server/storage/builder\n",[115,864,865],{"class":117,"line":181},[115,866,213],{"emptyLinePlaceholder":212},[115,868,869],{"class":117,"line":192},[115,870,871],{"class":121},"// 3. 変更ファイルを再パース\n",[115,873,874],{"class":117,"line":203},[115,875,876],{"class":121},"//    - フロントマター解析\n",[115,878,879],{"class":117,"line":209},[115,880,881],{"class":121},"//    - AST 生成\n",[115,883,884],{"class":117,"line":216},[115,885,886],{"class":121},"//    - __hash__ 計算\n",[115,888,889],{"class":117,"line":222},[115,890,213],{"emptyLinePlaceholder":212},[115,892,893],{"class":117,"line":234},[115,894,895],{"class":121},"// 4. SQLite の該当レコードを UPDATE\n",[115,897,898,901],{"class":117,"line":245},[115,899,900],{"class":674},"UPDATE",[115,902,903],{"class":674}," _content_pages\n",[115,905,906,909,912,914,917,920,923,925,927,929,932,934,936,938,941,943],{"class":117,"line":255},[115,907,908],{"class":674},"SET",[115,910,911],{"class":674}," title",[115,913,687],{"class":670},[115,915,916],{"class":149}," ?",[115,918,919],{"class":670},",",[115,921,922],{"class":674}," body",[115,924,687],{"class":670},[115,926,916],{"class":149},[115,928,919],{"class":670},[115,930,931],{"class":674}," publishedAt",[115,933,687],{"class":670},[115,935,916],{"class":149},[115,937,919],{"class":670},[115,939,940],{"class":674}," __hash__",[115,942,687],{"class":670},[115,944,945],{"class":149}," ?\n",[115,947,948,951,954,956,958,961,963],{"class":117,"line":265},[115,949,950],{"class":674},"WHERE",[115,952,953],{"class":674}," id",[115,955,687],{"class":670},[115,957,344],{"class":343},[115,959,960],{"class":347},"pages/xxx.md",[115,962,351],{"class":343},[115,964,965],{"class":139},";\n",[115,967,968],{"class":117,"line":275},[115,969,213],{"emptyLinePlaceholder":212},[115,971,972],{"class":117,"line":285},[115,973,974],{"class":121},"// 5. 整合性チェック\n",[115,976,977],{"class":117,"line":295},[115,978,979],{"class":121},"//    - _content_info.ready を false → true に更新\n",[115,981,982],{"class":117,"line":309},[115,983,213],{"emptyLinePlaceholder":212},[115,985,986],{"class":117,"line":319},[115,987,988],{"class":121},"// 6. WebSocket で HMR イベント送信\n",[115,990,991],{"class":117,"line":333},[115,992,993],{"class":121},"//    → ブラウザがリロード\n",[19,995,996],{},[23,997,998],{},"確認できるログ：",[79,1000,1004],{"className":1001,"code":1002,"language":1003,"meta":88,"style":88},"language-bash shiki shiki-themes vitesse-light vitesse-light","# .nuxt/content/sql_dump.txt の末尾\nUPDATE _content_info SET ready = true WHERE id = 'checksum_pages';\n","bash",[86,1005,1006,1011],{"__ignoreMap":88},[115,1007,1008],{"class":117,"line":118},[115,1009,1010],{"class":121},"# .nuxt/content/sql_dump.txt の末尾\n",[115,1012,1013,1015,1017,1020,1023,1025,1028,1031,1033,1035,1037,1040,1042],{"class":117,"line":125},[115,1014,900],{"class":135},[115,1016,136],{"class":347},[115,1018,1019],{"class":347}," SET",[115,1021,1022],{"class":347}," ready",[115,1024,687],{"class":347},[115,1026,1027],{"class":128}," true",[115,1029,1030],{"class":347}," WHERE",[115,1032,953],{"class":347},[115,1034,687],{"class":347},[115,1036,344],{"class":343},[115,1038,1039],{"class":347},"checksum_pages",[115,1041,351],{"class":343},[115,1043,965],{"class":670},[69,1045,1046],{"id":1046},"本番環境での動作",[19,1048,1049],{},"本番ビルド時：",[79,1051,1053],{"className":1001,"code":1052,"language":1003,"meta":88,"style":88},"pnpm run build\n# または\nnpx nuxi generate\n\n# 1. すべての Markdown を一括パース\n# 2. SQLite DB を完全構築\n# 3. database.compressed.mjs を生成\n# 4. 静的ファイルとして配信\n",[86,1054,1055,1066,1071,1082,1086,1091,1096,1101],{"__ignoreMap":88},[115,1056,1057,1060,1063],{"class":117,"line":118},[115,1058,1059],{"class":135},"pnpm",[115,1061,1062],{"class":347}," run",[115,1064,1065],{"class":347}," build\n",[115,1067,1068],{"class":117,"line":125},[115,1069,1070],{"class":121},"# または\n",[115,1072,1073,1076,1079],{"class":117,"line":143},[115,1074,1075],{"class":135},"npx",[115,1077,1078],{"class":347}," nuxi",[115,1080,1081],{"class":347}," generate\n",[115,1083,1084],{"class":117,"line":159},[115,1085,213],{"emptyLinePlaceholder":212},[115,1087,1088],{"class":117,"line":170},[115,1089,1090],{"class":121},"# 1. すべての Markdown を一括パース\n",[115,1092,1093],{"class":117,"line":181},[115,1094,1095],{"class":121},"# 2. SQLite DB を完全構築\n",[115,1097,1098],{"class":117,"line":192},[115,1099,1100],{"class":121},"# 3. database.compressed.mjs を生成\n",[115,1102,1103],{"class":117,"line":203},[115,1104,1105],{"class":121},"# 4. 静的ファイルとして配信\n",[19,1107,1108,1111,1112,1115],{},[23,1109,1110],{},"重要："," 本番環境では SQLite DB は",[23,1113,1114],{},"読み取り専用","。ファイル監視やリアルタイム更新は行われません。",[14,1117,1119],{"id":1118},"bom-問題の詳細","BOM 問題の詳細",[69,1121,1123],{"id":1122},"bom-とは","BOM とは",[28,1125,1126,1140],{},[31,1127,1128,1131,1132,1135,1136,1139],{},[23,1129,1130],{},"Byte Order Mark (BOM)",": UTF-8 ファイルの先頭に付く ",[86,1133,1134],{},"0xEF 0xBB 0xBF","（文字では ",[86,1137,1138],{},"\\ufeff","）",[31,1141,1142],{},"Windows のメモ帳などが自動で付加することがある",[69,1144,1146],{"id":1145},"なぜ問題になるのか","なぜ問題になるのか？",[79,1148,1152],{"className":1149,"code":1150,"language":1151,"meta":88,"style":88},"language-yaml shiki shiki-themes vitesse-light vitesse-light","# BOM あり（パース失敗）\n﻿---\ntitle: タイトル\n---\n\n# BOM なし（パース成功）\n---\ntitle: タイトル\n---\n","yaml",[86,1153,1154,1159,1164,1175,1180,1184,1189,1193,1201],{"__ignoreMap":88},[115,1155,1156],{"class":117,"line":118},[115,1157,1158],{"class":121},"# BOM あり（パース失敗）\n",[115,1160,1161],{"class":117,"line":125},[115,1162,1163],{"class":347},"﻿---\n",[115,1165,1166,1170,1172],{"class":117,"line":143},[115,1167,1169],{"class":1168},"sz8Xr","title",[115,1171,678],{"class":670},[115,1173,1174],{"class":347}," タイトル\n",[115,1176,1177],{"class":117,"line":159},[115,1178,1179],{"class":135},"---\n",[115,1181,1182],{"class":117,"line":170},[115,1183,213],{"emptyLinePlaceholder":212},[115,1185,1186],{"class":117,"line":181},[115,1187,1188],{"class":121},"# BOM なし（パース成功）\n",[115,1190,1191],{"class":117,"line":192},[115,1192,1179],{"class":135},[115,1194,1195,1197,1199],{"class":117,"line":203},[115,1196,1169],{"class":1168},[115,1198,678],{"class":670},[115,1200,1174],{"class":347},[115,1202,1203],{"class":117,"line":209},[115,1204,1179],{"class":135},[19,1206,1207],{},"YAML パーサー（js-yaml）は：",[1209,1210,1211,1218,1225,1228,1242],"ol",{},[31,1212,1213,1214,1217],{},"ファイルが ",[86,1215,1216],{},"---"," で始まることを期待",[31,1219,1220,1221,1224],{},"BOM があると ",[86,1222,1223],{},"\\ufeff---"," と認識",[31,1226,1227],{},"YAML として認識できず、フロントマター全体を無視",[31,1229,1230,1233,1234,1237,1238,1241],{},[86,1231,1232],{},"publishedAt"," と ",[86,1235,1236],{},"tags"," が抽出されず ",[86,1239,1240],{},"null"," になる",[31,1243,1244,1245,1248],{},"SQLite に ",[86,1246,1247],{},"NULL"," で保存される",[69,1250,1251],{"id":1251},"対処法",[19,1253,1254],{},[23,1255,1256],{},"検出：",[79,1258,1260],{"className":1001,"code":1259,"language":1003,"meta":88,"style":88},"# BOM をチェック\nhead -n 1 content/file.md | od -c | head -n 1\n# BOM があれば: 357 273 277 が表示される\n",[86,1261,1262,1267,1302],{"__ignoreMap":88},[115,1263,1264],{"class":117,"line":118},[115,1265,1266],{"class":121},"# BOM をチェック\n",[115,1268,1269,1272,1276,1280,1283,1286,1289,1292,1294,1297,1299],{"class":117,"line":125},[115,1270,1271],{"class":135},"head",[115,1273,1275],{"class":1274},"snbK4"," -n",[115,1277,1279],{"class":1278},"sM54T"," 1",[115,1281,1282],{"class":347}," content/file.md",[115,1284,1285],{"class":149}," |",[115,1287,1288],{"class":135}," od",[115,1290,1291],{"class":1274}," -c",[115,1293,1285],{"class":149},[115,1295,1296],{"class":135}," head",[115,1298,1275],{"class":1274},[115,1300,1301],{"class":1278}," 1\n",[115,1303,1304],{"class":117,"line":143},[115,1305,1306],{"class":121},"# BOM があれば: 357 273 277 が表示される\n",[19,1308,1309],{},[23,1310,1311],{},"削除：",[79,1313,1315],{"className":1001,"code":1314,"language":1003,"meta":88,"style":88},"# VS Code: 右下の \"UTF-8 with BOM\" → \"UTF-8\" に変更\n# または正規表現で削除\nsed -i '1s/^\\xEF\\xBB\\xBF//' content/file.md\n",[86,1316,1317,1322,1327],{"__ignoreMap":88},[115,1318,1319],{"class":117,"line":118},[115,1320,1321],{"class":121},"# VS Code: 右下の \"UTF-8 with BOM\" → \"UTF-8\" に変更\n",[115,1323,1324],{"class":117,"line":125},[115,1325,1326],{"class":121},"# または正規表現で削除\n",[115,1328,1329,1332,1335,1337,1340,1342],{"class":117,"line":143},[115,1330,1331],{"class":135},"sed",[115,1333,1334],{"class":1274}," -i",[115,1336,344],{"class":343},[115,1338,1339],{"class":347},"1s/^\\xEF\\xBB\\xBF//",[115,1341,351],{"class":343},[115,1343,1344],{"class":347}," content/file.md\n",[19,1346,1347],{},[23,1348,1349],{},"予防：",[28,1351,1352,1355],{},[31,1353,1354],{},"VS Code の設定で \"UTF-8 without BOM\" をデフォルトに",[31,1356,1357,1360,1361,1364],{},[86,1358,1359],{},".editorconfig"," に ",[86,1362,1363],{},"charset = utf-8"," を設定",[14,1366,1367],{"id":1367},"データベース更新タイミングの詳細",[69,1369,1370],{"id":1370},"開発時の自動更新",[1372,1373,1374,1390],"table",{},[1375,1376,1377],"thead",{},[1378,1379,1380,1384,1387],"tr",{},[1381,1382,1383],"th",{},"イベント",[1381,1385,1386],{},"処理",[1381,1388,1389],{},"SQLite 更新",[1391,1392,1393,1405,1414,1424,1433,1446],"tbody",{},[1378,1394,1395,1399,1402],{},[1396,1397,1398],"td",{},"Markdown 新規作成",[1396,1400,1401],{},"INSERT",[1396,1403,1404],{},"✅",[1378,1406,1407,1410,1412],{},[1396,1408,1409],{},"Markdown 編集",[1396,1411,900],{},[1396,1413,1404],{},[1378,1415,1416,1419,1422],{},[1396,1417,1418],{},"Markdown 削除",[1396,1420,1421],{},"DELETE",[1396,1423,1404],{},[1378,1425,1426,1429,1431],{},[1396,1427,1428],{},"フロントマター変更",[1396,1430,900],{},[1396,1432,1404],{},[1378,1434,1435,1440,1443],{},[1396,1436,1437,1439],{},[86,1438,401],{}," 変更",[1396,1441,1442],{},"DROP & CREATE TABLE",[1396,1444,1445],{},"✅ (全再構築)",[1378,1447,1448,1453,1456],{},[1396,1449,1450,1439],{},[86,1451,1452],{},"nuxt.config.ts",[1396,1454,1455],{},"サーバー再起動",[1396,1457,1445],{},[69,1459,1460],{"id":1460},"キャッシュクリアが必要なケース",[19,1462,1463],{},"以下の場合は手動でキャッシュクリアが必要：",[79,1465,1467],{"className":1001,"code":1466,"language":1003,"meta":88,"style":88},"# SQLite DB が壊れた、パースエラーが直らない場合\nrm -rf .nuxt .data\npnpm dev  # 自動で再構築される\n",[86,1468,1469,1474,1488],{"__ignoreMap":88},[115,1470,1471],{"class":117,"line":118},[115,1472,1473],{"class":121},"# SQLite DB が壊れた、パースエラーが直らない場合\n",[115,1475,1476,1479,1482,1485],{"class":117,"line":125},[115,1477,1478],{"class":135},"rm",[115,1480,1481],{"class":1274}," -rf",[115,1483,1484],{"class":347}," .nuxt",[115,1486,1487],{"class":347}," .data\n",[115,1489,1490,1492,1495],{"class":117,"line":143},[115,1491,1059],{"class":135},[115,1493,1494],{"class":347}," dev",[115,1496,1497],{"class":121},"  # 自動で再構築される\n",[19,1499,1500],{},[23,1501,1502],{},"注意（Windows）：",[28,1504,1505,1508,1511],{},[31,1506,1507],{},"開発サーバーが SQLite ファイルをロック中",[31,1509,1510],{},"削除前にサーバーを停止する必要あり",[31,1512,1513],{},"Ctrl+C でサーバー停止 → ファイル削除 → 再起動",[14,1515,1517],{"id":1516},"querycollection-の内部動作","queryCollection の内部動作",[79,1519,1521],{"className":653,"code":1520,"language":655,"meta":88,"style":88},"// ユーザーコード\nconst doc = await queryCollection(\"pages\")\n  .path(\"/nuxt-content-mdx-setup-guide\")\n  .first();\n\n// ↓ 内部で実行される SQL\nSELECT * FROM _content_pages\nWHERE path = '/nuxt-content-mdx-setup-guide'\nLIMIT 1;\n\n// ↓ 結果をオブジェクトに変換\n{\n  id: \"pages/nuxt-content-mdx-setup-guide.md\",\n  title: \"Nuxt Content + MDX サイトの初期構築手順\",\n  publishedAt: new Date(\"2025-10-01T00:00:00.000Z\"),\n  tags: [\"nuxt\", \"content\", \"mdx\", \"setup\"],\n  body: { type: \"minimark\", value: [...] },\n  // ...\n}\n",[86,1522,1523,1528,1551,1568,1577,1581,1586,1599,1615,1624,1628,1633,1638,1654,1669,1693,1740,1774,1779],{"__ignoreMap":88},[115,1524,1525],{"class":117,"line":118},[115,1526,1527],{"class":121},"// ユーザーコード\n",[115,1529,1530,1532,1535,1537,1539,1541,1543,1545,1547,1549],{"class":117,"line":125},[115,1531,667],{"class":149},[115,1533,1534],{"class":674},"doc",[115,1536,687],{"class":670},[115,1538,690],{"class":128},[115,1540,739],{"class":135},[115,1542,742],{"class":670},[115,1544,745],{"class":343},[115,1546,748],{"class":347},[115,1548,745],{"class":343},[115,1550,753],{"class":670},[115,1552,1553,1556,1558,1560,1562,1564,1566],{"class":117,"line":143},[115,1554,1555],{"class":670},"  .",[115,1557,761],{"class":135},[115,1559,742],{"class":670},[115,1561,745],{"class":343},[115,1563,544],{"class":347},[115,1565,745],{"class":343},[115,1567,753],{"class":670},[115,1569,1570,1572,1574],{"class":117,"line":159},[115,1571,1555],{"class":670},[115,1573,778],{"class":135},[115,1575,1576],{"class":670},"();\n",[115,1578,1579],{"class":117,"line":170},[115,1580,213],{"emptyLinePlaceholder":212},[115,1582,1583],{"class":117,"line":181},[115,1584,1585],{"class":121},"// ↓ 内部で実行される SQL\n",[115,1587,1588,1591,1594,1597],{"class":117,"line":192},[115,1589,1590],{"class":674},"SELECT",[115,1592,1593],{"class":149}," *",[115,1595,1596],{"class":674}," FROM",[115,1598,903],{"class":674},[115,1600,1601,1603,1606,1608,1610,1612],{"class":117,"line":203},[115,1602,950],{"class":674},[115,1604,1605],{"class":674}," path",[115,1607,687],{"class":670},[115,1609,344],{"class":343},[115,1611,544],{"class":347},[115,1613,1614],{"class":343},"'\n",[115,1616,1617,1620,1622],{"class":117,"line":209},[115,1618,1619],{"class":674},"LIMIT",[115,1621,1279],{"class":1278},[115,1623,965],{"class":670},[115,1625,1626],{"class":117,"line":216},[115,1627,213],{"emptyLinePlaceholder":212},[115,1629,1630],{"class":117,"line":222},[115,1631,1632],{"class":121},"// ↓ 結果をオブジェクトに変換\n",[115,1634,1635],{"class":117,"line":234},[115,1636,1637],{"class":670},"{\n",[115,1639,1640,1643,1645,1648,1650,1652],{"class":117,"line":245},[115,1641,1642],{"class":135},"  id",[115,1644,678],{"class":670},[115,1646,1647],{"class":343}," \"",[115,1649,441],{"class":347},[115,1651,745],{"class":343},[115,1653,156],{"class":670},[115,1655,1656,1659,1661,1663,1665,1667],{"class":117,"line":255},[115,1657,1658],{"class":135},"  title",[115,1660,678],{"class":670},[115,1662,1647],{"class":343},[115,1664,456],{"class":347},[115,1666,745],{"class":343},[115,1668,156],{"class":670},[115,1670,1671,1674,1676,1679,1682,1684,1686,1688,1690],{"class":117,"line":265},[115,1672,1673],{"class":135},"  publishedAt",[115,1675,678],{"class":670},[115,1677,1678],{"class":149}," new",[115,1680,1681],{"class":135}," Date",[115,1683,742],{"class":670},[115,1685,745],{"class":343},[115,1687,559],{"class":347},[115,1689,745],{"class":343},[115,1691,1692],{"class":670},"),\n",[115,1694,1695,1698,1700,1703,1705,1708,1710,1712,1714,1717,1719,1721,1723,1726,1728,1730,1732,1735,1737],{"class":117,"line":275},[115,1696,1697],{"class":135},"  tags",[115,1699,678],{"class":670},[115,1701,1702],{"class":670}," [",[115,1704,745],{"class":343},[115,1706,1707],{"class":347},"nuxt",[115,1709,745],{"class":343},[115,1711,919],{"class":670},[115,1713,1647],{"class":343},[115,1715,1716],{"class":347},"content",[115,1718,745],{"class":343},[115,1720,919],{"class":670},[115,1722,1647],{"class":343},[115,1724,1725],{"class":347},"mdx",[115,1727,745],{"class":343},[115,1729,919],{"class":670},[115,1731,1647],{"class":343},[115,1733,1734],{"class":347},"setup",[115,1736,745],{"class":343},[115,1738,1739],{"class":670},"],\n",[115,1741,1742,1745,1747,1750,1753,1755,1757,1759,1761,1763,1766,1768,1771],{"class":117,"line":285},[115,1743,1744],{"class":135},"  body",[115,1746,678],{"class":670},[115,1748,1749],{"class":670}," {",[115,1751,1752],{"class":135}," type",[115,1754,678],{"class":670},[115,1756,1647],{"class":343},[115,1758,7],{"class":347},[115,1760,745],{"class":343},[115,1762,919],{"class":670},[115,1764,1765],{"class":135}," value",[115,1767,678],{"class":670},[115,1769,1770],{"class":670}," [...]",[115,1772,1773],{"class":670}," },\n",[115,1775,1776],{"class":117,"line":295},[115,1777,1778],{"class":121},"  // ...\n",[115,1780,1781],{"class":117,"line":309},[115,1782,1783],{"class":670},"}\n",[69,1785,1786],{"id":1786},"よく使うクエリパターン",[79,1788,1790],{"className":653,"code":1789,"language":655,"meta":88,"style":88},"// 1. パスで取得\nqueryCollection(\"pages\").path(\"/xxx\").first()\n// → SELECT * FROM _content_pages WHERE path = '/xxx' LIMIT 1\n\n// 2. すべて取得\nqueryCollection(\"pages\").all()\n// → SELECT * FROM _content_pages\n\n// 3. タグでフィルタ\nqueryCollection(\"pages\")\n  .where({ tags: { $contains: \"nuxt\" } })\n  .all()\n// → SELECT * FROM _content_pages WHERE tags LIKE '%nuxt%'\n\n// 4. 日付でソート\nqueryCollection(\"pages\")\n  .sort({ publishedAt: -1 })\n  .limit(10)\n  .all()\n// → SELECT * FROM _content_pages\n//    ORDER BY publishedAt DESC LIMIT 10\n",[86,1791,1792,1797,1830,1835,1839,1844,1863,1868,1872,1877,1891,1921,1929,1934,1938,1943,1957,1979,1993,2001,2005],{"__ignoreMap":88},[115,1793,1794],{"class":117,"line":118},[115,1795,1796],{"class":121},"// 1. パスで取得\n",[115,1798,1799,1802,1804,1806,1808,1810,1813,1815,1817,1819,1822,1824,1826,1828],{"class":117,"line":125},[115,1800,1801],{"class":135},"queryCollection",[115,1803,742],{"class":670},[115,1805,745],{"class":343},[115,1807,748],{"class":347},[115,1809,745],{"class":343},[115,1811,1812],{"class":670},").",[115,1814,761],{"class":135},[115,1816,742],{"class":670},[115,1818,745],{"class":343},[115,1820,1821],{"class":347},"/xxx",[115,1823,745],{"class":343},[115,1825,1812],{"class":670},[115,1827,778],{"class":135},[115,1829,781],{"class":670},[115,1831,1832],{"class":117,"line":143},[115,1833,1834],{"class":121},"// → SELECT * FROM _content_pages WHERE path = '/xxx' LIMIT 1\n",[115,1836,1837],{"class":117,"line":159},[115,1838,213],{"emptyLinePlaceholder":212},[115,1840,1841],{"class":117,"line":170},[115,1842,1843],{"class":121},"// 2. すべて取得\n",[115,1845,1846,1848,1850,1852,1854,1856,1858,1861],{"class":117,"line":181},[115,1847,1801],{"class":135},[115,1849,742],{"class":670},[115,1851,745],{"class":343},[115,1853,748],{"class":347},[115,1855,745],{"class":343},[115,1857,1812],{"class":670},[115,1859,1860],{"class":135},"all",[115,1862,781],{"class":670},[115,1864,1865],{"class":117,"line":192},[115,1866,1867],{"class":121},"// → SELECT * FROM _content_pages\n",[115,1869,1870],{"class":117,"line":203},[115,1871,213],{"emptyLinePlaceholder":212},[115,1873,1874],{"class":117,"line":209},[115,1875,1876],{"class":121},"// 3. タグでフィルタ\n",[115,1878,1879,1881,1883,1885,1887,1889],{"class":117,"line":216},[115,1880,1801],{"class":135},[115,1882,742],{"class":670},[115,1884,745],{"class":343},[115,1886,748],{"class":347},[115,1888,745],{"class":343},[115,1890,753],{"class":670},[115,1892,1893,1895,1898,1901,1903,1906,1909,1912,1914,1916,1918],{"class":117,"line":222},[115,1894,1555],{"class":670},[115,1896,1897],{"class":135},"where",[115,1899,1900],{"class":670},"({ ",[115,1902,1236],{"class":1168},[115,1904,1905],{"class":670},": { ",[115,1907,1908],{"class":1168},"$contains",[115,1910,1911],{"class":670},": ",[115,1913,745],{"class":343},[115,1915,1707],{"class":347},[115,1917,745],{"class":343},[115,1919,1920],{"class":670}," } })\n",[115,1922,1923,1925,1927],{"class":117,"line":234},[115,1924,1555],{"class":670},[115,1926,1860],{"class":135},[115,1928,781],{"class":670},[115,1930,1931],{"class":117,"line":245},[115,1932,1933],{"class":121},"// → SELECT * FROM _content_pages WHERE tags LIKE '%nuxt%'\n",[115,1935,1936],{"class":117,"line":255},[115,1937,213],{"emptyLinePlaceholder":212},[115,1939,1940],{"class":117,"line":265},[115,1941,1942],{"class":121},"// 4. 日付でソート\n",[115,1944,1945,1947,1949,1951,1953,1955],{"class":117,"line":275},[115,1946,1801],{"class":135},[115,1948,742],{"class":670},[115,1950,745],{"class":343},[115,1952,748],{"class":347},[115,1954,745],{"class":343},[115,1956,753],{"class":670},[115,1958,1959,1961,1964,1966,1968,1970,1973,1976],{"class":117,"line":285},[115,1960,1555],{"class":670},[115,1962,1963],{"class":135},"sort",[115,1965,1900],{"class":670},[115,1967,1232],{"class":1168},[115,1969,1911],{"class":670},[115,1971,1972],{"class":149},"-",[115,1974,1975],{"class":1278},"1",[115,1977,1978],{"class":670}," })\n",[115,1980,1981,1983,1986,1988,1991],{"class":117,"line":295},[115,1982,1555],{"class":670},[115,1984,1985],{"class":135},"limit",[115,1987,742],{"class":670},[115,1989,1990],{"class":1278},"10",[115,1992,753],{"class":670},[115,1994,1995,1997,1999],{"class":117,"line":309},[115,1996,1555],{"class":670},[115,1998,1860],{"class":135},[115,2000,781],{"class":670},[115,2002,2003],{"class":117,"line":319},[115,2004,1867],{"class":121},[115,2006,2007],{"class":117,"line":333},[115,2008,2009],{"class":121},"//    ORDER BY publishedAt DESC LIMIT 10\n",[14,2011,2012],{"id":2012},"デプロイ時の考慮事項",[69,2014,2016],{"id":2015},"cloudflare-pages-でのビルド","Cloudflare Pages でのビルド",[79,2018,2020],{"className":1149,"code":2019,"language":1151,"meta":88,"style":88},"# wrangler.toml または GitHub Actions\nbuild:\n  command: pnpm run build\n  # または\n  command: npx nuxi generate\n\n# 生成物:\n# .output/public/\n#   ├── _nuxt/\n#   │   └── database.compressed.mjs  ← SQLite ダンプ\n#   └── index.html\n",[86,2021,2022,2027,2035,2045,2050,2059,2063,2068,2073,2078,2083],{"__ignoreMap":88},[115,2023,2024],{"class":117,"line":118},[115,2025,2026],{"class":121},"# wrangler.toml または GitHub Actions\n",[115,2028,2029,2032],{"class":117,"line":125},[115,2030,2031],{"class":1168},"build",[115,2033,2034],{"class":670},":\n",[115,2036,2037,2040,2042],{"class":117,"line":143},[115,2038,2039],{"class":1168},"  command",[115,2041,678],{"class":670},[115,2043,2044],{"class":347}," pnpm run build\n",[115,2046,2047],{"class":117,"line":159},[115,2048,2049],{"class":121},"  # または\n",[115,2051,2052,2054,2056],{"class":117,"line":170},[115,2053,2039],{"class":1168},[115,2055,678],{"class":670},[115,2057,2058],{"class":347}," npx nuxi generate\n",[115,2060,2061],{"class":117,"line":181},[115,2062,213],{"emptyLinePlaceholder":212},[115,2064,2065],{"class":117,"line":192},[115,2066,2067],{"class":121},"# 生成物:\n",[115,2069,2070],{"class":117,"line":203},[115,2071,2072],{"class":121},"# .output/public/\n",[115,2074,2075],{"class":117,"line":209},[115,2076,2077],{"class":121},"#   ├── _nuxt/\n",[115,2079,2080],{"class":117,"line":216},[115,2081,2082],{"class":121},"#   │   └── database.compressed.mjs  ← SQLite ダンプ\n",[115,2084,2085],{"class":117,"line":222},[115,2086,2087],{"class":121},"#   └── index.html\n",[69,2089,2091],{"id":2090},"sqlite-コネクタの選択","SQLite コネクタの選択",[19,2093,2094,678],{},[86,2095,1452],{},[79,2097,2099],{"className":653,"code":2098,"language":655,"meta":88,"style":88},"export default defineNuxtConfig({\n  content: {\n    database: {\n      type: \"sqlite\"\n    },\n    experimental: {\n      sqliteConnector: \"native\"  // Node.js 22.5+ 推奨\n      // または\n      // sqliteConnector: \"better-sqlite3\"\n      // sqliteConnector: \"sqlite3\"\n    }\n  }\n})\n",[86,2100,2101,2115,2123,2130,2145,2150,2157,2174,2179,2184,2189,2194,2199],{"__ignoreMap":88},[115,2102,2103,2106,2109,2112],{"class":117,"line":118},[115,2104,2105],{"class":128},"export",[115,2107,2108],{"class":128}," default",[115,2110,2111],{"class":135}," defineNuxtConfig",[115,2113,2114],{"class":670},"({\n",[115,2116,2117,2120],{"class":117,"line":125},[115,2118,2119],{"class":1168},"  content",[115,2121,2122],{"class":670},": {\n",[115,2124,2125,2128],{"class":117,"line":143},[115,2126,2127],{"class":1168},"    database",[115,2129,2122],{"class":670},[115,2131,2132,2135,2137,2139,2142],{"class":117,"line":159},[115,2133,2134],{"class":1168},"      type",[115,2136,1911],{"class":670},[115,2138,745],{"class":343},[115,2140,2141],{"class":347},"sqlite",[115,2143,2144],{"class":343},"\"\n",[115,2146,2147],{"class":117,"line":170},[115,2148,2149],{"class":670},"    },\n",[115,2151,2152,2155],{"class":117,"line":181},[115,2153,2154],{"class":1168},"    experimental",[115,2156,2122],{"class":670},[115,2158,2159,2162,2164,2166,2169,2171],{"class":117,"line":192},[115,2160,2161],{"class":1168},"      sqliteConnector",[115,2163,1911],{"class":670},[115,2165,745],{"class":343},[115,2167,2168],{"class":347},"native",[115,2170,745],{"class":343},[115,2172,2173],{"class":121},"  // Node.js 22.5+ 推奨\n",[115,2175,2176],{"class":117,"line":203},[115,2177,2178],{"class":121},"      // または\n",[115,2180,2181],{"class":117,"line":209},[115,2182,2183],{"class":121},"      // sqliteConnector: \"better-sqlite3\"\n",[115,2185,2186],{"class":117,"line":216},[115,2187,2188],{"class":121},"      // sqliteConnector: \"sqlite3\"\n",[115,2190,2191],{"class":117,"line":222},[115,2192,2193],{"class":670},"    }\n",[115,2195,2196],{"class":117,"line":234},[115,2197,2198],{"class":670},"  }\n",[115,2200,2201],{"class":117,"line":245},[115,2202,2203],{"class":670},"})\n",[19,2205,2206],{},[23,2207,2208],{},"推奨設定（2025年現在）：",[28,2210,2211,2219],{},[31,2212,2213,1911,2216,2218],{},[23,2214,2215],{},"開発環境",[86,2217,2168],{}," (Node.js 22.6+)",[31,2220,2221,2224],{},[23,2222,2223],{},"本番環境",": 静的生成なので影響なし",[14,2226,2227],{"id":2227},"トラブルシューティングチェックリスト",[69,2229,2231],{"id":2230},"フロントマターが-null-になる場合","フロントマターが null になる場合",[1209,2233,2234,2261,2356,2403,2434],{},[31,2235,2236,2239],{},[23,2237,2238],{},"BOM を確認",[79,2240,2242],{"className":1001,"code":2241,"language":1003,"meta":88,"style":88},"head -n 1 content/file.md | od -c\n",[86,2243,2244],{"__ignoreMap":88},[115,2245,2246,2248,2250,2252,2254,2256,2258],{"class":117,"line":118},[115,2247,1271],{"class":135},[115,2249,1275],{"class":1274},[115,2251,1279],{"class":1278},[115,2253,1282],{"class":347},[115,2255,1285],{"class":149},[115,2257,1288],{"class":135},[115,2259,2260],{"class":1274}," -c\n",[31,2262,2263,2266],{},[23,2264,2265],{},"YAML 構文を確認",[79,2267,2269],{"className":1149,"code":2268,"language":1151,"meta":88,"style":88},"# ✅ 正しい\n---\ntitle: タイトル\ntags:\n  - tag1\n  - tag2\n---\n\n# ❌ 間違い（インデントが不正）\n---\ntitle: タイトル\ntags:\n- tag1\n- tag2\n---\n",[86,2270,2271,2276,2280,2288,2294,2302,2309,2313,2317,2322,2326,2334,2340,2346,2352],{"__ignoreMap":88},[115,2272,2273],{"class":117,"line":118},[115,2274,2275],{"class":121},"# ✅ 正しい\n",[115,2277,2278],{"class":117,"line":125},[115,2279,1179],{"class":135},[115,2281,2282,2284,2286],{"class":117,"line":143},[115,2283,1169],{"class":1168},[115,2285,678],{"class":670},[115,2287,1174],{"class":347},[115,2289,2290,2292],{"class":117,"line":159},[115,2291,1236],{"class":1168},[115,2293,2034],{"class":670},[115,2295,2296,2299],{"class":117,"line":170},[115,2297,2298],{"class":670},"  -",[115,2300,2301],{"class":347}," tag1\n",[115,2303,2304,2306],{"class":117,"line":181},[115,2305,2298],{"class":670},[115,2307,2308],{"class":347}," tag2\n",[115,2310,2311],{"class":117,"line":192},[115,2312,1179],{"class":135},[115,2314,2315],{"class":117,"line":203},[115,2316,213],{"emptyLinePlaceholder":212},[115,2318,2319],{"class":117,"line":209},[115,2320,2321],{"class":121},"# ❌ 間違い（インデントが不正）\n",[115,2323,2324],{"class":117,"line":216},[115,2325,1179],{"class":135},[115,2327,2328,2330,2332],{"class":117,"line":222},[115,2329,1169],{"class":1168},[115,2331,678],{"class":670},[115,2333,1174],{"class":347},[115,2335,2336,2338],{"class":117,"line":234},[115,2337,1236],{"class":1168},[115,2339,2034],{"class":670},[115,2341,2342,2344],{"class":117,"line":245},[115,2343,1972],{"class":670},[115,2345,2301],{"class":347},[115,2347,2348,2350],{"class":117,"line":255},[115,2349,1972],{"class":670},[115,2351,2308],{"class":347},[115,2353,2354],{"class":117,"line":265},[115,2355,1179],{"class":135},[31,2357,2358,2361],{},[23,2359,2360],{},"スキーマを確認",[79,2362,2364],{"className":653,"code":2363,"language":655,"meta":88,"style":88},"// content.config.ts\npublishedAt: z.coerce.date().optional()\n// ↑ coerce がないと文字列のままパースされる\n",[86,2365,2366,2371,2398],{"__ignoreMap":88},[115,2367,2368],{"class":117,"line":118},[115,2369,2370],{"class":121},"// content.config.ts\n",[115,2372,2373,2375,2377,2380,2382,2385,2387,2390,2393,2396],{"class":117,"line":125},[115,2374,1232],{"class":135},[115,2376,678],{"class":670},[115,2378,2379],{"class":674}," z",[115,2381,719],{"class":670},[115,2383,2384],{"class":674},"coerce",[115,2386,719],{"class":670},[115,2388,2389],{"class":135},"date",[115,2391,2392],{"class":670},"().",[115,2394,2395],{"class":135},"optional",[115,2397,781],{"class":670},[115,2399,2400],{"class":117,"line":143},[115,2401,2402],{"class":121},"// ↑ coerce がないと文字列のままパースされる\n",[31,2404,2405,2408],{},[23,2406,2407],{},"SQLite の内容を確認",[79,2409,2411],{"className":1001,"code":2410,"language":1003,"meta":88,"style":88},"sqlite3 .data/content/contents.sqlite \\\n  \"SELECT id, publishedAt, tags FROM _content_pages;\"\n",[86,2412,2413,2424],{"__ignoreMap":88},[115,2414,2415,2418,2421],{"class":117,"line":118},[115,2416,2417],{"class":135},"sqlite3",[115,2419,2420],{"class":347}," .data/content/contents.sqlite",[115,2422,2423],{"class":1274}," \\\n",[115,2425,2426,2429,2432],{"class":117,"line":125},[115,2427,2428],{"class":343},"  \"",[115,2430,2431],{"class":347},"SELECT id, publishedAt, tags FROM _content_pages;",[115,2433,2144],{"class":343},[31,2435,2436,2439],{},[23,2437,2438],{},"キャッシュをクリア",[79,2440,2442],{"className":1001,"code":2441,"language":1003,"meta":88,"style":88},"rm -rf .nuxt .data && pnpm dev\n",[86,2443,2444],{"__ignoreMap":88},[115,2445,2446,2448,2450,2452,2455,2458,2461],{"class":117,"line":118},[115,2447,1478],{"class":135},[115,2449,1481],{"class":1274},[115,2451,1484],{"class":347},[115,2453,2454],{"class":347}," .data",[115,2456,2457],{"class":670}," &&",[115,2459,2460],{"class":135}," pnpm",[115,2462,2463],{"class":347}," dev\n",[69,2465,2466],{"id":2466},"データベースが更新されない場合",[1209,2468,2469,2493,2524],{},[31,2470,2471,2474],{},[23,2472,2473],{},"ファイル監視が動いているか確認",[79,2475,2477],{"className":1001,"code":2476,"language":1003,"meta":88,"style":88},"# ログを確認\npnpm dev --debug\n",[86,2478,2479,2484],{"__ignoreMap":88},[115,2480,2481],{"class":117,"line":118},[115,2482,2483],{"class":121},"# ログを確認\n",[115,2485,2486,2488,2490],{"class":117,"line":125},[115,2487,1059],{"class":135},[115,2489,1494],{"class":347},[115,2491,2492],{"class":1274}," --debug\n",[31,2494,2495,2498],{},[23,2496,2497],{},"ファイルパスが正しいか確認",[79,2499,2501],{"className":653,"code":2500,"language":655,"meta":88,"style":88},"// content.config.ts\nsource: \"**/*.{md,mdx}\"  // ← 拡張子を確認\n",[86,2502,2503,2507],{"__ignoreMap":88},[115,2504,2505],{"class":117,"line":118},[115,2506,2370],{"class":121},[115,2508,2509,2512,2514,2516,2519,2521],{"class":117,"line":125},[115,2510,2511],{"class":135},"source",[115,2513,678],{"class":670},[115,2515,1647],{"class":343},[115,2517,2518],{"class":347},"**/*.{md,mdx}",[115,2520,745],{"class":343},[115,2522,2523],{"class":121},"  // ← 拡張子を確認\n",[31,2525,2526,2529],{},[23,2527,2528],{},"Vite キャッシュをクリア",[79,2530,2532],{"className":1001,"code":2531,"language":1003,"meta":88,"style":88},"rm -rf node_modules/.vite\n",[86,2533,2534],{"__ignoreMap":88},[115,2535,2536,2538,2540],{"class":117,"line":118},[115,2537,1478],{"class":135},[115,2539,1481],{"class":1274},[115,2541,2542],{"class":347}," node_modules/.vite\n",[14,2544,2545],{"id":2545},"まとめ",[69,2547,2549],{"id":2548},"nuxt-content-の-sqlite-フロー要約","Nuxt Content の SQLite フロー（要約）",[79,2551,2554],{"className":2552,"code":2553,"language":84},[82],"1. Markdown ファイル作成/編集\n   ↓\n2. Vite/Chokidar がファイル変更を検知\n   ↓\n3. Nuxt Content ビルドプラグインが起動\n   ↓\n4. フロントマター → YAML パース (⚠️ BOM に注意)\n   ↓\n5. Markdown → AST → JSON (minimark)\n   ↓\n6. content.config.ts のスキーマで検証\n   ↓\n7. SQLite テーブルに INSERT/UPDATE\n   ↓\n8. __hash__ で整合性チェック\n   ↓\n9. .nuxt/content/sql_dump.txt を生成\n   ↓\n10. HMR でブラウザに通知 → リロード\n",[86,2555,2553],{"__ignoreMap":88},[69,2557,2558],{"id":2558},"重要なポイント",[1209,2560,2561,2568,2574,2580,2587],{},[31,2562,2563,2564,2567],{},"✅ ",[23,2565,2566],{},"SQLite は自動で管理される"," - 手動で SQL を書く必要なし",[31,2569,2563,2570,2573],{},[23,2571,2572],{},"開発時はリアルタイム更新"," - ファイル保存で即座に反映",[31,2575,2563,2576,2579],{},[23,2577,2578],{},"本番は静的ダンプ"," - database.compressed.mjs として配信",[31,2581,2582,2583,2586],{},"⚠️ ",[23,2584,2585],{},"BOM に注意"," - UTF-8 without BOM で保存する",[31,2588,2582,2589,2592,2593,1233,2596,2599],{},[23,2590,2591],{},"スキーマ変更時はキャッシュクリア"," - ",[86,2594,2595],{},".nuxt",[86,2597,2598],{},".data"," を削除",[69,2601,2602],{"id":2602},"参考リンク",[28,2604,2605,2612,2618],{},[31,2606,2607],{},[59,2608,2611],{"href":2609,"rel":2610},"https://content.nuxt.com/docs/advanced/database",[63],"Nuxt Content v3 Database Documentation",[31,2613,2614],{},[59,2615,2617],{"href":61,"rel":2616},[63],"Nuxt Content v3 Announcement",[31,2619,2620],{},[59,2621,2624],{"href":2622,"rel":2623},"https://nodejs.org/api/sqlite.html",[63],"SQLite in Node.js 22.5+",[2626,2627,2628],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}",{"title":88,"searchDepth":125,"depth":125,"links":2630},[2631,2632,2637,2641,2645,2650,2654,2657,2661,2665],{"id":16,"depth":125,"text":17},{"id":66,"depth":125,"text":67,"children":2633},[2634,2635,2636],{"id":71,"depth":143,"text":72},{"id":102,"depth":143,"text":103},{"id":414,"depth":143,"text":415},{"id":630,"depth":125,"text":631,"children":2638},[2639,2640],{"id":634,"depth":143,"text":635},{"id":644,"depth":143,"text":645},{"id":823,"depth":125,"text":823,"children":2642},[2643,2644],{"id":826,"depth":143,"text":826},{"id":1046,"depth":143,"text":1046},{"id":1118,"depth":125,"text":1119,"children":2646},[2647,2648,2649],{"id":1122,"depth":143,"text":1123},{"id":1145,"depth":143,"text":1146},{"id":1251,"depth":143,"text":1251},{"id":1367,"depth":125,"text":1367,"children":2651},[2652,2653],{"id":1370,"depth":143,"text":1370},{"id":1460,"depth":143,"text":1460},{"id":1516,"depth":125,"text":1517,"children":2655},[2656],{"id":1786,"depth":143,"text":1786},{"id":2012,"depth":125,"text":2012,"children":2658},[2659,2660],{"id":2015,"depth":143,"text":2016},{"id":2090,"depth":143,"text":2091},{"id":2227,"depth":125,"text":2227,"children":2662},[2663,2664],{"id":2230,"depth":143,"text":2231},{"id":2466,"depth":143,"text":2466},{"id":2545,"depth":125,"text":2545,"children":2666},[2667,2668,2669],{"id":2548,"depth":143,"text":2549},{"id":2558,"depth":143,"text":2558},{"id":2602,"depth":143,"text":2602},null,"Nuxt Content v3 がどのように SQLite を使ってコンテンツを管理し、Markdown ファイルの変更を検知してデータベースを更新するかの詳細解説",{},"/nuxt-content-sqlite-architecture",false,"2025-10-02T00:00:00.000Z",{"title":5,"description":2671},"2025-10/2025-10-02/nuxt-content-sqlite-architecture",[1707,1716,2141,2679],"architecture","xXp61s58mKRuS0Al3KtjKa07P65MAxdzUXAjXYryzWc",[],[2683,2687,2691,2695,2699],{"title":2684,"path":2685,"publishedAt":2686},"Nuxt Content + Pages ハイブリッドアーキテクチャ：プロジェクト要件定義書","/nuxt-hybrid-content-architecture","2025-11-29T00:00:00.000Z",{"title":2688,"path":2689,"publishedAt":2690},"SQLiteから財務データを読み込む実装方針","/sqlite-financial-data-implementation","2025-12-12T00:00:00.000Z",{"title":2692,"path":2693,"publishedAt":2694},"Nuxt Content v3：D1データベースは本当に必要なのか？","/nuxt-content-d1-not-used","2025-12-05T00:00:00.000Z",{"title":2696,"path":2697,"publishedAt":2698},"Nuxt Pages と Nuxt Content の統合仕組み","/nuxt-pages-and-content-integration","2025-10-05T00:00:00.000Z",{"title":2700,"path":2701,"publishedAt":2702},"Nuxt Content: ファイル監視と自動更新の仕組み","/nuxt-content-file-watch-and-auto-update","2025-10-04T00:00:00.000Z","https://log.eurekapu.com/og/blog/nuxt-content-sqlite-architecture.png?v=2025-10-02T00%3A00%3A00.000Z&title=Nuxt%20Content%20%E3%81%AE%20SQLite%20%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%A7%A3%E8%AA%AC&author=Kei%20Komatsu&sig=fdfcceb919f84ac9",1785654654848]