[{"data":1,"prerenderedAt":524},["ShallowReactive",2],{"page-/post/nuxt/nuxt3.15.2-upgrade-report":3,"surrounding-page":515},{"id":4,"title":5,"author":6,"body":7,"date":502,"description":13,"extension":503,"group":6,"lastmod":504,"meta":505,"navigation":235,"path":507,"rawbody":508,"seo":509,"showTitle":6,"stem":510,"tags":511,"versions":6,"__hash__":514},"content/post/nuxt/Nuxt3.15.2-upgrade-report.md","Nuxt3.15.2升级报告",null,{"type":8,"value":9,"toc":498},"minimark",[10,14,18,48,51,54,61,64,244,257,345,355,361,368,373,386,478,481,488,494],[11,12,13],"p",{},"Nuxt3.15.1 升级到 3.15.2 ，同时 nuxt/content@3.0.0-alpha.8 升级到了 3.0.0-alpha.9",[15,16,17],"h2",{"id":17},"升级方式",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-shell shiki shiki-themes github-light","npx nuxi@latest upgrade --force\n","shell","",[26,27,28],"code",{"__ignoreMap":24},[29,30,33,37,41,44],"span",{"class":31,"line":32},"line",1,[29,34,36],{"class":35},"s7eDp","npx",[29,38,40],{"class":39},"sYBdl"," nuxi@latest",[29,42,43],{"class":39}," upgrade",[29,45,47],{"class":46},"sYu0t"," --force\n",[11,49,50],{},"运行后 nuxt/content 会同步升级，慎重！",[15,52,53],{"id":53},"破坏性",[11,55,56,60],{},[57,58,59],"strong",{},"queryCollectionNavigation"," 的查询结果发生了改变",[11,62,63],{},"比如，我的这个collection定义如下：",[19,65,69],{"className":66,"code":67,"language":68,"meta":24,"style":24},"language-typescript shiki shiki-themes github-light","book: defineCollection({\n    type: 'page',\n    source: {\n      include: 'book/**/*.md',\n      exclude: ['book/**/-*.md'],\n      repository: 'https://github.com/aatrooox/Blog',\n      authToken: process.env.CONTENT_REPO_TOKEN\n    },\n    schema: z.object({\n      date: z.date(),\n      lastmod: z.date(),\n      tags: z.array(z.string()),\n      versions: z.array(z.string()),\n    })\n  }),\n\n// book/nuxt-book1/install/demo.md\n","typescript",[26,70,71,86,98,104,115,127,138,147,153,164,176,186,204,218,224,230,237],{"__ignoreMap":24},[29,72,73,76,80,83],{"class":31,"line":32},[29,74,75],{"class":35},"book",[29,77,79],{"class":78},"sgsFI",": ",[29,81,82],{"class":35},"defineCollection",[29,84,85],{"class":78},"({\n",[29,87,89,92,95],{"class":31,"line":88},2,[29,90,91],{"class":78},"    type: ",[29,93,94],{"class":39},"'page'",[29,96,97],{"class":78},",\n",[29,99,101],{"class":31,"line":100},3,[29,102,103],{"class":78},"    source: {\n",[29,105,107,110,113],{"class":31,"line":106},4,[29,108,109],{"class":78},"      include: ",[29,111,112],{"class":39},"'book/**/*.md'",[29,114,97],{"class":78},[29,116,118,121,124],{"class":31,"line":117},5,[29,119,120],{"class":78},"      exclude: [",[29,122,123],{"class":39},"'book/**/-*.md'",[29,125,126],{"class":78},"],\n",[29,128,130,133,136],{"class":31,"line":129},6,[29,131,132],{"class":78},"      repository: ",[29,134,135],{"class":39},"'https://github.com/aatrooox/Blog'",[29,137,97],{"class":78},[29,139,141,144],{"class":31,"line":140},7,[29,142,143],{"class":78},"      authToken: process.env.",[29,145,146],{"class":46},"CONTENT_REPO_TOKEN\n",[29,148,150],{"class":31,"line":149},8,[29,151,152],{"class":78},"    },\n",[29,154,156,159,162],{"class":31,"line":155},9,[29,157,158],{"class":78},"    schema: z.",[29,160,161],{"class":35},"object",[29,163,85],{"class":78},[29,165,167,170,173],{"class":31,"line":166},10,[29,168,169],{"class":78},"      date: z.",[29,171,172],{"class":35},"date",[29,174,175],{"class":78},"(),\n",[29,177,179,182,184],{"class":31,"line":178},11,[29,180,181],{"class":78},"      lastmod: z.",[29,183,172],{"class":35},[29,185,175],{"class":78},[29,187,189,192,195,198,201],{"class":31,"line":188},12,[29,190,191],{"class":78},"      tags: z.",[29,193,194],{"class":35},"array",[29,196,197],{"class":78},"(z.",[29,199,200],{"class":35},"string",[29,202,203],{"class":78},"()),\n",[29,205,207,210,212,214,216],{"class":31,"line":206},13,[29,208,209],{"class":78},"      versions: z.",[29,211,194],{"class":35},[29,213,197],{"class":78},[29,215,200],{"class":35},[29,217,203],{"class":78},[29,219,221],{"class":31,"line":220},14,[29,222,223],{"class":78},"    })\n",[29,225,227],{"class":31,"line":226},15,[29,228,229],{"class":78},"  }),\n",[29,231,233],{"class":31,"line":232},16,[29,234,236],{"emptyLinePlaceholder":235},true,"\n",[29,238,240],{"class":31,"line":239},17,[29,241,243],{"class":242},"sAwPA","// book/nuxt-book1/install/demo.md\n",[11,245,246,247,249,250,253,254,256],{},"alpha.8 时， ",[26,248,59],{}," 是不会包含最外层的目录的。数组直接以 ",[26,251,252],{},"nuxt-book1"," 开始，现在会最顶层的 ",[26,255,75],{}," 也带上，导致我的博客小册相关的查询都要重构一下，这更新多少有点抽象了，不懂为什么改成这样的逻辑。",[19,258,260],{"className":66,"code":259,"language":68,"meta":24,"style":24},"const { data: books } = await useAsyncData('navigation', () => {\n  return queryCollectionNavigation('book', ['date', 'path', 'id'])\n})\n",[26,261,262,307,340],{"__ignoreMap":24},[29,263,264,268,271,275,277,280,283,286,289,292,295,298,301,304],{"class":31,"line":32},[29,265,267],{"class":266},"sD7c4","const",[29,269,270],{"class":78}," { ",[29,272,274],{"class":273},"sqxcx","data",[29,276,79],{"class":78},[29,278,279],{"class":46},"books",[29,281,282],{"class":78}," } ",[29,284,285],{"class":266},"=",[29,287,288],{"class":266}," await",[29,290,291],{"class":35}," useAsyncData",[29,293,294],{"class":78},"(",[29,296,297],{"class":39},"'navigation'",[29,299,300],{"class":78},", () ",[29,302,303],{"class":266},"=>",[29,305,306],{"class":78}," {\n",[29,308,309,312,315,317,320,323,326,329,332,334,337],{"class":31,"line":88},[29,310,311],{"class":266},"  return",[29,313,314],{"class":35}," queryCollectionNavigation",[29,316,294],{"class":78},[29,318,319],{"class":39},"'book'",[29,321,322],{"class":78},", [",[29,324,325],{"class":39},"'date'",[29,327,328],{"class":78},", ",[29,330,331],{"class":39},"'path'",[29,333,328],{"class":78},[29,335,336],{"class":39},"'id'",[29,338,339],{"class":78},"])\n",[29,341,342],{"class":31,"line":100},[29,343,344],{"class":78},"})\n",[11,346,347,348,351,352,354],{},"以前 ",[26,349,350],{},"books.value","  就是 book 目录下的文件树，现在 ",[26,353,279],{}," 是包含了根节点的整棵树",[11,356,357,358],{},"所以如何",[57,359,360],{},"涉及到使用此导航树渲染的菜单都要改",[11,362,363,364,367],{},"另外，由于查询默认带上了根节点，所以导致每个文件的 ",[26,365,366],{},"path"," 也附带了完整的路径，从这个角度上看，这样改是合理的。",[11,369,370],{},[57,371,372],{},"如果以前跳转时，自己拼接了前缀，也要去掉",[11,374,375,376,378,379,381,382,385],{},"同时因为 ",[26,377,366],{}," 是完整的路径了，所以查询单个 ",[26,380,75],{}," 时, 直接用 ",[26,383,384],{},".path"," 就行了",[19,387,389],{"className":66,"code":388,"language":68,"meta":24,"style":24},"const { data: page, error, refresh } = await useAsyncData(hash(route.path + 'page'), () => {\n  // 删掉前缀\n  return queryCollection('book').path(route.path).first()\n}, { watch: [route.query]})\n",[26,390,391,443,448,473],{"__ignoreMap":24},[29,392,393,395,397,399,401,404,406,409,411,414,416,418,420,422,424,427,430,433,436,439,441],{"class":31,"line":32},[29,394,267],{"class":266},[29,396,270],{"class":78},[29,398,274],{"class":273},[29,400,79],{"class":78},[29,402,403],{"class":46},"page",[29,405,328],{"class":78},[29,407,408],{"class":46},"error",[29,410,328],{"class":78},[29,412,413],{"class":46},"refresh",[29,415,282],{"class":78},[29,417,285],{"class":266},[29,419,288],{"class":266},[29,421,291],{"class":35},[29,423,294],{"class":78},[29,425,426],{"class":35},"hash",[29,428,429],{"class":78},"(route.path ",[29,431,432],{"class":266},"+",[29,434,435],{"class":39}," 'page'",[29,437,438],{"class":78},"), () ",[29,440,303],{"class":266},[29,442,306],{"class":78},[29,444,445],{"class":31,"line":88},[29,446,447],{"class":242},"  // 删掉前缀\n",[29,449,450,452,455,457,459,462,464,467,470],{"class":31,"line":100},[29,451,311],{"class":266},[29,453,454],{"class":35}," queryCollection",[29,456,294],{"class":78},[29,458,319],{"class":39},[29,460,461],{"class":78},").",[29,463,366],{"class":35},[29,465,466],{"class":78},"(route.path).",[29,468,469],{"class":35},"first",[29,471,472],{"class":78},"()\n",[29,474,475],{"class":31,"line":106},[29,476,477],{"class":78},"}, { watch: [route.query]})\n",[11,479,480],{},"上个版本应该是不行的，不然我应该不会用 id 查",[11,482,483,484,487],{},"总之，查询单个md内容，直接用 ",[26,485,486],{},"queryCollection().path()"," 就行",[11,489,490,491,493],{},"而涉及到 ",[26,492,59],{},"  的部分，总结就是不管怎么筛选和查询，他会始终附带根节点",[495,496,497],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":24,"searchDepth":88,"depth":88,"links":499},[500,501],{"id":17,"depth":88,"text":17},{"id":53,"depth":88,"text":53},"2025-01-16T00:00:00.000Z","md","2025-08-19T00:00:00.000Z",{"describtion":506},"Nuxt3.15.2、 NuxtContent 升级踩坑报告","/post/nuxt/nuxt3.15.2-upgrade-report","---\ntitle: Nuxt3.15.2升级报告\ndate: 2025-01-16\nlastmod: 2025-08-19\ndescribtion: Nuxt3.15.2、 NuxtContent 升级踩坑报告\ntags: [\"Nuxt\", \"issue\"]\n\n---\nNuxt3.15.1 升级到 3.15.2 ，同时 nuxt/content@3.0.0-alpha.8 升级到了 3.0.0-alpha.9\n\n## 升级方式\n\n```shell\nnpx nuxi@latest upgrade --force\n```\n\n运行后 nuxt/content 会同步升级，慎重！\n## 破坏性\n\n**queryCollectionNavigation** 的查询结果发生了改变\n\n比如，我的这个collection定义如下：\n\n```typescript\nbook: defineCollection({\n    type: 'page',\n    source: {\n      include: 'book/**/*.md',\n      exclude: ['book/**/-*.md'],\n      repository: 'https://github.com/aatrooox/Blog',\n      authToken: process.env.CONTENT_REPO_TOKEN\n    },\n    schema: z.object({\n      date: z.date(),\n      lastmod: z.date(),\n      tags: z.array(z.string()),\n      versions: z.array(z.string()),\n    })\n  }),\n\n// book/nuxt-book1/install/demo.md\n```\n\nalpha.8 时， `queryCollectionNavigation` 是不会包含最外层的目录的。数组直接以 `nuxt-book1` 开始，现在会最顶层的 `book` 也带上，导致我的博客小册相关的查询都要重构一下，这更新多少有点抽象了，不懂为什么改成这样的逻辑。\n\n```typescript\nconst { data: books } = await useAsyncData('navigation', () => {\n  return queryCollectionNavigation('book', ['date', 'path', 'id'])\n})\n```\n\n以前 `books.value`  就是 book 目录下的文件树，现在 `books` 是包含了根节点的整棵树\n\n所以如何**涉及到使用此导航树渲染的菜单都要改**\n\n另外，由于查询默认带上了根节点，所以导致每个文件的 `path` 也附带了完整的路径，从这个角度上看，这样改是合理的。\n\n**如果以前跳转时，自己拼接了前缀，也要去掉**\n\n同时因为 `path` 是完整的路径了，所以查询单个 `book` 时, 直接用 `.path` 就行了\n\n```typescript\nconst { data: page, error, refresh } = await useAsyncData(hash(route.path + 'page'), () => {\n  // 删掉前缀\n  return queryCollection('book').path(route.path).first()\n}, { watch: [route.query]})\n```\n\n上个版本应该是不行的，不然我应该不会用 id 查\n\n总之，查询单个md内容，直接用 `queryCollection().path()` 就行\n\n而涉及到 `queryCollectionNavigation`  的部分，总结就是不管怎么筛选和查询，他会始终附带根节点",{"title":5,"description":13},"post/nuxt/Nuxt3.15.2-upgrade-report",[512,513],"Nuxt","issue","MnjLXQn6AO2MjU81x-zzmoRlLEkouAgh8U-qAa_MpK4",[516,520],{"title":517,"path":518,"stem":519},"OpenClaw 安装入门（Windows）","/post/zzao/openclaw/openclaw-install-windows","post/zzao/openclaw/openclaw-install-windows",{"title":521,"path":522,"stem":523},"假设你是AI，你的Skill应该是什么样的","/post/zzao/ai-skill-structure","post/zzao/ai-skill-structure",1779005086305]