[{"data":1,"prerenderedAt":132},["ShallowReactive",2],{"article-\u002Fblog\u002Ftech\u002Fnuxt4-migration":3},{"id":4,"title":5,"body":6,"category":114,"date":115,"description":116,"draft":117,"extension":118,"meta":119,"navigation":120,"path":121,"seo":122,"stem":123,"tags":124,"thumbnail":128,"thumbnailAlt":129,"updatedAt":130,"__hash__":131},"blog\u002Fblog\u002Ftech\u002Fnuxt4-migration.md","Nuxt 4 への移行で学んだこと",{"type":7,"value":8,"toc":99},"minimark",[9,13,17,20,24,49,52,66,69,73,84,87,93,96],[10,11,12],"h2",{"id":12},"はじめに",[14,15,16],"p",{},"個人ブログのフロントを Nuxt 3 から Nuxt 4 に移行してみました。互換レイヤーが用意されているとはいえ、いくつか手を入れる箇所があったので、気づきを残しておきます。",[10,18,19],{"id":19},"主な変更点",[21,22,23],"h3",{"id":23},"ディレクトリ構成",[14,25,26,30,31,34,35,34,38,41,42,45,46,48],{},[27,28,29],"code",{},"app\u002F"," ディレクトリが標準になり、",[27,32,33],{},"pages\u002F","・",[27,36,37],{},"components\u002F",[27,39,40],{},"composables\u002F"," などはこの配下に置く構成が推奨になりました。既存プロジェクトは ",[27,43,44],{},"compatibilityVersion"," を切り替えるだけでも動きますが、新規ならフラットに ",[27,47,29],{}," 配下にまとめておくのが見通しがよさそうです。",[21,50,51],{"id":51},"データ取得",[14,53,54,57,58,61,62,65],{},[27,55,56],{},"useAsyncData"," や ",[27,59,60],{},"useFetch"," の挙動と型は基本的に同じですが、一部のオプションで挙動が整理されています。レンダー前に必要なデータは、引き続き ",[27,63,64],{},"await"," 付きで取りに行く形が安全です。",[10,67,68],{"id":68},"詰まったところ",[21,70,72],{"id":71},"nuxt-content-の差分","Nuxt Content の差分",[14,74,75,76,79,80,83],{},"Content v3 では Collection API が追加され、",[27,77,78],{},"queryCollection('blog')"," のように扱う形に変わっていました。",[27,81,82],{},"queryContent"," 系のクエリは自前のラッパーを書いていた箇所と整合が取れず、書き直しが必要でした。",[21,85,86],{"id":86},"型推論",[14,88,89,92],{},[27,90,91],{},"schema"," で frontmatter を定義していると、コレクションから取り出した値がきちんと型付けされて気持ちよく書けます。最初に schema をしっかり書いておくと、あとで楽でした。",[10,94,95],{"id":95},"やってみた感想",[14,97,98],{},"「動かなくなる」というよりは「整理されて素直になった」という印象の移行でした。必要な範囲だけ手を入れて、徐々にディレクトリ構成も新しい形に寄せていく予定です。",{"title":100,"searchDepth":101,"depth":101,"links":102},"",3,[103,105,109,113],{"id":12,"depth":104,"text":12},2,{"id":19,"depth":104,"text":19,"children":106},[107,108],{"id":23,"depth":101,"text":23},{"id":51,"depth":101,"text":51},{"id":68,"depth":104,"text":68,"children":110},[111,112],{"id":71,"depth":101,"text":72},{"id":86,"depth":101,"text":86},{"id":95,"depth":104,"text":95},"tech","2026-04-25","Nuxt 3 から Nuxt 4 へのマイグレーションで遭遇した変更点と、その対処法を整理します。",false,"md",{},true,"\u002Fblog\u002Ftech\u002Fnuxt4-migration",{"title":5,"description":116},"blog\u002Ftech\u002Fnuxt4-migration",[125,126,127],"Nuxt","Vue.js","Web開発","\u002Fimages\u002Fblog\u002Fnuxt4-migration\u002Fthumbnail.jpg","Nuxt 4 移行作業のイメージ","2026-04-28","a7nAmClA8PEzcXMh4jylI_Gwhv72OYLqF9TDIBQFvAw",1777432174707]