[{"data":1,"prerenderedAt":1106},["ShallowReactive",2],{"content-/coding-standards-viewer-toc-reactivity-fix":3,"all-pages-for-dir":1085,"related-/coding-standards-viewer-toc-reactivity-fix":1086,"og-image-/coding-standards-viewer-toc-reactivity-fix":1105},{"id":4,"title":5,"body":6,"category":1069,"concepts":1069,"description":1070,"extension":1071,"meta":1072,"navigation":116,"ogImage":1069,"path":1073,"project_name":1069,"published":1074,"publishedAt":1075,"seo":1076,"source":1069,"stem":1077,"tags":1078,"todo":1069,"unpublished":1074,"updatedAt":1069,"__hash__":1084},"pages/2025-11/2025-11-18/coding-standards-viewer-toc-reactivity-fix.md","コーディング規約ビューアのTOC開閉バグ修正",{"type":7,"value":8,"toc":1043},"minimark",[9,13,17,21,38,41,52,55,59,63,68,379,383,394,398,419,422,426,429,434,741,744,842,845,852,855,858,869,873,881,884,888,984,987,1005,1008,1033,1036,1039],[10,11,5],"h1",{"id":12},"コーディング規約ビューアのtoc開閉バグ修正",[14,15,16],"h2",{"id":16},"問題の症状",[18,19,20],"h3",{"id":20},"発生環境",[22,23,24,32],"ul",{},[25,26,27,31],"li",{},[28,29,30],"strong",{},"ローカル開発",": 問題なし",[25,33,34,37],{},[28,35,36],{},"Cloudflare Pages デプロイ後",": Table of Contents（目次）のセクション開閉ができない",[18,39,40],{"id":40},"具体的な症状",[22,42,43,46,49],{},[25,44,45],{},"左サイドバーのTable of Contentsで、セクションタイトルをクリックしても開閉されない",[25,47,48],{},"セクションの開閉状態が変更されない",[25,50,51],{},"スクロールによる自動開閉も動作しない",[14,53,54],{"id":54},"原因",[18,56,58],{"id":57},"vueのリアクティビティとsetの問題","VueのリアクティビティとSetの問題",[60,61,62],"p",{},"VueのリアクティブシステムはSetオブジェクトの変更を適切に検知できない場合があります。",[60,64,65],{},[28,66,67],{},"問題のコード:",[69,70,75],"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-javascript shiki shiki-themes vitesse-light vitesse-light","const openSections = ref(new Set());\n\nfunction toggleSection(sectionTitle) {\n  if (openSections.value.has(sectionTitle)) {\n    openSections.value.delete(sectionTitle);  // ❌ リアクティブに検知されない\n  } else {\n    openSections.value.add(sectionTitle);     // ❌ リアクティブに検知されない\n  }\n}\n\nwatch(activeIndex, (newIndex) => {\n  const currentStep = steps.value[newIndex];\n  if (currentStep && currentStep.section) {\n    openSections.value.clear();               // ❌ リアクティブに検知されない\n    openSections.value.add(currentStep.section);\n  }\n});\n","javascript","",[76,77,78,111,118,138,171,197,208,231,237,243,248,274,300,324,344,368,373],"code",{"__ignoreMap":74},[79,80,83,87,91,95,99,102,105,108],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"stQ0i","const",[79,88,90],{"class":89},"s4oTP"," openSections",[79,92,94],{"class":93},"shFtX"," =",[79,96,98],{"class":97},"senZ8"," ref",[79,100,101],{"class":93},"(",[79,103,104],{"class":85},"new",[79,106,107],{"class":97}," Set",[79,109,110],{"class":93},"());\n",[79,112,114],{"class":81,"line":113},2,[79,115,117],{"emptyLinePlaceholder":116},true,"\n",[79,119,121,124,127,129,132,135],{"class":81,"line":120},3,[79,122,123],{"class":85},"function",[79,125,126],{"class":97}," toggleSection",[79,128,101],{"class":93},[79,130,131],{"class":89},"sectionTitle",[79,133,134],{"class":93},")",[79,136,137],{"class":93}," {\n",[79,139,141,145,148,151,154,157,159,162,164,166,169],{"class":81,"line":140},4,[79,142,144],{"class":143},"sHkkW","  if",[79,146,147],{"class":93}," (",[79,149,150],{"class":89},"openSections",[79,152,153],{"class":93},".",[79,155,156],{"class":89},"value",[79,158,153],{"class":93},[79,160,161],{"class":97},"has",[79,163,101],{"class":93},[79,165,131],{"class":89},[79,167,168],{"class":93},"))",[79,170,137],{"class":93},[79,172,174,177,179,181,183,186,188,190,193],{"class":81,"line":173},5,[79,175,176],{"class":89},"    openSections",[79,178,153],{"class":93},[79,180,156],{"class":89},[79,182,153],{"class":93},[79,184,185],{"class":97},"delete",[79,187,101],{"class":93},[79,189,131],{"class":89},[79,191,192],{"class":93},");",[79,194,196],{"class":195},"sxvE3","  // ❌ リアクティブに検知されない\n",[79,198,200,203,206],{"class":81,"line":199},6,[79,201,202],{"class":93},"  }",[79,204,205],{"class":143}," else",[79,207,137],{"class":93},[79,209,211,213,215,217,219,222,224,226,228],{"class":81,"line":210},7,[79,212,176],{"class":89},[79,214,153],{"class":93},[79,216,156],{"class":89},[79,218,153],{"class":93},[79,220,221],{"class":97},"add",[79,223,101],{"class":93},[79,225,131],{"class":89},[79,227,192],{"class":93},[79,229,230],{"class":195},"     // ❌ リアクティブに検知されない\n",[79,232,234],{"class":81,"line":233},8,[79,235,236],{"class":93},"  }\n",[79,238,240],{"class":81,"line":239},9,[79,241,242],{"class":93},"}\n",[79,244,246],{"class":81,"line":245},10,[79,247,117],{"emptyLinePlaceholder":116},[79,249,251,254,256,259,262,264,267,269,272],{"class":81,"line":250},11,[79,252,253],{"class":97},"watch",[79,255,101],{"class":93},[79,257,258],{"class":89},"activeIndex",[79,260,261],{"class":93},",",[79,263,147],{"class":93},[79,265,266],{"class":89},"newIndex",[79,268,134],{"class":93},[79,270,271],{"class":93}," =>",[79,273,137],{"class":93},[79,275,277,280,283,285,288,290,292,295,297],{"class":81,"line":276},12,[79,278,279],{"class":85},"  const",[79,281,282],{"class":89}," currentStep",[79,284,94],{"class":93},[79,286,287],{"class":89}," steps",[79,289,153],{"class":93},[79,291,156],{"class":89},[79,293,294],{"class":93},"[",[79,296,266],{"class":89},[79,298,299],{"class":93},"];\n",[79,301,303,305,307,310,313,315,317,320,322],{"class":81,"line":302},13,[79,304,144],{"class":143},[79,306,147],{"class":93},[79,308,309],{"class":89},"currentStep",[79,311,312],{"class":85}," &&",[79,314,282],{"class":89},[79,316,153],{"class":93},[79,318,319],{"class":89},"section",[79,321,134],{"class":93},[79,323,137],{"class":93},[79,325,327,329,331,333,335,338,341],{"class":81,"line":326},14,[79,328,176],{"class":89},[79,330,153],{"class":93},[79,332,156],{"class":89},[79,334,153],{"class":93},[79,336,337],{"class":97},"clear",[79,339,340],{"class":93},"();",[79,342,343],{"class":195},"               // ❌ リアクティブに検知されない\n",[79,345,347,349,351,353,355,357,359,361,363,365],{"class":81,"line":346},15,[79,348,176],{"class":89},[79,350,153],{"class":93},[79,352,156],{"class":89},[79,354,153],{"class":93},[79,356,221],{"class":97},[79,358,101],{"class":93},[79,360,309],{"class":89},[79,362,153],{"class":93},[79,364,319],{"class":89},[79,366,367],{"class":93},");\n",[79,369,371],{"class":81,"line":370},16,[79,372,236],{"class":93},[79,374,376],{"class":81,"line":375},17,[79,377,378],{"class":93},"});\n",[18,380,382],{"id":381},"なぜローカルでは動作したのか","なぜローカルでは動作したのか？",[22,384,385,388,391],{},[25,386,387],{},"開発環境とプロダクション環境でのVueのビルド設定の違い",[25,389,390],{},"Hot Module Replacement (HMR)による強制的な再レンダリング",[25,392,393],{},"デバッグモードでの追加のリアクティビティチェック",[18,395,397],{"id":396},"なぜデプロイ後に問題が発生したのか","なぜデプロイ後に問題が発生したのか？",[399,400,401,407,413],"ol",{},[25,402,403,406],{},[28,404,405],{},"プロダクションビルドの最適化",": Viteのプロダクションビルドでは、リアクティビティの検知が厳密になる",[25,408,409,412],{},[28,410,411],{},"キャッシュの影響",": ユーザーが指摘した通り、古いバージョンのキャッシュを見ていた可能性もある",[25,414,415,418],{},[28,416,417],{},"Cloudflare環境の違い",": エッジでの実行環境がローカルと異なる可能性",[14,420,421],{"id":421},"解決方法",[18,423,425],{"id":424},"setからarrayへの変更","SetからArrayへの変更",[60,427,428],{},"Setの代わりに配列を使用することで、Vueのリアクティブシステムが確実に変更を検知できるようにしました。",[60,430,431],{},[28,432,433],{},"修正後のコード:",[69,435,437],{"className":71,"code":436,"language":73,"meta":74,"style":74},"// Setから配列に変更\nconst openSections = ref([]);\n\nfunction toggleSection(sectionTitle) {\n  const index = openSections.value.indexOf(sectionTitle);\n  if (index > -1) {\n    openSections.value.splice(index, 1);  // ✅ リアクティブに検知される\n  } else {\n    openSections.value.push(sectionTitle);     // ✅ リアクティブに検知される\n  }\n}\n\nfunction isSectionOpen(sectionTitle) {\n  return openSections.value.includes(sectionTitle);\n}\n\nwatch(activeIndex, (newIndex) => {\n  const currentStep = steps.value[newIndex];\n  if (currentStep && currentStep.section) {\n    // 配列の再代入で確実にリアクティブ\n    openSections.value = [currentStep.section];  // ✅ リアクティブに検知される\n  }\n});\n",[76,438,439,444,457,461,475,501,524,551,559,581,585,589,593,608,630,634,638,658,679,700,706,731,736],{"__ignoreMap":74},[79,440,441],{"class":81,"line":82},[79,442,443],{"class":195},"// Setから配列に変更\n",[79,445,446,448,450,452,454],{"class":81,"line":113},[79,447,86],{"class":85},[79,449,90],{"class":89},[79,451,94],{"class":93},[79,453,98],{"class":97},[79,455,456],{"class":93},"([]);\n",[79,458,459],{"class":81,"line":120},[79,460,117],{"emptyLinePlaceholder":116},[79,462,463,465,467,469,471,473],{"class":81,"line":140},[79,464,123],{"class":85},[79,466,126],{"class":97},[79,468,101],{"class":93},[79,470,131],{"class":89},[79,472,134],{"class":93},[79,474,137],{"class":93},[79,476,477,479,482,484,486,488,490,492,495,497,499],{"class":81,"line":173},[79,478,279],{"class":85},[79,480,481],{"class":89}," index",[79,483,94],{"class":93},[79,485,90],{"class":89},[79,487,153],{"class":93},[79,489,156],{"class":89},[79,491,153],{"class":93},[79,493,494],{"class":97},"indexOf",[79,496,101],{"class":93},[79,498,131],{"class":89},[79,500,367],{"class":93},[79,502,503,505,507,510,513,516,520,522],{"class":81,"line":199},[79,504,144],{"class":143},[79,506,147],{"class":93},[79,508,509],{"class":89},"index",[79,511,512],{"class":93}," >",[79,514,515],{"class":85}," -",[79,517,519],{"class":518},"sM54T","1",[79,521,134],{"class":93},[79,523,137],{"class":93},[79,525,526,528,530,532,534,537,539,541,543,546,548],{"class":81,"line":210},[79,527,176],{"class":89},[79,529,153],{"class":93},[79,531,156],{"class":89},[79,533,153],{"class":93},[79,535,536],{"class":97},"splice",[79,538,101],{"class":93},[79,540,509],{"class":89},[79,542,261],{"class":93},[79,544,545],{"class":518}," 1",[79,547,192],{"class":93},[79,549,550],{"class":195},"  // ✅ リアクティブに検知される\n",[79,552,553,555,557],{"class":81,"line":233},[79,554,202],{"class":93},[79,556,205],{"class":143},[79,558,137],{"class":93},[79,560,561,563,565,567,569,572,574,576,578],{"class":81,"line":239},[79,562,176],{"class":89},[79,564,153],{"class":93},[79,566,156],{"class":89},[79,568,153],{"class":93},[79,570,571],{"class":97},"push",[79,573,101],{"class":93},[79,575,131],{"class":89},[79,577,192],{"class":93},[79,579,580],{"class":195},"     // ✅ リアクティブに検知される\n",[79,582,583],{"class":81,"line":245},[79,584,236],{"class":93},[79,586,587],{"class":81,"line":250},[79,588,242],{"class":93},[79,590,591],{"class":81,"line":276},[79,592,117],{"emptyLinePlaceholder":116},[79,594,595,597,600,602,604,606],{"class":81,"line":302},[79,596,123],{"class":85},[79,598,599],{"class":97}," isSectionOpen",[79,601,101],{"class":93},[79,603,131],{"class":89},[79,605,134],{"class":93},[79,607,137],{"class":93},[79,609,610,613,615,617,619,621,624,626,628],{"class":81,"line":326},[79,611,612],{"class":143},"  return",[79,614,90],{"class":89},[79,616,153],{"class":93},[79,618,156],{"class":89},[79,620,153],{"class":93},[79,622,623],{"class":97},"includes",[79,625,101],{"class":93},[79,627,131],{"class":89},[79,629,367],{"class":93},[79,631,632],{"class":81,"line":346},[79,633,242],{"class":93},[79,635,636],{"class":81,"line":370},[79,637,117],{"emptyLinePlaceholder":116},[79,639,640,642,644,646,648,650,652,654,656],{"class":81,"line":375},[79,641,253],{"class":97},[79,643,101],{"class":93},[79,645,258],{"class":89},[79,647,261],{"class":93},[79,649,147],{"class":93},[79,651,266],{"class":89},[79,653,134],{"class":93},[79,655,271],{"class":93},[79,657,137],{"class":93},[79,659,661,663,665,667,669,671,673,675,677],{"class":81,"line":660},18,[79,662,279],{"class":85},[79,664,282],{"class":89},[79,666,94],{"class":93},[79,668,287],{"class":89},[79,670,153],{"class":93},[79,672,156],{"class":89},[79,674,294],{"class":93},[79,676,266],{"class":89},[79,678,299],{"class":93},[79,680,682,684,686,688,690,692,694,696,698],{"class":81,"line":681},19,[79,683,144],{"class":143},[79,685,147],{"class":93},[79,687,309],{"class":89},[79,689,312],{"class":85},[79,691,282],{"class":89},[79,693,153],{"class":93},[79,695,319],{"class":89},[79,697,134],{"class":93},[79,699,137],{"class":93},[79,701,703],{"class":81,"line":702},20,[79,704,705],{"class":195},"    // 配列の再代入で確実にリアクティブ\n",[79,707,709,711,713,715,717,720,722,724,726,729],{"class":81,"line":708},21,[79,710,176],{"class":89},[79,712,153],{"class":93},[79,714,156],{"class":89},[79,716,94],{"class":93},[79,718,719],{"class":93}," [",[79,721,309],{"class":89},[79,723,153],{"class":93},[79,725,319],{"class":89},[79,727,728],{"class":93},"];",[79,730,550],{"class":195},[79,732,734],{"class":81,"line":733},22,[79,735,236],{"class":93},[79,737,739],{"class":81,"line":738},23,[79,740,378],{"class":93},[18,742,743],{"id":743},"変更内容の詳細",[745,746,747,763],"table",{},[748,749,750],"thead",{},[751,752,753,757,760],"tr",{},[754,755,756],"th",{},"項目",[754,758,759],{},"変更前（Set）",[754,761,762],{},"変更後（Array）",[764,765,766,782,797,812,827],"tbody",{},[751,767,768,772,777],{},[769,770,771],"td",{},"初期化",[769,773,774],{},[76,775,776],{},"ref(new Set())",[769,778,779],{},[76,780,781],{},"ref([])",[751,783,784,787,792],{},[769,785,786],{},"追加",[769,788,789],{},[76,790,791],{},".add(item)",[769,793,794],{},[76,795,796],{},".push(item)",[751,798,799,802,807],{},[769,800,801],{},"削除",[769,803,804],{},[76,805,806],{},".delete(item)",[769,808,809],{},[76,810,811],{},".splice(index, 1)",[751,813,814,817,822],{},[769,815,816],{},"存在チェック",[769,818,819],{},[76,820,821],{},".has(item)",[769,823,824],{},[76,825,826],{},".includes(item)",[751,828,829,832,837],{},[769,830,831],{},"クリア",[769,833,834],{},[76,835,836],{},".clear()",[769,838,839],{},[76,840,841],{},"value = []",[14,843,844],{"id":844},"修正ファイル",[22,846,847],{},[25,848,849],{},[76,850,851],{},"apps/web/app/pages/coding-standards/viewer/index.vue",[14,853,854],{"id":854},"テスト結果",[18,856,857],{"id":857},"ローカル環境",[22,859,860,863,866],{},[25,861,862],{},"✅ セクションの開閉が正常に動作",[25,864,865],{},"✅ スクロールによる自動開閉が正常に動作",[25,867,868],{},"✅ 前へ/次へボタンによる移動時の自動開閉が正常に動作",[18,870,872],{"id":871},"デプロイ環境cloudflare-pages","デプロイ環境（Cloudflare Pages）",[22,874,875,877,879],{},[25,876,862],{},[25,878,865],{},[25,880,868],{},[14,882,883],{"id":883},"教訓",[18,885,887],{"id":886},"vueのリアクティビティのベストプラクティス","Vueのリアクティビティのベストプラクティス",[399,889,890,896,906],{},[25,891,892,895],{},[28,893,894],{},"配列を使う",": 可能な限り配列を使用する",[25,897,898,901,902,905],{},[28,899,900],{},"refの値を直接変更",": ",[76,903,904],{},"ref.value = newValue"," の形で代入する",[25,907,908,911,912],{},[28,909,910],{},"Setを使う場合",": 必ず値全体を再代入する\n",[69,913,915],{"className":71,"code":914,"language":73,"meta":74,"style":74},"// ❌ 悪い例\nmySet.value.add(item)\n\n// ✅ 良い例\nmySet.value = new Set([...mySet.value, item])\n",[76,916,917,922,943,947,952],{"__ignoreMap":74},[79,918,919],{"class":81,"line":82},[79,920,921],{"class":195},"// ❌ 悪い例\n",[79,923,924,927,929,931,933,935,937,940],{"class":81,"line":113},[79,925,926],{"class":89},"mySet",[79,928,153],{"class":93},[79,930,156],{"class":89},[79,932,153],{"class":93},[79,934,221],{"class":97},[79,936,101],{"class":93},[79,938,939],{"class":89},"item",[79,941,942],{"class":93},")\n",[79,944,945],{"class":81,"line":120},[79,946,117],{"emptyLinePlaceholder":116},[79,948,949],{"class":81,"line":140},[79,950,951],{"class":195},"// ✅ 良い例\n",[79,953,954,956,958,960,962,965,967,970,972,974,976,978,981],{"class":81,"line":173},[79,955,926],{"class":89},[79,957,153],{"class":93},[79,959,156],{"class":89},[79,961,94],{"class":93},[79,963,964],{"class":85}," new",[79,966,107],{"class":97},[79,968,969],{"class":93},"([...",[79,971,926],{"class":89},[79,973,153],{"class":93},[79,975,156],{"class":89},[79,977,261],{"class":93},[79,979,980],{"class":89}," item",[79,982,983],{"class":93},"])\n",[18,985,986],{"id":986},"デプロイ前のチェックリスト",[399,988,989,992,999,1002],{},[25,990,991],{},"✅ ローカルでのテスト",[25,993,994,995,998],{},"✅ プロダクションビルドでのテスト（",[76,996,997],{},"pnpm build && pnpm preview","）",[25,1000,1001],{},"✅ リアクティビティが必要な状態管理は配列または単純なオブジェクトを使用",[25,1003,1004],{},"✅ デプロイ後のキャッシュクリアを確認",[14,1006,1007],{"id":1007},"関連リンク",[22,1009,1010,1019,1026],{},[25,1011,1012],{},[1013,1014,1018],"a",{"href":1015,"rel":1016},"https://vuejs.org/guide/essentials/reactivity-fundamentals.html",[1017],"nofollow","Vue 3 Reactivity Fundamentals",[25,1020,1021],{},[1013,1022,1025],{"href":1023,"rel":1024},"https://vuejs.org/guide/extras/reactivity-in-depth.html",[1017],"Vue 3 Reactivity in Depth",[25,1027,1028],{},[1013,1029,1032],{"href":1030,"rel":1031},"https://vitejs.dev/guide/build.html",[1017],"Vite Production Build",[14,1034,1035],{"id":1035},"まとめ",[60,1037,1038],{},"VueのリアクティブシステムはSetの変更を適切に検知できない場合があるため、開閉状態の管理には配列を使用することが推奨される。ローカル環境で問題なく動作していても、プロダクション環境で問題が発生する可能性があるため、プロダクションビルドでのテストが重要である。",[1040,1041,1042],"style",{},"html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}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 .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}",{"title":74,"searchDepth":113,"depth":113,"links":1044},[1045,1049,1054,1058,1059,1063,1067,1068],{"id":16,"depth":113,"text":16,"children":1046},[1047,1048],{"id":20,"depth":120,"text":20},{"id":40,"depth":120,"text":40},{"id":54,"depth":113,"text":54,"children":1050},[1051,1052,1053],{"id":57,"depth":120,"text":58},{"id":381,"depth":120,"text":382},{"id":396,"depth":120,"text":397},{"id":421,"depth":113,"text":421,"children":1055},[1056,1057],{"id":424,"depth":120,"text":425},{"id":743,"depth":120,"text":743},{"id":844,"depth":113,"text":844},{"id":854,"depth":113,"text":854,"children":1060},[1061,1062],{"id":857,"depth":120,"text":857},{"id":871,"depth":120,"text":872},{"id":883,"depth":113,"text":883,"children":1064},[1065,1066],{"id":886,"depth":120,"text":887},{"id":986,"depth":120,"text":986},{"id":1007,"depth":113,"text":1007},{"id":1035,"depth":113,"text":1035},null,"Cloudflareデプロイ後にTable of Contentsの開閉ができなくなった問題の原因と解決方法","md",{},"/coding-standards-viewer-toc-reactivity-fix",false,"2025-11-18T00:00:00.000Z",{"title":5,"description":1070},"2025-11/2025-11-18/coding-standards-viewer-toc-reactivity-fix",[1079,1080,1081,1082,1083],"vue","nuxt","reactivity","bug-fix","cloudflare","TJNAosjp93PNH7j5g9JbEjwhCQKMss4azDppuN4fArw",[],[1087,1091,1095,1098,1102],{"title":1088,"path":1089,"publishedAt":1090},"Webサービスの技術構成 2026年版 — Vue.js/Nuxt/Astroの使い分けとその理由","/web-tech-stack-2026","2026-07-22T00:00:00.000Z",{"title":1092,"path":1093,"publishedAt":1094},"cockpit-nuxt-vuetify Nuxt 4 移行計画（新規プロジェクト方式）","/nuxt2-to-nuxt4-migration-plan","2026-01-07T00:00:00.000Z",{"title":1096,"path":1097,"publishedAt":1075},"コーディング規約ビューアページのバグ分析と修正計画","/coding-standards-viewer-bugs-analysis",{"title":1099,"path":1100,"publishedAt":1101},"全18講に触って動くシミュレーターを入れた日 — PR12本のレビューから講座導線の作り直しまで","/code-course-interactive-rollout","2026-07-26T00:00:00.000Z",{"title":1103,"path":1104,"publishedAt":1101},"インタラクティブ教材を1枚に集約し、本文の線を減らした日","/interactive-content-consolidation","https://log.eurekapu.com/og/blog/coding-standards-viewer-toc-reactivity-fix.png?v=2025-11-18T00%3A00%3A00.000Z&title=%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84%E3%83%93%E3%83%A5%E3%83%BC%E3%82%A2%E3%81%AETOC%E9%96%8B%E9%96%89%E3%83%90%E3%82%B0%E4%BF%AE%E6%AD%A3&author=Kei%20Komatsu&sig=dbe288abff55415d",1785654661595]