[{"data":1,"prerenderedAt":1267},["ShallowReactive",2],{"content-/ssr-vs-ssg-page-transition-slow":3,"all-pages-for-dir":1244,"related-/ssr-vs-ssg-page-transition-slow":1245,"og-image-/ssr-vs-ssg-page-transition-slow":1266},{"id":4,"title":5,"body":6,"category":1228,"concepts":1228,"description":1229,"extension":1230,"meta":1231,"navigation":441,"ogImage":1228,"path":1232,"project_name":1228,"published":1233,"publishedAt":1234,"seo":1235,"source":1228,"stem":1236,"tags":1237,"todo":1228,"unpublished":1233,"updatedAt":1234,"__hash__":1243},"pages/2025-12/2025-12-05/ssr-vs-ssg-page-transition-slow.md","ページ遷移が遅い問題：SSR vs SSG の選択ミス",{"type":7,"value":8,"toc":1194},"minimark",[9,13,17,30,33,36,40,44,185,217,220,302,304,308,312,320,324,330,332,336,340,343,379,382,499,506,512,515,568,575,578,594,599,603,609,626,629,632,650,653,661,693,699,715,718,722,725,796,799,810,816,819,821,824,827,833,934,938,943,946,976,979,987,990,1029,1039,1041,1044,1102,1104,1107,1111,1116,1120,1130,1134,1137,1141,1144,1146,1149,1158,1161,1190],[10,11,5],"h1",{"id":12},"ページ遷移が遅い問題ssr-vs-ssg-の選択ミス",[14,15,16],"h2",{"id":16},"問題の概要",[18,19,20,21,25,26,29],"p",{},"本番環境（Cloudflare Pages）で、トップページ（",[22,23,24],"code",{},"/","）からブログ一覧（",[22,27,28],{},"/blog","）へのページ遷移に2-3秒かかっていた。",[18,31,32],{},"ブログサイトとしては明らかに遅い。静的サイトなら50-200ms程度であるべき。",[34,35],"hr",{},[14,37,39],{"id":38},"現状の構成問題のある状態","現状の構成（問題のある状態）",[41,42,43],"h3",{"id":43},"設定されていたもの",[45,46,51],"pre",{"className":47,"code":48,"language":49,"meta":50,"style":50},"language-typescript shiki shiki-themes vitesse-light vitesse-light","// nuxt.config.ts\nexport default defineNuxtConfig({\n  nitro: {\n    preset: \"cloudflare-pages\"  // ← Cloudflare Workers上でSSR\n  },\n  content: {\n    documentDriven: true,       // ← URLベースの動的コンテンツ取得\n    database: {\n      type: \"sqlite\"\n    }\n  }\n})\n","typescript","",[22,52,53,62,80,90,112,118,126,143,151,167,173,179],{"__ignoreMap":50},[54,55,58],"span",{"class":56,"line":57},"line",1,[54,59,61],{"class":60},"sxvE3","// nuxt.config.ts\n",[54,63,65,69,72,76],{"class":56,"line":64},2,[54,66,68],{"class":67},"sHkkW","export",[54,70,71],{"class":67}," default",[54,73,75],{"class":74},"senZ8"," defineNuxtConfig",[54,77,79],{"class":78},"shFtX","({\n",[54,81,83,87],{"class":56,"line":82},3,[54,84,86],{"class":85},"sz8Xr","  nitro",[54,88,89],{"class":78},": {\n",[54,91,93,96,99,103,107,109],{"class":56,"line":92},4,[54,94,95],{"class":85},"    preset",[54,97,98],{"class":78},": ",[54,100,102],{"class":101},"sMJiu","\"",[54,104,106],{"class":105},"sdGka","cloudflare-pages",[54,108,102],{"class":101},[54,110,111],{"class":60},"  // ← Cloudflare Workers上でSSR\n",[54,113,115],{"class":56,"line":114},5,[54,116,117],{"class":78},"  },\n",[54,119,121,124],{"class":56,"line":120},6,[54,122,123],{"class":85},"  content",[54,125,89],{"class":78},[54,127,129,132,134,137,140],{"class":56,"line":128},7,[54,130,131],{"class":85},"    documentDriven",[54,133,98],{"class":78},[54,135,136],{"class":67},"true",[54,138,139],{"class":78},",       ",[54,141,142],{"class":60},"// ← URLベースの動的コンテンツ取得\n",[54,144,146,149],{"class":56,"line":145},8,[54,147,148],{"class":85},"    database",[54,150,89],{"class":78},[54,152,154,157,159,161,164],{"class":56,"line":153},9,[54,155,156],{"class":85},"      type",[54,158,98],{"class":78},[54,160,102],{"class":101},[54,162,163],{"class":105},"sqlite",[54,165,166],{"class":101},"\"\n",[54,168,170],{"class":56,"line":169},10,[54,171,172],{"class":78},"    }\n",[54,174,176],{"class":56,"line":175},11,[54,177,178],{"class":78},"  }\n",[54,180,182],{"class":56,"line":181},12,[54,183,184],{"class":78},"})\n",[45,186,190],{"className":187,"code":188,"language":189,"meta":50,"style":50},"language-toml shiki shiki-themes vitesse-light vitesse-light","# wrangler.toml\n[[d1_databases]]\nbinding = \"DB\"\ndatabase_name = \"nuxt-content-db\"\ndatabase_id = \"...\"\n","toml",[22,191,192,197,202,207,212],{"__ignoreMap":50},[54,193,194],{"class":56,"line":57},[54,195,196],{},"# wrangler.toml\n",[54,198,199],{"class":56,"line":64},[54,200,201],{},"[[d1_databases]]\n",[54,203,204],{"class":56,"line":82},[54,205,206],{},"binding = \"DB\"\n",[54,208,209],{"class":56,"line":92},[54,210,211],{},"database_name = \"nuxt-content-db\"\n",[54,213,214],{"class":56,"line":114},[54,215,216],{},"database_id = \"...\"\n",[41,218,219],{"id":219},"設定されていなかったもの",[45,221,223],{"className":47,"code":222,"language":49,"meta":50,"style":50},"// これが欠けていた\nnitro: {\n  prerender: {\n    crawlLinks: true,\n    routes: ['/blog', '/']\n  }\n}\n",[22,224,225,230,241,250,263,293,297],{"__ignoreMap":50},[54,226,227],{"class":56,"line":57},[54,228,229],{"class":60},"// これが欠けていた\n",[54,231,232,235,238],{"class":56,"line":64},[54,233,234],{"class":74},"nitro",[54,236,237],{"class":78},":",[54,239,240],{"class":78}," {\n",[54,242,243,246,248],{"class":56,"line":82},[54,244,245],{"class":74},"  prerender",[54,247,237],{"class":78},[54,249,240],{"class":78},[54,251,252,255,257,260],{"class":56,"line":92},[54,253,254],{"class":74},"    crawlLinks",[54,256,237],{"class":78},[54,258,259],{"class":67}," true",[54,261,262],{"class":78},",\n",[54,264,265,268,270,273,276,278,280,283,286,288,290],{"class":56,"line":114},[54,266,267],{"class":74},"    routes",[54,269,237],{"class":78},[54,271,272],{"class":78}," [",[54,274,275],{"class":101},"'",[54,277,28],{"class":105},[54,279,275],{"class":101},[54,281,282],{"class":78},",",[54,284,285],{"class":101}," '",[54,287,24],{"class":105},[54,289,275],{"class":101},[54,291,292],{"class":78},"]\n",[54,294,295],{"class":56,"line":120},[54,296,178],{"class":78},[54,298,299],{"class":56,"line":128},[54,300,301],{"class":78},"}\n",[34,303],{},[14,305,307],{"id":306},"なぜ遅いのかリクエストフロー分析","なぜ遅いのか：リクエストフロー分析",[41,309,311],{"id":310},"現状ssr-d1","現状（SSR + D1）",[45,313,318],{"className":314,"code":316,"language":317},[315],"language-text","ユーザーがNuxtLinkをクリック\n    ↓\nCloudflare Edge（最寄りのデータセンター）\n    ↓\nCloudflare Worker起動（コールドスタート: 100-500ms）\n    ↓\nD1データベースにクエリ発行\n    ↓\nqueryCollection('pages') 実行（500-1500ms）\n    ↓\nSSRでHTML生成（500-1000ms）\n    ↓\nクライアントに返却\n    ↓\n合計: 1.1秒 〜 3秒\n","text",[22,319,316],{"__ignoreMap":50},[41,321,323],{"id":322},"あるべき姿ssg","あるべき姿（SSG）",[45,325,328],{"className":326,"code":327,"language":317},[315],"ユーザーがNuxtLinkをクリック\n    ↓\nCloudflare Edge（最寄りのデータセンター）\n    ↓\n事前生成済みのHTMLを返却（10-50ms）\n    ↓\nクライアントでハイドレーション\n    ↓\n合計: 50-200ms\n",[22,329,327],{"__ignoreMap":50},[34,331],{},[14,333,335],{"id":334},"なぜこの構成になったのか5つの原因","なぜこの構成になったのか：5つの原因",[41,337,339],{"id":338},"_1-nuxt-3のデフォルト動作","1. Nuxt 3のデフォルト動作",[18,341,342],{},"Nuxt 3はデフォルトでSSRが有効である。明示的に設定しないと静的生成されない。",[45,344,346],{"className":47,"code":345,"language":49,"meta":50,"style":50},"// デフォルト（暗黙的に有効）\nexport default defineNuxtConfig({\n  ssr: true  // これがデフォルト\n})\n",[22,347,348,353,363,375],{"__ignoreMap":50},[54,349,350],{"class":56,"line":57},[54,351,352],{"class":60},"// デフォルト（暗黙的に有効）\n",[54,354,355,357,359,361],{"class":56,"line":64},[54,356,68],{"class":67},[54,358,71],{"class":67},[54,360,75],{"class":74},[54,362,79],{"class":78},[54,364,365,368,370,372],{"class":56,"line":82},[54,366,367],{"class":85},"  ssr",[54,369,98],{"class":78},[54,371,136],{"class":67},[54,373,374],{"class":60},"  // これがデフォルト\n",[54,376,377],{"class":56,"line":92},[54,378,184],{"class":78},[18,380,381],{},"静的生成するには明示的な設定が必要：",[45,383,385],{"className":47,"code":384,"language":49,"meta":50,"style":50},"// 方法1: 全ページを静的化\nexport default defineNuxtConfig({\n  nitro: {\n    prerender: {\n      crawlLinks: true\n    }\n  }\n})\n\n// 方法2: ルートごとに指定\nexport default defineNuxtConfig({\n  routeRules: {\n    '/**': { prerender: true }\n  }\n})\n",[22,386,387,392,402,408,415,425,429,433,437,443,448,458,465,489,494],{"__ignoreMap":50},[54,388,389],{"class":56,"line":57},[54,390,391],{"class":60},"// 方法1: 全ページを静的化\n",[54,393,394,396,398,400],{"class":56,"line":64},[54,395,68],{"class":67},[54,397,71],{"class":67},[54,399,75],{"class":74},[54,401,79],{"class":78},[54,403,404,406],{"class":56,"line":82},[54,405,86],{"class":85},[54,407,89],{"class":78},[54,409,410,413],{"class":56,"line":92},[54,411,412],{"class":85},"    prerender",[54,414,89],{"class":78},[54,416,417,420,422],{"class":56,"line":114},[54,418,419],{"class":85},"      crawlLinks",[54,421,98],{"class":78},[54,423,424],{"class":67},"true\n",[54,426,427],{"class":56,"line":120},[54,428,172],{"class":78},[54,430,431],{"class":56,"line":128},[54,432,178],{"class":78},[54,434,435],{"class":56,"line":145},[54,436,184],{"class":78},[54,438,439],{"class":56,"line":153},[54,440,442],{"emptyLinePlaceholder":441},true,"\n",[54,444,445],{"class":56,"line":169},[54,446,447],{"class":60},"// 方法2: ルートごとに指定\n",[54,449,450,452,454,456],{"class":56,"line":175},[54,451,68],{"class":67},[54,453,71],{"class":67},[54,455,75],{"class":74},[54,457,79],{"class":78},[54,459,460,463],{"class":56,"line":181},[54,461,462],{"class":85},"  routeRules",[54,464,89],{"class":78},[54,466,468,471,474,476,479,482,484,486],{"class":56,"line":467},13,[54,469,470],{"class":101},"    '",[54,472,473],{"class":105},"/**",[54,475,275],{"class":101},[54,477,478],{"class":78},": { ",[54,480,481],{"class":85},"prerender",[54,483,98],{"class":78},[54,485,136],{"class":67},[54,487,488],{"class":78}," }\n",[54,490,492],{"class":56,"line":491},14,[54,493,178],{"class":78},[54,495,497],{"class":56,"line":496},15,[54,498,184],{"class":78},[41,500,502,503,505],{"id":501},"_2-cloudflare-pages-プリセットの誤解","2. ",[22,504,106],{}," プリセットの誤解",[18,507,508],{},[509,510,511],"strong",{},"このプリセット名が紛らわしい。",[18,513,514],{},"「Cloudflare Pages」と聞くと静的ホスティングをイメージするが、実際には：",[516,517,518,531],"table",{},[519,520,521],"thead",{},[522,523,524,528],"tr",{},[525,526,527],"th",{},"プリセット",[525,529,530],{},"実際の動作",[532,533,534,548,558],"tbody",{},[522,535,536,541],{},[537,538,539],"td",{},[22,540,106],{},[537,542,543,544,547],{},"Cloudflare ",[509,545,546],{},"Workers"," 上でSSRを実行",[522,549,550,555],{},[537,551,552],{},[22,553,554],{},"cloudflare",[537,556,557],{},"同上（エイリアス）",[522,559,560,565],{},[537,561,562],{},[22,563,564],{},"cloudflare-module",[537,566,567],{},"Workers（ESModules形式）",[18,569,570,571,574],{},"つまり「Pages」という名前だが、",[509,572,573],{},"動的なWorkers実行が前提","。",[18,576,577],{},"Cloudflare Pagesは以下の2つのモードを持つ：",[579,580,581,588],"ul",{},[582,583,584,587],"li",{},[509,585,586],{},"静的ファイル配信",": ビルド成果物をそのまま配信",[582,589,590,593],{},[509,591,592],{},"Functions (Workers)",": 動的処理をWorkers上で実行",[18,595,596,598],{},[22,597,106],{},"プリセットは後者を想定している。",[41,600,602],{"id":601},"_3-d1データベースの設定","3. D1データベースの設定",[18,604,605,608],{},[22,606,607],{},"wrangler.toml","にD1が設定されていた：",[45,610,612],{"className":187,"code":611,"language":189,"meta":50,"style":50},"[[d1_databases]]\nbinding = \"DB\"\ndatabase_name = \"nuxt-content-db\"\n",[22,613,614,618,622],{"__ignoreMap":50},[54,615,616],{"class":56,"line":57},[54,617,201],{},[54,619,620],{"class":56,"line":64},[54,621,206],{},[54,623,624],{"class":56,"line":82},[54,625,211],{},[18,627,628],{},"これはランタイムでのデータベースアクセスを想定した設定である。",[18,630,631],{},"Nuxt Content v3のドキュメントでは、D1を使った動的コンテンツ配信が紹介されているが、これは以下のようなユースケース向け：",[579,633,634,640,645],{},[582,635,636,639],{},[509,637,638],{},"動的に更新されるコンテンツ","（CMS連携）",[582,641,642],{},[509,643,644],{},"ユーザーごとに異なるコンテンツ",[582,646,647],{},[509,648,649],{},"APIルートでのデータベースアクセス",[18,651,652],{},"純粋なブログサイトには過剰な構成である。",[41,654,656,657,660],{"id":655},"_4-documentdriven-true-の影響","4. ",[22,658,659],{},"documentDriven: true"," の影響",[45,662,664],{"className":47,"code":663,"language":49,"meta":50,"style":50},"content: {\n  documentDriven: true,  // これが有効\n}\n",[22,665,666,675,689],{"__ignoreMap":50},[54,667,668,671,673],{"class":56,"line":57},[54,669,670],{"class":74},"content",[54,672,237],{"class":78},[54,674,240],{"class":78},[54,676,677,680,682,684,686],{"class":56,"line":64},[54,678,679],{"class":74},"  documentDriven",[54,681,237],{"class":78},[54,683,259],{"class":67},[54,685,282],{"class":78},[54,687,688],{"class":60},"  // これが有効\n",[54,690,691],{"class":56,"line":82},[54,692,301],{"class":78},[18,694,695,698],{},[22,696,697],{},"documentDriven","モードは：",[579,700,701,704,710],{},[582,702,703],{},"URLに基づいてコンテンツを自動取得",[582,705,706,709],{},[22,707,708],{},"[...slug].vue","でのクエリを自動化",[582,711,712],{},[509,713,714],{},"動的なコンテンツ取得を前提としている",[18,716,717],{},"静的生成と併用可能だが、プリレンダリング設定がないとSSRになる。",[41,719,721],{"id":720},"_5-nuxt-content-v3の新アーキテクチャ","5. Nuxt Content v3の新アーキテクチャ",[18,723,724],{},"Nuxt Content v3は大きくアーキテクチャが変わった：",[516,726,727,740],{},[519,728,729],{},[522,730,731,734,737],{},[525,732,733],{},"項目",[525,735,736],{},"v2",[525,738,739],{},"v3",[532,741,742,753,764,775,786],{},[522,743,744,747,750],{},[537,745,746],{},"データストレージ",[537,748,749],{},"JSONファイル",[537,751,752],{},"SQLite",[522,754,755,758,761],{},[537,756,757],{},"クエリ実行",[537,759,760],{},"メモリ内",[537,762,763],{},"SQLクエリ",[522,765,766,769,772],{},[537,767,768],{},"ビルド成果物",[537,770,771],{},"静的JSON",[537,773,774],{},"圧縮SQLiteダンプ",[522,776,777,780,783],{},[537,778,779],{},"ランタイム（静的）",[537,781,782],{},"なし",[537,784,785],{},"WASM SQLite（ブラウザ内）",[522,787,788,791,793],{},[537,789,790],{},"ランタイム（動的）",[537,792,782],{},[537,794,795],{},"D1 / LibSQL",[18,797,798],{},"v3のドキュメントやチュートリアルでは、D1との連携が強調されている。これがSSR構成を選択した理由の一つ。",[18,800,801,802,809],{},"しかし、",[803,804,808],"a",{"href":805,"rel":806},"https://content.nuxt.com/docs/deploy/static",[807],"nofollow","公式ドキュメント","によると：",[811,812,813],"blockquote",{},[18,814,815],{},"Nuxt Content can be deployed to static hosting using Nuxt prerendering.\nNuxt Content will load the database in the browser using WASM SQLite.",[18,817,818],{},"つまり静的生成でも問題なく動作する。",[34,820],{},[14,822,823],{"id":823},"解決策",[41,825,826],{"id":826},"最小限の修正",[18,828,829,832],{},[22,830,831],{},"nuxt.config.ts","にプリレンダリング設定を追加：",[45,834,836],{"className":47,"code":835,"language":49,"meta":50,"style":50},"export default defineNuxtConfig({\n  nitro: {\n    preset: \"cloudflare-pages\",\n    prerender: {\n      crawlLinks: true,    // リンクを辿って全ページを生成\n      routes: ['/blog', '/']  // 確実に生成したいルート\n    }\n  },\n  // ... 他の設定\n})\n",[22,837,838,848,854,868,874,888,917,921,925,930],{"__ignoreMap":50},[54,839,840,842,844,846],{"class":56,"line":57},[54,841,68],{"class":67},[54,843,71],{"class":67},[54,845,75],{"class":74},[54,847,79],{"class":78},[54,849,850,852],{"class":56,"line":64},[54,851,86],{"class":85},[54,853,89],{"class":78},[54,855,856,858,860,862,864,866],{"class":56,"line":82},[54,857,95],{"class":85},[54,859,98],{"class":78},[54,861,102],{"class":101},[54,863,106],{"class":105},[54,865,102],{"class":101},[54,867,262],{"class":78},[54,869,870,872],{"class":56,"line":92},[54,871,412],{"class":85},[54,873,89],{"class":78},[54,875,876,878,880,882,885],{"class":56,"line":114},[54,877,419],{"class":85},[54,879,98],{"class":78},[54,881,136],{"class":67},[54,883,884],{"class":78},",    ",[54,886,887],{"class":60},"// リンクを辿って全ページを生成\n",[54,889,890,893,896,898,900,902,905,907,909,911,914],{"class":56,"line":120},[54,891,892],{"class":85},"      routes",[54,894,895],{"class":78},": [",[54,897,275],{"class":101},[54,899,28],{"class":105},[54,901,275],{"class":101},[54,903,904],{"class":78},", ",[54,906,275],{"class":101},[54,908,24],{"class":105},[54,910,275],{"class":101},[54,912,913],{"class":78},"]  ",[54,915,916],{"class":60},"// 確実に生成したいルート\n",[54,918,919],{"class":56,"line":128},[54,920,172],{"class":78},[54,922,923],{"class":56,"line":145},[54,924,117],{"class":78},[54,926,927],{"class":56,"line":153},[54,928,929],{"class":60},"  // ... 他の設定\n",[54,931,932],{"class":56,"line":169},[54,933,184],{"class":78},[41,935,937],{"id":936},"d1データベースは必要か","D1データベースは必要か？",[18,939,940,574],{},[509,941,942],{},"純粋なブログサイトなら不要",[18,944,945],{},"削除してもよい項目：",[45,947,949],{"className":187,"code":948,"language":189,"meta":50,"style":50},"# wrangler.toml から削除可能\n# [[d1_databases]]\n# binding = \"DB\"\n# database_name = \"nuxt-content-db\"\n# database_id = \"...\"\n",[22,950,951,956,961,966,971],{"__ignoreMap":50},[54,952,953],{"class":56,"line":57},[54,954,955],{},"# wrangler.toml から削除可能\n",[54,957,958],{"class":56,"line":64},[54,959,960],{},"# [[d1_databases]]\n",[54,962,963],{"class":56,"line":82},[54,964,965],{},"# binding = \"DB\"\n",[54,967,968],{"class":56,"line":92},[54,969,970],{},"# database_name = \"nuxt-content-db\"\n",[54,972,973],{"class":56,"line":114},[54,974,975],{},"# database_id = \"...\"\n",[18,977,978],{},"ただし、以下の場合は残す：",[579,980,981,984],{},[582,982,983],{},"APIルートでDBを使う予定がある",[582,985,986],{},"動的なコンテンツ管理機能を追加する予定",[41,988,989],{"id":989},"ビルドコマンドの違い",[45,991,995],{"className":992,"code":993,"language":994,"meta":50,"style":50},"language-bash shiki shiki-themes vitesse-light vitesse-light","# SSR用ビルド（現状）\npnpm build\n\n# 静的生成（推奨）\npnpm generate  # または nuxt generate\n","bash",[22,996,997,1002,1010,1014,1019],{"__ignoreMap":50},[54,998,999],{"class":56,"line":57},[54,1000,1001],{"class":60},"# SSR用ビルド（現状）\n",[54,1003,1004,1007],{"class":56,"line":64},[54,1005,1006],{"class":74},"pnpm",[54,1008,1009],{"class":105}," build\n",[54,1011,1012],{"class":56,"line":82},[54,1013,442],{"emptyLinePlaceholder":441},[54,1015,1016],{"class":56,"line":92},[54,1017,1018],{"class":60},"# 静的生成（推奨）\n",[54,1020,1021,1023,1026],{"class":56,"line":114},[54,1022,1006],{"class":74},[54,1024,1025],{"class":105}," generate",[54,1027,1028],{"class":60},"  # または nuxt generate\n",[18,1030,1031,1034,1035,1038],{},[22,1032,1033],{},"pnpm build","でもプリレンダリング設定があれば静的ファイルが生成されるが、",[22,1036,1037],{},"pnpm generate","の方が意図が明確。",[34,1040],{},[14,1042,1043],{"id":1043},"修正後の期待値",[516,1045,1046,1058],{},[519,1047,1048],{},[522,1049,1050,1052,1055],{},[525,1051,733],{},[525,1053,1054],{},"修正前",[525,1056,1057],{},"修正後",[532,1059,1060,1071,1081,1091],{},[522,1061,1062,1065,1068],{},[537,1063,1064],{},"ページ遷移時間",[537,1066,1067],{},"2-3秒",[537,1069,1070],{},"50-200ms",[522,1072,1073,1076,1079],{},[537,1074,1075],{},"Workerコールドスタート",[537,1077,1078],{},"あり",[537,1080,782],{},[522,1082,1083,1086,1088],{},[537,1084,1085],{},"D1クエリ",[537,1087,1078],{},[537,1089,1090],{},"なし（ビルド時に解決）",[522,1092,1093,1096,1099],{},[537,1094,1095],{},"ランタイムコスト",[537,1097,1098],{},"Workers実行分",[537,1100,1101],{},"ほぼゼロ",[34,1103],{},[14,1105,1106],{"id":1106},"教訓",[41,1108,1110],{"id":1109},"_1-プリセット名に惑わされない","1. プリセット名に惑わされない",[18,1112,1113,1115],{},[22,1114,106],{},"という名前でも動的SSRが前提である。静的サイトにするには明示的な設定が必要。",[41,1117,1119],{"id":1118},"_2-nuxt-3はssrがデフォルト","2. Nuxt 3はSSRがデフォルト",[18,1121,1122,1123,1126,1127,1129],{},"Nuxt 2時代の",[22,1124,1125],{},"nuxt generate","の感覚でいると静的生成されない。",[22,1128,481],{},"を明示的に設定する。",[41,1131,1133],{"id":1132},"_3-ブログサイトにd1は過剰","3. ブログサイトにD1は過剰",[18,1135,1136],{},"Nuxt Content v3がD1連携を推していても、純粋なブログなら静的生成で十分である。WASM SQLiteがブラウザ内で動作するため、クライアントサイドナビゲーションも問題ない。",[41,1138,1140],{"id":1139},"_4-パフォーマンス計測の重要性","4. パフォーマンス計測の重要性",[18,1142,1143],{},"本番環境で実際にページ遷移してみないと問題に気づかない。Lighthouseだけでなく、実際のユーザー体験も確認すべき。",[34,1145],{},[14,1147,1148],{"id":1148},"関連ドキュメント",[579,1150,1151],{},[582,1152,1153,1157],{},[803,1154,1156],{"href":1155},"/nuxt-content-d1-not-used","Nuxt Content v3：D1データベースは本当に必要なのか？"," - D1が実際には使われていなかった事実についての詳細解説",[14,1159,1160],{"id":1160},"参考リンク",[579,1162,1163,1169,1176,1183],{},[582,1164,1165],{},[803,1166,1168],{"href":805,"rel":1167},[807],"Nuxt Content - Static Hosting",[582,1170,1171],{},[803,1172,1175],{"href":1173,"rel":1174},"https://www.docs4.dev/posts/nuxt-3-hybrid-rendering-pre-render-dynamic-routes-ssg",[807],"Nuxt 3 Hybrid Rendering - Pre-render Dynamic Routes",[582,1177,1178],{},[803,1179,1182],{"href":1180,"rel":1181},"https://blog.risingstack.com/nuxt-3-rendering-modes/",[807],"Nuxt 3 Rendering Strategies",[582,1184,1185],{},[803,1186,1189],{"href":1187,"rel":1188},"https://gonzalohirsch.com/blog/ultimate-guide-ssg-caching-with-nuxt-3/",[807],"Ultimate Guide: SSG Caching for Nuxt 3",[1191,1192,1193],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}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 .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}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);}",{"title":50,"searchDepth":64,"depth":64,"links":1195},[1196,1197,1201,1205,1214,1219,1220,1226,1227],{"id":16,"depth":64,"text":16},{"id":38,"depth":64,"text":39,"children":1198},[1199,1200],{"id":43,"depth":82,"text":43},{"id":219,"depth":82,"text":219},{"id":306,"depth":64,"text":307,"children":1202},[1203,1204],{"id":310,"depth":82,"text":311},{"id":322,"depth":82,"text":323},{"id":334,"depth":64,"text":335,"children":1206},[1207,1208,1210,1211,1213],{"id":338,"depth":82,"text":339},{"id":501,"depth":82,"text":1209},"2. cloudflare-pages プリセットの誤解",{"id":601,"depth":82,"text":602},{"id":655,"depth":82,"text":1212},"4. documentDriven: true の影響",{"id":720,"depth":82,"text":721},{"id":823,"depth":64,"text":823,"children":1215},[1216,1217,1218],{"id":826,"depth":82,"text":826},{"id":936,"depth":82,"text":937},{"id":989,"depth":82,"text":989},{"id":1043,"depth":64,"text":1043},{"id":1106,"depth":64,"text":1106,"children":1221},[1222,1223,1224,1225],{"id":1109,"depth":82,"text":1110},{"id":1118,"depth":82,"text":1119},{"id":1132,"depth":82,"text":1133},{"id":1139,"depth":82,"text":1140},{"id":1148,"depth":64,"text":1148},{"id":1160,"depth":64,"text":1160},null,"Nuxt Content + Cloudflare Pages構成で、ページ遷移に2-3秒かかる問題の原因分析と解決策。なぜSSRがデフォルトになっていたのか、ブログサイトにSSGが適切な理由を解説","md",{},"/ssr-vs-ssg-page-transition-slow",false,"2025-12-05T00:00:00.000Z",{"title":5,"description":1229},"2025-12/2025-12-05/ssr-vs-ssg-page-transition-slow",[1238,554,1239,1240,1241,1242],"nuxt","SSR","SSG","performance","troubleshooting","rhcGo80PQFeGqmX5mrPliPukRLjZDFZ203UaryGX2rU",[],[1246,1250,1254,1258,1262],{"title":1247,"path":1248,"publishedAt":1249},"Nuxt SSRエラー対策: データ分割とClientOnly","/nuxt-client-only-guide","2025-12-15T00:00:00.000Z",{"title":1251,"path":1252,"publishedAt":1253},"Cloudflare Pages はもう Workers の中に住んでいる ― Static Assets 統合後の地図","/cloudflare-pages-to-workers-static-assets","2026-06-29T00:00:00.000Z",{"title":1255,"path":1256,"publishedAt":1257},"Cloudflare Pages の 1MB Worker bundle 制限に当たって構成図A〜Dを書きながら設計判断を整理した","/cloudflare-pages-workers-bundle-architecture","2026-06-16T00:00:00.000Z",{"title":1259,"path":1260,"publishedAt":1261},"非公開記事一覧をGoogleにインデックスさせない仕組みを点検した話","/unpublished-noindex","2026-06-01T00:00:00.000Z",{"title":1263,"path":1264,"publishedAt":1265},"Cloudflare Pages SSG の OOM を Excel 教材データ分離で根本対応した話 — Codex 再帰レビューと SSR fetch 404 の突破","/excel-data-separation-cloudflare-ssg-oom","2026-05-10T00:00:00.000Z","https://log.eurekapu.com/og/blog/ssr-vs-ssg-page-transition-slow.png?v=2025-12-05T00%3A00%3A00.000Z&title=%E3%83%9A%E3%83%BC%E3%82%B8%E9%81%B7%E7%A7%BB%E3%81%8C%E9%81%85%E3%81%84%E5%95%8F%E9%A1%8C%EF%BC%9ASSR%20vs%20SSG%20%E3%81%AE%E9%81%B8%E6%8A%9E%E3%83%9F%E3%82%B9&author=Kei%20Komatsu&sig=60bb4955bd817f9f",1785654963534]