[{"data":1,"prerenderedAt":4922},["ShallowReactive",2],{"docs-all-flat":3,"docs-\u002Fdocs\u002Fdirectory-structure\u002Fserver":1018},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,355,359,363,367,371,375,379,383,387,391,395,399,403,407,411,415,419,423,427,431,435,439,443,447,451,455,459,463,467,471,475,479,483,487,491,495,499,503,507,511,515,519,523,527,531,535,539,543,547,551,555,559,563,567,571,575,579,583,587,591,595,599,603,607,611,615,619,623,627,631,635,639,643,647,651,655,659,663,667,671,675,679,683,687,691,695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,770,774,778,782,786,790,794,798,802,806,809,813,817,821,825,829,833,837,841,845,849,852,855,859,863,867,871,874,877,881,884,888,892,895,898,901,904,907,911,915,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014],{"path":5,"title":6,"description":7},"\u002Fdocs\u002Fgetting-started\u002Fintroduction","介绍","Nuxt 的目标是提供直观且高性能的 Web 开发体验，并始终将优秀的开发者体验（Developer Experience）放在心上。",{"path":9,"title":10,"description":11},"\u002Fdocs\u002Fgetting-started\u002Finstallation","安装","通过在线 starter 快速上手 Nuxt，或在本地使用终端从零开始。",{"path":13,"title":14,"description":15},"\u002Fdocs\u002Fgetting-started\u002Fconfiguration","配置","Nuxt 提供了合理的默认配置，让你高效开发。",{"path":17,"title":18,"description":19},"\u002Fdocs\u002Fgetting-started\u002Fviews","视图","Nuxt 提供了多个组件层来实现应用的用户界面。",{"path":21,"title":22,"description":23},"\u002Fdocs\u002Fgetting-started\u002Fassets","资源","Nuxt 为你的资源提供了两种处理方式。",{"path":25,"title":26,"description":27},"\u002Fdocs\u002Fgetting-started\u002Fstyling","样式","了解如何为你的 Nuxt 应用添加样式。",{"path":29,"title":30,"description":31},"\u002Fdocs\u002Fgetting-started\u002Frouting","路由","Nuxt 的文件系统路由会为 pages\u002F 目录中的每个文件创建一条路由。",{"path":33,"title":34,"description":35},"\u002Fdocs\u002Fgetting-started\u002Fseo-meta","SEO 与 Meta","借助强大的 head 配置、composables 和组件，改善你的 Nuxt 应用的 SEO。",{"path":37,"title":38,"description":39},"\u002Fdocs\u002Fgetting-started\u002Ftransitions","过渡","使用 Vue 或浏览器原生的 View Transitions，在页面和布局之间应用过渡效果。",{"path":41,"title":42,"description":43},"\u002Fdocs\u002Fgetting-started\u002Fdata-fetching","数据获取","Nuxt 提供了用于处理应用内数据获取的 composables。",{"path":45,"title":46,"description":47},"\u002Fdocs\u002Fgetting-started\u002Fstate-management","状态管理","Nuxt 提供了强大的状态管理库和 useState composable，用于创建响应式且对 SSR 友好的共享状态。",{"path":49,"title":50,"description":51},"\u002Fdocs\u002Fgetting-started\u002Ferror-handling","错误处理","了解如何在 Nuxt 中捕获和处理错误。",{"path":53,"title":54,"description":55},"\u002Fdocs\u002Fgetting-started\u002Fserver","Server","利用 Nuxt 的服务端框架构建全栈应用。你可以从数据库或其他服务端获取数据、创建 API，甚至生成像站点地图或 RSS 这样的静态服务端内容——全部来自同一个代码库。",{"path":57,"title":58,"description":59},"\u002Fdocs\u002Fgetting-started\u002Flayers","Layers","Nuxt 提供了一套强大的系统，允许你扩展默认文件、配置以及更多内容。",{"path":61,"title":62,"description":63},"\u002Fdocs\u002Fgetting-started\u002Fprerendering","Prerendering","Nuxt 允许在构建时静态渲染某些页面，以改善特定的性能或 SEO 指标。",{"path":65,"title":66,"description":67},"\u002Fdocs\u002Fgetting-started\u002Fdeployment","Deployment","了解如何将你的 Nuxt 应用部署到任何托管提供商。",{"path":69,"title":70,"description":71},"\u002Fdocs\u002Fgetting-started\u002Ftesting","Testing","如何测试你的 Nuxt 应用。",{"path":73,"title":74,"description":75},"\u002Fdocs\u002Fgetting-started\u002Fupgrade","Upgrade Guide","了解如何升级到最新的 Nuxt 版本。",{"path":77,"title":78,"description":79},"\u002Fdocs\u002Fdirectory-structure\u002Fnuxt",".nuxt","Nuxt 在开发阶段使用 .nuxt\u002F 目录来生成你的 Vue 应用。",{"path":81,"title":82,"description":83},"\u002Fdocs\u002Fdirectory-structure\u002Foutput",".output","Nuxt 在为生产环境构建应用时创建 .output\u002F 目录。",{"path":85,"title":86,"description":87},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fassets","assets","assets\u002F 目录用于添加所有将由构建工具处理的网站资源。",{"path":89,"title":90,"description":91},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fcomponents","components","components\u002F 目录用于存放你所有的 Vue 组件。",{"path":93,"title":94,"description":95},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fcomposables","composables","使用 composables\u002F 目录将你的 Vue 组合式函数自动导入到应用中。",{"path":97,"title":98,"description":99},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Flayouts","layouts","Nuxt 提供了一个布局框架，用于将通用的 UI 模式提取为可复用的布局。",{"path":101,"title":102,"description":103},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fmiddleware","middleware","Nuxt 提供中间件，用于在导航到特定路由前运行代码。",{"path":105,"title":106,"description":107},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fpages","pages","Nuxt 提供基于文件的路由，用于在 Web 应用中创建路由。",{"path":109,"title":110,"description":111},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fplugins","plugins","Nuxt 拥有一个插件系统，用于在创建 Vue 应用时使用 Vue 插件等。",{"path":113,"title":114,"description":115},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Futils","utils","使用 utils\u002F 目录在你的应用中自动导入工具函数。",{"path":117,"title":118,"description":119},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fapp","app.vue","app.vue 文件是你 Nuxt 应用的主组件。",{"path":121,"title":122,"description":123},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fapp-config","app.config.ts","使用 App Config 文件在应用内部暴露响应式配置。",{"path":125,"title":126,"description":127},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Ferror","error.vue","error.vue 文件是你 Nuxt 应用中的错误页面。",{"path":129,"title":130,"description":131},"\u002Fdocs\u002Fdirectory-structure\u002Fcontent","content","使用 content\u002F 目录为你的应用创建一个基于文件的 CMS。",{"path":133,"title":134,"description":135},"\u002Fdocs\u002Fdirectory-structure\u002Flayers","layers","使用 layers\u002F 目录在你的应用中组织和自动注册本地 layers。",{"path":137,"title":138,"description":139},"\u002Fdocs\u002Fdirectory-structure\u002Fmodules","modules","使用 modules\u002F 目录在你的应用中自动注册本地模块。",{"path":141,"title":142,"description":143},"\u002Fdocs\u002Fdirectory-structure\u002Fnode_modules","node_modules","包管理器将项目的依赖存储在 node_modules\u002F 目录中。",{"path":145,"title":146,"description":147},"\u002Fdocs\u002Fdirectory-structure\u002Fpublic","public","public\u002F 目录用于提供网站的静态资源。",{"path":149,"title":150,"description":151},"\u002Fdocs\u002Fdirectory-structure\u002Fserver","server","server\u002F 目录用于为你的应用注册 API 和服务端处理器。",{"path":153,"title":154,"description":155},"\u002Fdocs\u002Fdirectory-structure\u002Fshared","shared","使用 shared\u002F 目录在 Vue 应用和 Nitro 服务端之间共享功能。",{"path":157,"title":158,"description":159},"\u002Fdocs\u002Fdirectory-structure\u002Fenv",".env",".env 文件用于指定构建\u002F开发时的环境变量。",{"path":161,"title":162,"description":163},"\u002Fdocs\u002Fdirectory-structure\u002Fgitignore",".gitignore",".gitignore 文件用于指定 git 应当忽略的、有意不跟踪的文件。",{"path":165,"title":166,"description":167},"\u002Fdocs\u002Fdirectory-structure\u002Fnuxtignore",".nuxtignore",".nuxtignore 文件用于让 Nuxt 在构建阶段忽略项目根目录中的文件。",{"path":169,"title":170,"description":171},"\u002Fdocs\u002Fdirectory-structure\u002Fnuxtrc",".nuxtrc",".nuxtrc 文件允许你用扁平语法定义 Nuxt 配置。",{"path":173,"title":174,"description":175},"\u002Fdocs\u002Fdirectory-structure\u002Fnuxt-config","nuxt.config.ts","只需要一个 nuxt.config 文件，即可轻松配置 Nuxt。",{"path":177,"title":178,"description":179},"\u002Fdocs\u002Fdirectory-structure\u002Fpackage","package.json","package.json 文件包含你应用的所有依赖和脚本。",{"path":181,"title":182,"description":183},"\u002Fdocs\u002Fdirectory-structure\u002Ftsconfig","tsconfig.json","了解 Nuxt 如何在项目的不同部分管理 TypeScript 配置。",{"path":185,"title":186,"description":187},"\u002Fdocs\u002Fdirectory-structure","Nuxt 目录结构","了解 Nuxt 应用的目录结构以及如何使用它。",{"path":189,"title":190,"description":191},"\u002Fdocs\u002Fguide","Nuxt 指南","通过深入的指南了解 Nuxt 的工作原理。",{"path":193,"title":194,"description":195},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Frendering","渲染模式","了解 Nuxt 中可用的不同渲染模式。",{"path":197,"title":198,"description":199},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fvuejs-development","Vue.js 开发","Nuxt 使用 Vue.js，并添加了组件自动导入、基于文件的路由以及支持 SSR 的组合式函数等特性。",{"path":201,"title":202,"description":203},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fnuxt-lifecycle","Nuxt 生命周期","理解 Nuxt 应用的生命周期，可以帮助你更深入地了解框架是如何运作的，尤其是在服务端渲染和客户端渲染两方面。",{"path":205,"title":206,"description":207},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fauto-imports","自动导入","Nuxt 会自动导入组件、组合式函数、辅助函数和 Vue API。",{"path":209,"title":210,"description":211},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fserver-engine","服务端引擎","Nuxt 由一个全新的服务端引擎驱动：Nitro。",{"path":213,"title":214,"description":215},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fmodules","模块","Nuxt 提供了一个模块系统来扩展框架核心并简化集成。",{"path":217,"title":218,"description":219},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fesm","ES 模块","Nuxt 使用原生的 ES 模块。",{"path":221,"title":222,"description":223},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Ftypescript","TypeScript","Nuxt 完全类型化，并提供了有用的快捷方式，确保你在编码时能获取准确的类型信息。",{"path":225,"title":226,"description":227},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fcode-style","代码风格","Nuxt 开箱即用地支持 ESLint",{"path":229,"title":230,"description":231},"\u002Fdocs\u002Fguide\u002Fbest-practices\u002Fdevcontainers","Dev Containers","在开发容器中设置或打开 Nuxt 项目，以获得一致开发环境。",{"path":233,"title":234,"description":235},"\u002Fdocs\u002Fguide\u002Fbest-practices\u002Fhydration","Nuxt and Hydration","为什么修复水合问题很重要",{"path":237,"title":238,"description":239},"\u002Fdocs\u002Fguide\u002Fbest-practices\u002Fperformance","Nuxt performance","提升 Nuxt 应用性能的最佳实践。",{"path":241,"title":242,"description":243},"\u002Fdocs\u002Fguide\u002Fbest-practices\u002Fplugins","Nuxt Plugins","使用 Nuxt 插件时的最佳实践。",{"path":245,"title":246,"description":247},"\u002Fdocs\u002Fguide\u002Fai\u002Fmcp","Nuxt MCP Server","借助 Model Context Protocol 支持，在你的 AI 助手中使用 Nuxt 文档。",{"path":249,"title":250,"description":251},"\u002Fdocs\u002Fguide\u002Fai\u002Fllms-txt","Nuxt LLMs.txt","如何让 Cursor、Windsurf、GitHub Copilot、ChatGPT 和 Claude 等 AI 工具理解 Nuxt 的概念、API 和最佳实践。",{"path":253,"title":254,"description":255},"\u002Fdocs\u002Fguide\u002Fmodules\u002Fgetting-started","创建你的第一个模块","学习如何使用官方启动模板创建你的第一个 Nuxt 模块。",{"path":257,"title":258,"description":259},"\u002Fdocs\u002Fguide\u002Fmodules\u002Fmodule-anatomy","理解模块结构","学习 Nuxt 模块是如何构成的，以及如何定义它们。",{"path":261,"title":262,"description":263},"\u002Fdocs\u002Fguide\u002Fmodules\u002Frecipes-basics","添加插件、组件等","学习如何从你的模块注入插件、组件、组合式函数和服务端路由。",{"path":265,"title":266,"description":267},"\u002Fdocs\u002Fguide\u002Fmodules\u002Fmodule-dependencies","模块依赖","声明对其它模块的依赖，并带有版本约束和配置合并。",{"path":269,"title":270,"description":271},"\u002Fdocs\u002Fguide\u002Fmodules\u002Frecipes-advanced","使用钩子与扩展类型","在你的模块中掌握生命周期钩子、虚拟文件和 TypeScript 声明。",{"path":273,"title":274,"description":275},"\u002Fdocs\u002Fguide\u002Fmodules\u002Ftesting","测试你的模块","学习如何对你的 Nuxt 模块进行单元、集成和 E2E 测试。",{"path":277,"title":278,"description":279},"\u002Fdocs\u002Fguide\u002Fmodules\u002Fbest-practices","遵循最佳实践","使用这些指南构建高性能且可维护的 Nuxt 模块。",{"path":281,"title":282,"description":283},"\u002Fdocs\u002Fguide\u002Fmodules\u002Fecosystem","发布与分享你的模块","加入 Nuxt 模块生态，并将你的模块发布到 npm。",{"path":285,"title":286,"description":287},"\u002Fdocs\u002Fguide\u002Fmodules","Module Author Guide","学习如何创建 Nuxt 模块，以集成、增强或扩展任意 Nuxt 应用。",{"path":289,"title":290,"description":291},"\u002Fdocs\u002Fguide\u002Frecipes\u002Fcustom-routing","自定义路由","在 Nuxt 中，你的路由由 pages 目录内文件的结构定义。不过，由于底层使用了 vue-router，Nuxt 提供了几种在你的项目中添加自定义路由的方式。",{"path":293,"title":294,"description":295},"\u002Fdocs\u002Fguide\u002Frecipes\u002Fvite-plugin","在 Nuxt 中使用 Vite 插件","学习如何将 Vite 插件集成到你的 Nuxt 项目中。",{"path":297,"title":298,"description":299},"\u002Fdocs\u002Fguide\u002Frecipes\u002Fcustom-usefetch","Nuxt 中的自定义 useFetch","如何在 Nuxt 中创建用于调用你外部 API 的自定义 fetcher。",{"path":301,"title":302,"description":303},"\u002Fdocs\u002Fguide\u002Frecipes\u002Fsessions-and-authentication","会话与鉴权","鉴权是 Web 应用中极其常见的需求。本配方将向你展示如何在你的 Nuxt 应用中实现基本的用户注册与鉴权。",{"path":305,"title":306,"description":307},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fevents","创建自定义事件","Nuxt 提供了一个由 hookable 驱动的强大事件系统。",{"path":309,"title":310,"description":311},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fexperimental-features","实验性特性","启用 Nuxt 实验性特性以解锁新的可能性。",{"path":313,"title":314,"description":315},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Ffeatures","特性开关","启用或禁用可选的 Nuxt 特性，以解锁新的可能性。",{"path":317,"title":318,"description":319},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Finternals","Nuxt 是如何工作的？","Nuxt 是一个极简但高度可定制的框架，用于构建 Web 应用。",{"path":321,"title":322,"description":323},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fruntime-config","运行时配置","Nuxt 提供了一套运行时配置 API，以在你的应用内暴露配置和密钥。",{"path":325,"title":326,"description":327},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fnightly-release-channel","Nightly 发布通道","nightly 发布通道允许使用直接从仓库最新提交构建的 Nuxt。",{"path":329,"title":330,"description":331},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fhooks","生命周期钩子","Nuxt 提供了一个强大的钩子系统，可使用钩子扩展几乎每个方面。",{"path":333,"title":334,"description":335},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fkit","Nuxt Kit","@nuxt\u002Fkit 提供了面向模块作者的功能。",{"path":337,"title":338,"description":339},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fnuxt-app","NuxtApp","在 Nuxt 中，你可以在组合式函数、组件和插件中访问运行时应用上下文。",{"path":341,"title":342,"description":343},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Flayers","编写 Nuxt Layers","Nuxt 提供了一个强大的系统，允许你扩展默认文件、配置等等。",{"path":345,"title":346,"description":347},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fbuilders","创建 Builder","了解 Nuxt builder 是如何工作的，以及如何编写你自己的 builder。",{"path":349,"title":350,"description":351},"\u002Fdocs\u002Fguide\u002Fgoing-further\u002Fdebugging","调试","在 Nuxt 中，你可以直接在浏览器中以及你的 IDE 里开始调试你的应用。",{"path":353,"title":354,"description":354},"\u002Fdocs\u002Fguide\u002Fgoing-further","",{"path":356,"title":357,"description":358},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fclient-only","\u003CClientOnly>","使用 \u003CClientOnly> 组件仅在客户端渲染组件。",{"path":360,"title":361,"description":362},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fdev-only","\u003CDevOnly>","使用 \u003CDevOnly> 组件仅在开发期间渲染组件。",{"path":364,"title":365,"description":366},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-client-fallback","\u003CNuxtClientFallback>","Nuxt 提供了 \u003CNuxtClientFallback> 组件，当其任意子组件在 SSR 中触发错误时，在客户端渲染其内容",{"path":368,"title":369,"description":370},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-picture","\u003CNuxtPicture>","Nuxt 提供了 \u003CNuxtPicture> 组件来处理自动图像优化。",{"path":372,"title":373,"description":374},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fteleports","\u003CTeleport>","\u003CTeleport> 组件将组件传送到 DOM 中的另一个位置。",{"path":376,"title":377,"description":378},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-route-announcer","\u003CNuxtRouteAnnouncer>","\u003CNuxtRouteAnnouncer> 组件添加一个带有页面标题的隐藏元素，用于向辅助技术播报路由变化。",{"path":380,"title":381,"description":382},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-time","\u003CNuxtTime>","\u003CNuxtTime> 组件以本地化友好的格式显示时间，并保持服务端-客户端一致。",{"path":384,"title":385,"description":386},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-announcer","\u003CNuxtAnnouncer>","\u003CNuxtAnnouncer> 组件添加一个隐藏元素，用于向辅助技术播报动态内容变化。",{"path":388,"title":389,"description":390},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-page","\u003CNuxtPage>","\u003CNuxtPage> 组件用于显示位于 pages\u002F 目录中的页面。",{"path":392,"title":393,"description":394},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-layout","\u003CNuxtLayout>","Nuxt 提供了 \u003CNuxtLayout> 组件，用于在页面和错误页面上显示布局。",{"path":396,"title":397,"description":398},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-link","\u003CNuxtLink>","Nuxt 提供了 \u003CNuxtLink> 组件来处理应用内的各类链接。",{"path":400,"title":401,"description":402},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-loading-indicator","\u003CNuxtLoadingIndicator>","在页面导航之间显示进度条。",{"path":404,"title":405,"description":406},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-error-boundary","\u003CNuxtErrorBoundary>","\u003CNuxtErrorBoundary> 组件处理其默认插槽中发生的客户端错误。",{"path":408,"title":409,"description":410},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-welcome","\u003CNuxtWelcome>","\u003CNuxtWelcome> 组件用于欢迎通过启动模板创建的新项目的用户。",{"path":412,"title":413,"description":414},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-island","\u003CNuxtIsland>","Nuxt 提供了 \u003CNuxtIsland> 组件，用于渲染无客户端 JS 的非交互式组件。",{"path":416,"title":417,"description":418},"\u002Fdocs\u002Fapi\u002Fcomponents\u002Fnuxt-img","\u003CNuxtImg>","Nuxt 提供了 \u003CNuxtImg> 组件来处理自动图像优化。",{"path":420,"title":421,"description":422},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fcreate-use-async-data","createUseAsyncData","一个工厂函数，用于创建带有预定义默认选项的自定义 useAsyncData 组合式函数。",{"path":424,"title":425,"description":426},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fcreate-use-fetch","createUseFetch","一个工厂函数，用于创建带有预定义默认选项的自定义 useFetch 组合式函数。",{"path":428,"title":429,"description":430},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fon-prehydrate","onPrehydrate","使用 onPrehydrate 在 Nuxt 对页面进行 hydration 之前的客户端立即运行回调。",{"path":432,"title":433,"description":434},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-announcer","useAnnouncer","一个用于向屏幕阅读器播报消息的组合式函数。",{"path":436,"title":437,"description":438},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-app-config","useAppConfig","访问在项目中定义的可响应 app config。",{"path":440,"title":441,"description":442},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-async-data","useAsyncData","useAsyncData 以 SSR 友好的方式提供对异步解析数据的访问。",{"path":444,"title":445,"description":446},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-cookie","useCookie","useCookie 是一个 SSR 友好的组合式函数，用于读写 cookie。",{"path":448,"title":449,"description":450},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-error","useError","useError 组合式函数返回正在被处理的全局 Nuxt 错误。",{"path":452,"title":453,"description":454},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-fetch","useFetch","使用 SSR 友好的组合式函数从 API 端点获取数据。",{"path":456,"title":457,"description":458},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-head","useHead","useHead 用于自定义 Nuxt 应用各个页面的 head 属性。",{"path":460,"title":461,"description":462},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-head-safe","useHeadSafe","处理用户输入时提供 head 数据的推荐方式。",{"path":464,"title":465,"description":466},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-hydration","useHydration","允许完全控制 hydration 周期，以便从服务端设置和接收数据。",{"path":468,"title":469,"description":470},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-layout","useLayout","useLayout 返回为当前路由解析出的布局。",{"path":472,"title":473,"description":474},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-lazy-async-data","useLazyAsyncData","该组合式函数包装 useAsyncData，会在 handler 解析之前立即触发导航。",{"path":476,"title":477,"description":478},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-lazy-fetch","useLazyFetch","该组合式函数是对 useFetch 的封装，会在 handler 解析之前立即触发导航。",{"path":480,"title":481,"description":482},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-loading-indicator","useLoadingIndicator","该组合式函数让你访问应用页面的加载状态。",{"path":484,"title":485,"description":486},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-nuxt-app","useNuxtApp","访问 Nuxt 应用的共享运行时上下文。",{"path":488,"title":489,"description":490},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-nuxt-data","useNuxtData","访问数据获取组合式函数的当前缓存值。",{"path":492,"title":493,"description":494},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-preview-mode","usePreviewMode","使用 usePreviewMode 检查并控制 Nuxt 的预览模式",{"path":496,"title":497,"description":498},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-request-event","useRequestEvent","使用 useRequestEvent 组合式函数访问传入的请求事件。",{"path":500,"title":501,"description":502},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-request-fetch","useRequestFetch","使用 useRequestFetch 组合式函数为服务端 fetch 请求转发请求上下文和请求头。",{"path":504,"title":505,"description":506},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-request-header","useRequestHeader","使用 useRequestHeader 访问某个特定的传入请求头。",{"path":508,"title":509,"description":510},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-request-headers","useRequestHeaders","使用 useRequestHeaders 访问传入的请求头。",{"path":512,"title":513,"description":514},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-request-url","useRequestURL","使用 useRequestURL 组合式函数访问传入的请求 URL。",{"path":516,"title":517,"description":518},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-response-header","useResponseHeader","使用 useResponseHeader 设置服务端响应头。",{"path":520,"title":521,"description":522},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-route","useRoute","useRoute 组合式函数返回当前路由。",{"path":524,"title":525,"description":526},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-route-announcer","useRouteAnnouncer","该组合式函数监视页面标题变化，并相应地更新播报消息。",{"path":528,"title":529,"description":530},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-router","useRouter","useRouter 组合式函数返回 router 实例。",{"path":532,"title":533,"description":534},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-runtime-config","useRuntimeConfig","使用 useRuntimeConfig 组合式函数访问运行时配置变量。",{"path":536,"title":537,"description":538},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-runtime-hook","useRuntimeHook","在 Nuxt 应用中注册一个运行时钩子，并确保在作用域销毁时被正确清理。",{"path":540,"title":541,"description":542},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-seo-meta","useSeoMeta","useSeoMeta 组合式函数让你可以将站点的 SEO meta 标签定义为一个扁平对象，并提供完整的 TypeScript 支持。",{"path":544,"title":545,"description":546},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-server-seo-meta","useServerSeoMeta","useServerSeoMeta 组合式函数让你可以将站点的 SEO meta 标签定义为一个扁平对象，并提供完整的 TypeScript 支持。",{"path":548,"title":549,"description":550},"\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-state","useState","useState 组合式函数创建一个可响应的、SSR 友好的共享状态。",{"path":552,"title":553,"description":554},"\u002Fdocs\u002Fapi\u002Futils\u002Fdollarfetch","$fetch","Nuxt 使用 ofetch 全局暴露了 $fetch 辅助函数，用于发起 HTTP 请求。",{"path":556,"title":557,"description":558},"\u002Fdocs\u002Fapi\u002Futils\u002Fabort-navigation","abortNavigation","abortNavigation 是一个辅助函数，用于阻止导航的发生，并在设置了参数时抛出错误。",{"path":560,"title":561,"description":562},"\u002Fdocs\u002Fapi\u002Futils\u002Fadd-route-middleware","addRouteMiddleware","addRouteMiddleware() 是一个在你的应用中动态添加中间件的辅助函数。",{"path":564,"title":565,"description":566},"\u002Fdocs\u002Fapi\u002Futils\u002Fcall-once","callOnce","在 SSR 或 CSR 期间只运行一次给定的函数或代码块。",{"path":568,"title":569,"description":570},"\u002Fdocs\u002Fapi\u002Futils\u002Fclear-error","clearError","clearError 组合式函数清除所有已处理的错误。",{"path":572,"title":573,"description":574},"\u002Fdocs\u002Fapi\u002Futils\u002Fclear-nuxt-data","clearNuxtData","删除 useAsyncData 和 useFetch 的缓存数据、错误状态和挂起的 promise。",{"path":576,"title":577,"description":578},"\u002Fdocs\u002Fapi\u002Futils\u002Fclear-nuxt-state","clearNuxtState","删除 useState 的缓存状态。",{"path":580,"title":581,"description":582},"\u002Fdocs\u002Fapi\u002Futils\u002Fcreate-error","createError","创建一个带有附加元数据的错误对象。",{"path":584,"title":585,"description":586},"\u002Fdocs\u002Fapi\u002Futils\u002Fdefine-lazy-hydration-component","defineLazyHydrationComponent","使用特定策略定义一个懒加载 hydration 组件。",{"path":588,"title":589,"description":590},"\u002Fdocs\u002Fapi\u002Futils\u002Fdefine-nuxt-component","defineNuxtComponent","defineNuxtComponent() 是一个用于使用 Options API 定义类型安全组件的辅助函数。",{"path":592,"title":593,"description":594},"\u002Fdocs\u002Fapi\u002Futils\u002Fdefine-nuxt-plugin","defineNuxtPlugin","defineNuxtPlugin() 是一个用于创建 Nuxt 插件的辅助函数。",{"path":596,"title":597,"description":598},"\u002Fdocs\u002Fapi\u002Futils\u002Fdefine-nuxt-route-middleware","defineNuxtRouteMiddleware","使用 defineNuxtRouteMiddleware 辅助函数创建命名路由中间件。",{"path":600,"title":601,"description":602},"\u002Fdocs\u002Fapi\u002Futils\u002Fdefine-page-meta","definePageMeta","为你的页面组件定义元数据。",{"path":604,"title":605,"description":606},"\u002Fdocs\u002Fapi\u002Futils\u002Fdefine-route-rules","defineRouteRules","在页面层面定义用于混合渲染的路由规则。",{"path":608,"title":609,"description":610},"\u002Fdocs\u002Fapi\u002Futils\u002Fnavigate-to","navigateTo","navigateTo 是一个用于以编程方式导航用户的辅助函数。",{"path":612,"title":613,"description":614},"\u002Fdocs\u002Fapi\u002Futils\u002Fon-before-route-leave","onBeforeRouteLeave","onBeforeRouteLeave 组合式函数允许在组件内部注册一个路由守卫。",{"path":616,"title":617,"description":618},"\u002Fdocs\u002Fapi\u002Futils\u002Fon-before-route-update","onBeforeRouteUpdate","onBeforeRouteUpdate 组合式函数允许在组件内部注册一个路由守卫。",{"path":620,"title":621,"description":622},"\u002Fdocs\u002Fapi\u002Futils\u002Fon-nuxt-ready","onNuxtReady","onNuxtReady 组合式函数允许在你的应用完成初始化之后运行一个回调。",{"path":624,"title":625,"description":626},"\u002Fdocs\u002Fapi\u002Futils\u002Fprefetch-components","prefetchComponents","Nuxt 提供了用于在预取组件方面给予你控制的工具。",{"path":628,"title":629,"description":630},"\u002Fdocs\u002Fapi\u002Futils\u002Fpreload-components","preloadComponents","Nuxt 提供了用于在预加载组件方面给予你控制的工具。",{"path":632,"title":633,"description":634},"\u002Fdocs\u002Fapi\u002Futils\u002Fpreload-route-components","preloadRouteComponents","preloadRouteComponents 允许你手动预加载 Nuxt 应用中的单个页面。",{"path":636,"title":637,"description":638},"\u002Fdocs\u002Fapi\u002Futils\u002Fprerender-routes","prerenderRoutes","prerenderRoutes 向 Nitro 暗示预渲染一个额外的路由。",{"path":640,"title":641,"description":642},"\u002Fdocs\u002Fapi\u002Futils\u002Frefresh-cookie","refreshCookie","当 cookie 发生变化时，手动刷新 useCookie 的值",{"path":644,"title":645,"description":646},"\u002Fdocs\u002Fapi\u002Futils\u002Frefresh-nuxt-data","refreshNuxtData","刷新 Nuxt 中所有或特定的 asyncData 实例",{"path":648,"title":649,"description":650},"\u002Fdocs\u002Fapi\u002Futils\u002Freload-nuxt-app","reloadNuxtApp","reloadNuxtApp 会对页面执行一次硬刷新。",{"path":652,"title":653,"description":654},"\u002Fdocs\u002Fapi\u002Futils\u002Fset-page-layout","setPageLayout","setPageLayout 允许你动态更改页面的布局。",{"path":656,"title":657,"description":658},"\u002Fdocs\u002Fapi\u002Futils\u002Fset-response-status","setResponseStatus","setResponseStatus 设置响应的状态码（以及可选的 statusText）。",{"path":660,"title":661,"description":662},"\u002Fdocs\u002Fapi\u002Futils\u002Fshow-error","showError","Nuxt 提供了一种快速且简单的方式，在需要的时候显示全屏错误页。",{"path":664,"title":665,"description":666},"\u002Fdocs\u002Fapi\u002Futils\u002Fupdate-app-config","updateAppConfig","在运行时更新 App Config。",{"path":668,"title":669,"description":670},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fadd","nuxt add","在你的 Nuxt 应用中快速搭建一个实体（文件）。",{"path":672,"title":673,"description":674},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fanalyze","nuxt analyze","分析生产环境的打包产物或你的 Nuxt 应用。",{"path":676,"title":677,"description":678},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fbuild","nuxt build","构建你的 Nuxt 应用。",{"path":680,"title":681,"description":682},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fbuild-module","nuxt build-module","用于在发布前构建你的 Nuxt 模块的 Nuxt 命令。",{"path":684,"title":685,"description":686},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fcleanup","nuxt cleanup","移除常见的 Nuxt 生成文件和缓存。",{"path":688,"title":689,"description":690},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fdev","nuxt dev","dev 命令会在 http:\u002F\u002Flocalhost:3000 启动一个带有热模块替换（HMR）的开发服务器。",{"path":692,"title":693,"description":694},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fdevtools","nuxt devtools","devtools 命令允许你基于每个项目启用或禁用 Nuxt DevTools。",{"path":696,"title":697,"description":698},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fgenerate","nuxt generate","预渲染应用的每一个路由，并将结果存储为纯 HTML 文件。",{"path":700,"title":701,"description":702},"\u002Fdocs\u002Fapi\u002Fcommands\u002Finfo","nuxt info","info 命令会记录当前或指定 Nuxt 项目的相关信息。",{"path":704,"title":705,"description":706},"\u002Fdocs\u002Fapi\u002Fcommands\u002Finit","create nuxt","init 命令用于初始化一个全新的 Nuxt 项目。",{"path":708,"title":709,"description":710},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fmodule","nuxt module","通过命令行搜索并向你的 Nuxt 应用添加模块。",{"path":712,"title":713,"description":714},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fprepare","nuxt prepare","prepare 命令会在你的应用中创建一个 .nuxt 目录并生成类型。",{"path":716,"title":717,"description":718},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fpreview","nuxt preview","preview 命令会启动一个服务器，用于在运行 build 命令后预览你的应用。",{"path":720,"title":721,"description":722},"\u002Fdocs\u002Fapi\u002Fcommands\u002Ftest","nuxt test","test 命令使用 @nuxt\u002Ftest-utils 运行测试。",{"path":724,"title":725,"description":726},"\u002Fdocs\u002Fapi\u002Fcommands\u002Ftypecheck","nuxt typecheck","typecheck 命令运行 vue-tsc 来全量检查你的应用类型。",{"path":728,"title":729,"description":730},"\u002Fdocs\u002Fapi\u002Fcommands\u002Fupgrade","nuxt upgrade","upgrade 命令将 Nuxt 升级到最新版本。",{"path":732,"title":733,"description":734},"\u002Fdocs\u002Fapi\u002Fkit\u002Fmodules","Modules","Nuxt Kit 提供了一系列工具，帮助你创建和使用模块。你可以使用这些工具来创建自己的模块，或复用已有的模块。",{"path":736,"title":737,"description":738},"\u002Fdocs\u002Fapi\u002Fkit\u002Fruntime-config","Runtime Config","Nuxt Kit 提供了一系列工具，帮助你访问和修改 Nuxt 运行时配置。",{"path":740,"title":741,"description":742},"\u002Fdocs\u002Fapi\u002Fkit\u002Ftemplates","Templates","Nuxt Kit 提供了一系列工具，帮助你处理模板。这些函数允许你在开发和构建期间生成额外的文件。",{"path":744,"title":745,"description":746},"\u002Fdocs\u002Fapi\u002Fkit\u002Fapp-config","App Config","Nuxt Kit 提供了一系列工具，帮助你访问和修改 Nuxt 应用配置。",{"path":748,"title":749,"description":750},"\u002Fdocs\u002Fapi\u002Fkit\u002Fnitro","Nitro","Nuxt Kit 提供了一系列工具，帮助你使用 Nitro。这些函数允许你添加服务器处理器、插件和预渲染路由。",{"path":752,"title":753,"description":754},"\u002Fdocs\u002Fapi\u002Fkit\u002Fresolving","Resolving","Nuxt Kit 提供了从 Nuxt 根目录或自定义基准路径解析路径的实用工具。",{"path":756,"title":757,"description":758},"\u002Fdocs\u002Fapi\u002Fkit\u002Flogging","Logging","Nuxt Kit 提供了一系列工具，帮助你使用日志记录。这些函数允许你以额外功能记录消息。",{"path":760,"title":761,"description":762},"\u002Fdocs\u002Fapi\u002Fkit\u002Fbuilder","Builder","Nuxt Kit 提供了一系列工具，帮助你使用构建器。这些函数允许你扩展 Vite 和 webpack 配置。",{"path":764,"title":765,"description":766},"\u002Fdocs\u002Fapi\u002Fkit\u002Fexamples","Examples","Nuxt Kit 工具的使用示例。",{"path":768,"title":58,"description":769},"\u002Fdocs\u002Fapi\u002Fkit\u002Flayers","Nuxt Kit 提供了帮助你处理层及其目录结构的工具。",{"path":771,"title":772,"description":773},"\u002Fdocs\u002Fapi\u002Fkit\u002Fprogrammatic","Programmatic Usage","Nuxt Kit 提供了一系列工具，帮助你以编程方式使用 Nuxt。这些函数允许你加载 Nuxt、构建 Nuxt，以及加载 Nuxt 配置。",{"path":775,"title":776,"description":777},"\u002Fdocs\u002Fapi\u002Fkit\u002Fcompatibility","Compatibility","Nuxt Kit 提供了一系列工具，帮助你检查模块与不同 Nuxt 版本的兼容性。",{"path":779,"title":780,"description":781},"\u002Fdocs\u002Fapi\u002Fkit\u002Fautoimports","Auto-imports","Nuxt Kit 提供了一系列工具，帮助你处理自动导入。这些函数允许你注册自己的 utils、composables 和 Vue API。",{"path":783,"title":784,"description":785},"\u002Fdocs\u002Fapi\u002Fkit\u002Fcomponents","Components","Nuxt Kit 提供了一系列工具，帮助你处理组件。你可以全局或局部注册组件，也可以添加要被扫描的目录。",{"path":787,"title":788,"description":789},"\u002Fdocs\u002Fapi\u002Fkit\u002Fcontext","Context","Nuxt Kit 提供了一系列工具，帮助你处理上下文。",{"path":791,"title":792,"description":793},"\u002Fdocs\u002Fapi\u002Fkit\u002Fpages","Pages","Nuxt Kit 提供了一系列工具，帮助你创建和使用页面。你可以使用这些工具来操作页面配置或定义路由规则。",{"path":795,"title":796,"description":797},"\u002Fdocs\u002Fapi\u002Fkit\u002Flayout","Layout","Nuxt Kit 提供了一系列工具，帮助你处理布局。",{"path":799,"title":800,"description":801},"\u002Fdocs\u002Fapi\u002Fkit\u002Fhead","Head","Nuxt Kit 提供了一系列工具，帮助你在模块中管理 head 配置。",{"path":803,"title":804,"description":805},"\u002Fdocs\u002Fapi\u002Fkit\u002Fplugins","Plugins","Nuxt Kit 提供了一系列工具，帮助你创建和使用插件。你可以使用这些函数向你的模块添加插件或插件模板。",{"path":807,"title":330,"description":808},"\u002Fdocs\u002Fapi\u002Fadvanced\u002Fhooks","Nuxt 提供了一套强大的钩子系统，可以通过钩子扩展几乎各个方面。",{"path":810,"title":811,"description":812},"\u002Fdocs\u002Fapi\u002Fadvanced\u002Fimport-meta","Import meta","使用 `import.meta` 了解你的代码运行在何处。",{"path":814,"title":815,"description":816},"\u002Fdocs\u002Fapi\u002Fnuxt-config","Nuxt 配置","发现你可以在 nuxt.config.ts 文件中使用的所有选项。",{"path":818,"title":819,"description":820},"\u002Fdocs\u002Fapi","Nuxt API 参考","探索所有 Nuxt 内部机制：组件、组合式函数、工具函数、命令等等。",{"path":822,"title":823,"description":824},"\u002Fdocs\u002Fcommunity\u002Fgetting-help","获取帮助","我们是一个友好的开发者社区，很乐意提供帮助。",{"path":826,"title":827,"description":828},"\u002Fdocs\u002Fcommunity\u002Freporting-bugs","报告 Bug","开源中最有价值的角色之一，就是花时间把 bug 报告得清楚明白。",{"path":830,"title":831,"description":832},"\u002Fdocs\u002Fcommunity\u002Fcontribution","贡献","Nuxt 是一个社区项目——因此我们欢迎各种形式的贡献！❤️",{"path":834,"title":835,"description":836},"\u002Fdocs\u002Fcommunity\u002Fframework-contribution","框架贡献","关于向框架仓库贡献的一些具体要点。",{"path":838,"title":839,"description":840},"\u002Fdocs\u002Fcommunity\u002Froadmap","路线图","Nuxt 在不断发展，新功能和模块一直在增加。",{"path":842,"title":843,"description":844},"\u002Fdocs\u002Fcommunity\u002Fchangelog","发布","发现 Nuxt 及 Nuxt 官方模块的最新发布。",{"path":846,"title":847,"description":848},"\u002Fdocs\u002Fbridge\u002Foverview","概述","缩小与 Nuxt 3 的差异，并减轻迁移到 Nuxt 3 的负担。",{"path":850,"title":14,"description":851},"\u002Fdocs\u002Fbridge\u002Fconfiguration","了解如何根据你的需求配置 Nuxt Bridge。",{"path":853,"title":222,"description":854},"\u002Fdocs\u002Fbridge\u002Ftypescript","了解如何在 Nuxt Bridge 中使用 TypeScript。",{"path":856,"title":857,"description":858},"\u002Fdocs\u002Fbridge\u002Fbridge-composition-api","旧版 Composition API","了解如何使用 Nuxt Bridge 迁移到 Composition API。",{"path":860,"title":861,"description":862},"\u002Fdocs\u002Fbridge\u002Fplugins-and-middleware","插件和中间件","了解如何从 Nuxt 2 迁移到 Nuxt Bridge 的新插件和中间件。",{"path":864,"title":865,"description":866},"\u002Fdocs\u002Fbridge\u002Fnuxt3-compatible-api","新的 Composition API","Nuxt Bridge 实现了与 Nuxt 3 兼容的组合式函数。",{"path":868,"title":869,"description":870},"\u002Fdocs\u002Fbridge\u002Fmeta","Meta 标签","了解如何从 Nuxt 2 迁移到 Nuxt Bridge 的新 meta 标签。",{"path":872,"title":322,"description":873},"\u002Fdocs\u002Fbridge\u002Fruntime-config","Nuxt 提供了一个运行时配置 API，用于在应用中暴露配置和密钥。",{"path":875,"title":749,"description":876},"\u002Fdocs\u002Fbridge\u002Fnitro","通过 Nuxt Bridge 为你的 Nuxt 2 应用激活 Nitro。",{"path":878,"title":879,"description":880},"\u002Fdocs\u002Fbridge\u002Fvite","Vite","通过 Nuxt Bridge 为你的 Nuxt 2 应用激活 Vite。",{"path":882,"title":847,"description":883},"\u002Fdocs\u002Fmigration\u002Foverview","Nuxt 3 是对 Nuxt 2 的完整重写，并且基于一套全新的底层技术。",{"path":885,"title":886,"description":887},"\u002Fdocs\u002Fmigration\u002Fbundling","构建工具","了解如何从 Nuxt 2 迁移到 Nuxt 3 的构建工具。",{"path":889,"title":890,"description":891},"\u002Fdocs\u002Fmigration\u002Fserver","服务器","了解如何从 Nuxt 2 迁移到 Nuxt 3 的服务器。",{"path":893,"title":14,"description":894},"\u002Fdocs\u002Fmigration\u002Fconfiguration","了解如何从 Nuxt 2 迁移到 Nuxt 3 的新配置。",{"path":896,"title":214,"description":897},"\u002Fdocs\u002Fmigration\u002Fmodule-authors","了解如何从 Nuxt 2 迁移到 Nuxt 3 模块。",{"path":899,"title":206,"description":900},"\u002Fdocs\u002Fmigration\u002Fauto-imports","Nuxt 3 采用最小摩擦的方式，即在任何可能的地方自动导入组件和组合式函数。",{"path":902,"title":869,"description":903},"\u002Fdocs\u002Fmigration\u002Fmeta","管理你的 meta 标签，从 Nuxt 2 到 Nuxt 3。",{"path":905,"title":861,"description":906},"\u002Fdocs\u002Fmigration\u002Fplugins-and-middleware","了解如何从 Nuxt 2 迁移到 Nuxt 3 的插件和中间件。",{"path":908,"title":909,"description":910},"\u002Fdocs\u002Fmigration\u002Fpages-and-layouts","页面和布局","了解如何从 Nuxt 2 迁移到 Nuxt 3 的页面和布局。",{"path":912,"title":913,"description":914},"\u002Fdocs\u002Fmigration\u002Fcomponent-options","组件选项","了解如何从 Nuxt 2 的组件选项迁移到 Nuxt 3 的组合式函数。",{"path":916,"title":322,"description":917},"\u002Fdocs\u002Fmigration\u002Fruntime-config","了解如何从 Nuxt 2 迁移到 Nuxt 3 的运行时配置。",{"path":919,"title":920,"description":921},"\u002Fdocs\u002Freadme","Nuxt 文档","本仓库包含 Nuxt 的文档，托管于 https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fgetting-started\u002Fintroduction",{"path":923,"title":924,"description":925},"\u002Fdocs\u002Ferrors\u002Fb5001","NUXT_B5001","缺少 compatibilityDate (兼容性日期)",{"path":927,"title":928,"description":929},"\u002Fdocs\u002Ferrors\u002Fb5003","NUXT_B5003","保留的 runtimeConfig.app 命名空间",{"path":931,"title":932,"description":933},"\u002Fdocs\u002Ferrors\u002Fb5004","NUXT_B5004","不支持外部配置文件",{"path":935,"title":936,"description":937},"\u002Fdocs\u002Ferrors\u002Fe1001","NUXT_E1001","在 Nuxt 上下文之外调用了组合式函数。",{"path":939,"title":940,"description":941},"\u002Fdocs\u002Ferrors\u002Fe1006","NUXT_E1006","onPrehydrate 未被构建流水线处理。",{"path":943,"title":944,"description":945},"\u002Fdocs\u002Ferrors\u002Fe1007","NUXT_E1007","编译期提示辅助函数在运行时被调用。",{"path":947,"title":948,"description":949},"\u002Fdocs\u002Ferrors\u002Fe2001","NUXT_E2001","外部导航未设置 external: true。",{"path":951,"title":952,"description":953},"\u002Fdocs\u002Ferrors\u002Fe2002","NUXT_E2002","使用了危险协议的导航。",{"path":955,"title":956,"description":957},"\u002Fdocs\u002Ferrors\u002Fe2003","NUXT_E2003","abortNavigation() 在中间件之外被调用。",{"path":959,"title":960,"description":961},"\u002Fdocs\u002Ferrors\u002Fe2004","NUXT_E2004","未知的路由中间件。",{"path":963,"title":964,"description":965},"\u002Fdocs\u002Ferrors\u002Fe2005","NUXT_E2005","在中间件内调用了 useRoute。",{"path":967,"title":968,"description":969},"\u002Fdocs\u002Ferrors\u002Fe2007","NUXT_E2007","在组件中于服务端调用了 setPageLayout。",{"path":971,"title":972,"description":973},"\u002Fdocs\u002Ferrors\u002Fe3001","NUXT_E3001","useFetch 的请求 URL 以 \"\u002F\u002F\" 开头。",{"path":975,"title":976,"description":977},"\u002Fdocs\u002Ferrors\u002Fe3008","NUXT_E3008","useAsyncData 的 key 必须是非空字符串。",{"path":979,"title":980,"description":981},"\u002Fdocs\u002Ferrors\u002Fe3009","NUXT_E3009","useAsyncData 的处理函数必须是一个函数。",{"path":983,"title":984,"description":985},"\u002Fdocs\u002Ferrors\u002Fe4012","NUXT_E4012","无法解析 island（岛）响应。",{"path":987,"title":988,"description":989},"\u002Fdocs\u002Ferrors\u002Fe4016","NUXT_E4016","嵌套页面无法显示，因为其父页面没有渲染 \u003CNuxtPage \u002F>。",{"path":991,"title":992,"description":993},"\u002Fdocs\u002Ferrors\u002Fe5001","NUXT_E5001","应用清单（app manifest）未启用。",{"path":995,"title":996,"description":997},"\u002Fdocs\u002Ferrors\u002Fe6001","NUXT_E6001","缺少 Unhead 实例。",{"path":999,"title":1000,"description":1001},"\u002Fdocs\u002Ferrors\u002Fe7001","NUXT_E7001","Payload URL 包含主机名。",{"path":1003,"title":1004,"description":1005},"\u002Fdocs\u002Ferrors\u002Fe7007","NUXT_E7007","useState 的初始化值必须是一个函数。",{"path":1007,"title":1008,"description":1009},"\u002Fdocs\u002Ferrors\u002Fe7008","NUXT_E7008","callOnce 的 fn 必须是一个函数。",{"path":1011,"title":1012,"description":1013},"\u002Fdocs\u002Ferrors\u002Fe7009","NUXT_E7009","useState 的 key 必须是一个字符串。",{"path":1015,"title":1016,"description":1017},"\u002Fdocs\u002Ferrors\u002Fe7010","NUXT_E7010","callOnce 的 key 必须是一个字符串。",{"id":1019,"title":150,"body":1020,"description":151,"extension":4915,"meta":4916,"navigation":4918,"path":149,"seo":4919,"stem":4920,"__hash__":4921},"docs\u002Fdocs\u002F2.directory-structure\u002F1.server.md",{"type":1021,"value":1022,"toc":4910},"minimark",[1023,1027,1125,1136,1146,1152,4906],[1024,1025,1026],"p",{},"Nuxt 会自动扫描这些目录中的文件，注册带热模块替换（HMR）支持的 API 和服务端处理器。",[1028,1029,1034],"pre",{"className":1030,"code":1031,"filename":1032,"language":1033,"meta":354,"style":354},"language-bash shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","-| server\u002F\n---| api\u002F\n-----| hello.ts      # \u002Fapi\u002Fhello\n---| routes\u002F\n-----| bonjour.ts    # \u002Fbonjour\n---| middleware\u002F\n-----| log.ts        # 记录所有请求\n","Directory Structure","bash",[1035,1036,1037,1053,1064,1079,1089,1102,1112],"code",{"__ignoreMap":354},[1038,1039,1042,1046,1050],"span",{"class":1040,"line":1041},"line",1,[1038,1043,1045],{"class":1044},"sJK67","-",[1038,1047,1049],{"class":1048},"sXPRQ","|",[1038,1051,1052],{"class":1044}," server\u002F\n",[1038,1054,1056,1059,1061],{"class":1040,"line":1055},2,[1038,1057,1058],{"class":1044},"---",[1038,1060,1049],{"class":1048},[1038,1062,1063],{"class":1044}," api\u002F\n",[1038,1065,1067,1070,1072,1075],{"class":1040,"line":1066},3,[1038,1068,1069],{"class":1044},"-----",[1038,1071,1049],{"class":1048},[1038,1073,1074],{"class":1044}," hello.ts",[1038,1076,1078],{"class":1077},"sZqJ9","      # \u002Fapi\u002Fhello\n",[1038,1080,1082,1084,1086],{"class":1040,"line":1081},4,[1038,1083,1058],{"class":1044},[1038,1085,1049],{"class":1048},[1038,1087,1088],{"class":1044}," routes\u002F\n",[1038,1090,1092,1094,1096,1099],{"class":1040,"line":1091},5,[1038,1093,1069],{"class":1044},[1038,1095,1049],{"class":1048},[1038,1097,1098],{"class":1044}," bonjour.ts",[1038,1100,1101],{"class":1077},"    # \u002Fbonjour\n",[1038,1103,1105,1107,1109],{"class":1040,"line":1104},6,[1038,1106,1058],{"class":1044},[1038,1108,1049],{"class":1048},[1038,1110,1111],{"class":1044}," middleware\u002F\n",[1038,1113,1115,1117,1119,1122],{"class":1040,"line":1114},7,[1038,1116,1069],{"class":1044},[1038,1118,1049],{"class":1048},[1038,1120,1121],{"class":1044}," log.ts",[1038,1123,1124],{"class":1077},"        # 记录所有请求\n",[1024,1126,1127,1128,1131,1132,1135],{},"每个文件都应导出一个用 ",[1035,1129,1130],{},"defineEventHandler()"," 或 ",[1035,1133,1134],{},"eventHandler()","（别名）定义的默认函数。",[1024,1137,1138,1139,1131,1142,1145],{},"处理器可以直接返回 JSON 数据、",[1035,1140,1141],{},"Promise",[1035,1143,1144],{},"Response"," 对象。",[1147,1148,1149],"important",{},[1024,1150,1151],{},"不要在你的服务端路由或工具函数中导入 Vue 应用代码（组件、组合式函数或其他仅限应用的工具函数），也不要在应用中导入仅限服务端的代码。",[1153,1154,1157,1273,1276,1395,1400,1410],"read-more",{"to":1155,"title":1156},"\u002Fdocs\u002Fdirectory-structure\u002Fshared#why-you-cannot-mix-vue-and-nitro-code","为什么不能混用 Vue 和 Nitro 代码",[1028,1158,1164],{"className":1159,"code":1160,"filename":1161,"language":1162,"meta":1163,"style":354},"language-ts shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","import { defineEventHandler } from 'nitro\u002Fh3'\n\nexport default defineEventHandler((event) => {\n  return {\n    hello: 'world',\n  }\n})\n","server\u002Fapi\u002Fhello.ts","ts","twoslash",[1035,1165,1166,1197,1203,1233,1240,1260,1265],{"__ignoreMap":354},[1038,1167,1168,1172,1176,1180,1183,1186,1190,1194],{"class":1040,"line":1041},[1038,1169,1171],{"class":1170},"szyBz","import",[1038,1173,1175],{"class":1174},"sF54B"," {",[1038,1177,1179],{"class":1178},"smVNa"," defineEventHandler",[1038,1181,1182],{"class":1174}," }",[1038,1184,1185],{"class":1170}," from",[1038,1187,1189],{"class":1188},"s0jeK"," '",[1038,1191,1193],{"class":1192},"s-Aze","nitro\u002Fh3",[1038,1195,1196],{"class":1188},"'\n",[1038,1198,1199],{"class":1040,"line":1055},[1038,1200,1202],{"emptyLinePlaceholder":1201},true,"\n",[1038,1204,1205,1208,1211,1214,1217,1219,1223,1226,1230],{"class":1040,"line":1066},[1038,1206,1207],{"class":1170},"export",[1038,1209,1210],{"class":1170}," default",[1038,1212,1179],{"class":1213},"srJn9",[1038,1215,1216],{"class":1178},"(",[1038,1218,1216],{"class":1174},[1038,1220,1222],{"class":1221},"ssIVr","event",[1038,1224,1225],{"class":1174},")",[1038,1227,1229],{"class":1228},"sV7Px"," =>",[1038,1231,1232],{"class":1174}," {\n",[1038,1234,1235,1238],{"class":1040,"line":1081},[1038,1236,1237],{"class":1170},"  return",[1038,1239,1232],{"class":1174},[1038,1241,1242,1246,1249,1251,1254,1257],{"class":1040,"line":1091},[1038,1243,1245],{"class":1244},"sOtFm","    hello",[1038,1247,1248],{"class":1174},":",[1038,1250,1189],{"class":1188},[1038,1252,1253],{"class":1192},"world",[1038,1255,1256],{"class":1188},"'",[1038,1258,1259],{"class":1174},",\n",[1038,1261,1262],{"class":1040,"line":1104},[1038,1263,1264],{"class":1174},"  }\n",[1038,1266,1267,1270],{"class":1040,"line":1114},[1038,1268,1269],{"class":1174},"}",[1038,1271,1272],{"class":1178},")\n",[1024,1274,1275],{},"你现在可以在页面和组件中通用地调用这个 API：",[1028,1277,1282],{"className":1278,"code":1279,"filename":1280,"language":1281,"meta":354,"style":354},"language-vue shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","\u003Cscript setup lang=\"ts\">\nconst { data } = await useFetch('\u002Fapi\u002Fhello')\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cpre>{{ data }}\u003C\u002Fpre>\n\u003C\u002Ftemplate>\n","app\u002Fpages\u002Findex.vue","vue",[1035,1283,1284,1313,1346,1355,1359,1368,1387],{"__ignoreMap":354},[1038,1285,1286,1289,1293,1297,1300,1303,1306,1308,1310],{"class":1040,"line":1041},[1038,1287,1288],{"class":1174},"\u003C",[1038,1290,1292],{"class":1291},"s6g6u","script",[1038,1294,1296],{"class":1295},"sXjFp"," setup",[1038,1298,1299],{"class":1295}," lang",[1038,1301,1302],{"class":1174},"=",[1038,1304,1305],{"class":1188},"\"",[1038,1307,1162],{"class":1192},[1038,1309,1305],{"class":1188},[1038,1311,1312],{"class":1174},">\n",[1038,1314,1315,1318,1320,1324,1326,1329,1332,1335,1337,1339,1342,1344],{"class":1040,"line":1055},[1038,1316,1317],{"class":1228},"const",[1038,1319,1175],{"class":1174},[1038,1321,1323],{"class":1322},"sJTDI"," data",[1038,1325,1182],{"class":1174},[1038,1327,1328],{"class":1048}," =",[1038,1330,1331],{"class":1170}," await",[1038,1333,1334],{"class":1213}," useFetch",[1038,1336,1216],{"class":1178},[1038,1338,1256],{"class":1188},[1038,1340,1341],{"class":1192},"\u002Fapi\u002Fhello",[1038,1343,1256],{"class":1188},[1038,1345,1272],{"class":1178},[1038,1347,1348,1351,1353],{"class":1040,"line":1066},[1038,1349,1350],{"class":1174},"\u003C\u002F",[1038,1352,1292],{"class":1291},[1038,1354,1312],{"class":1174},[1038,1356,1357],{"class":1040,"line":1081},[1038,1358,1202],{"emptyLinePlaceholder":1201},[1038,1360,1361,1363,1366],{"class":1040,"line":1091},[1038,1362,1288],{"class":1174},[1038,1364,1365],{"class":1291},"template",[1038,1367,1312],{"class":1174},[1038,1369,1370,1373,1375,1378,1381,1383,1385],{"class":1040,"line":1104},[1038,1371,1372],{"class":1174},"  \u003C",[1038,1374,1028],{"class":1291},[1038,1376,1377],{"class":1174},">",[1038,1379,1380],{"class":1178},"{{ data }}",[1038,1382,1350],{"class":1174},[1038,1384,1028],{"class":1291},[1038,1386,1312],{"class":1174},[1038,1388,1389,1391,1393],{"class":1040,"line":1114},[1038,1390,1350],{"class":1174},[1038,1392,1365],{"class":1291},[1038,1394,1312],{"class":1174},[1396,1397,1399],"h2",{"id":1398},"服务端路由server-routes","服务端路由（Server Routes）",[1024,1401,1402,1405,1406,1409],{},[1035,1403,1404],{},"~~\u002Fserver\u002Fapi"," 中的文件在其路由中会自动添加 ",[1035,1407,1408],{},"\u002Fapi"," 前缀。",[1411,1412,1416,1426,1432,1462,1476,1487,1491,1498,1501,1506,1510,1575,1638,1642,1648,1652,1734],"video-accordion",{"platform":1413,"title":1414,"video-id":1415},"vimeo","观看 Vue School 关于 API 路由的视频","761468863",[1024,1417,1418,1419,1421,1422,1425],{},"要添加不带 ",[1035,1420,1408],{}," 前缀的服务端路由，请将它们放入 ",[1035,1423,1424],{},"~~\u002Fserver\u002Froutes"," 目录。",[1024,1427,1428],{},[1429,1430,1431],"strong",{},"示例：",[1028,1433,1436],{"className":1159,"code":1434,"filename":1435,"language":1162,"meta":354,"style":354},"export default defineEventHandler(() => 'Hello World!')\n","server\u002Froutes\u002Fhello.ts",[1035,1437,1438],{"__ignoreMap":354},[1038,1439,1440,1442,1444,1446,1448,1451,1453,1455,1458,1460],{"class":1040,"line":1041},[1038,1441,1207],{"class":1170},[1038,1443,1210],{"class":1170},[1038,1445,1179],{"class":1213},[1038,1447,1216],{"class":1178},[1038,1449,1450],{"class":1174},"()",[1038,1452,1229],{"class":1228},[1038,1454,1189],{"class":1188},[1038,1456,1457],{"class":1192},"Hello World!",[1038,1459,1256],{"class":1188},[1038,1461,1272],{"class":1178},[1024,1463,1464,1465,1468,1469,1475],{},"以上例来说，",[1035,1466,1467],{},"\u002Fhello"," 路由可通过 ",[1470,1471,1472],"a",{"href":1472,"rel":1473},"http:\u002F\u002Flocalhost:3000\u002Fhello",[1474],"nofollow"," 访问。",[1477,1478,1479],"note",{},[1024,1480,1481,1482,1486],{},"请注意，目前服务端路由不像",[1470,1483,1485],{"href":1484},"\u002Fdocs\u002Fdirectory-structure\u002Fapp\u002Fpages#dynamic-routes","页面","那样支持动态路由的全部功能。",[1396,1488,1490],{"id":1489},"服务端中间件server-middleware","服务端中间件（Server Middleware）",[1024,1492,1493,1494,1497],{},"Nuxt 会自动读取 ",[1035,1495,1496],{},"~~\u002Fserver\u002Fmiddleware"," 中的任何文件，为你的项目创建服务端中间件。",[1024,1499,1500],{},"中间件处理器会在任何其它服务端路由之前对每个请求运行，用于添加或检查请求头、记录请求日志，或扩展事件的请求对象。",[1477,1502,1503],{},[1024,1504,1505],{},"中间件处理器不应返回任何内容（也不应关闭或响应请求），只能检查或扩展请求上下文，或抛出错误。",[1024,1507,1508],{},[1429,1509,1431],{},[1028,1511,1514],{"className":1159,"code":1512,"filename":1513,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  console.log('New request: ' + getRequestURL(event))\n})\n","server\u002Fmiddleware\u002Flog.ts",[1035,1515,1516,1536,1569],{"__ignoreMap":354},[1038,1517,1518,1520,1522,1524,1526,1528,1530,1532,1534],{"class":1040,"line":1041},[1038,1519,1207],{"class":1170},[1038,1521,1210],{"class":1170},[1038,1523,1179],{"class":1213},[1038,1525,1216],{"class":1178},[1038,1527,1216],{"class":1174},[1038,1529,1222],{"class":1221},[1038,1531,1225],{"class":1174},[1038,1533,1229],{"class":1228},[1038,1535,1232],{"class":1174},[1038,1537,1538,1541,1544,1547,1549,1551,1554,1556,1559,1562,1564,1566],{"class":1040,"line":1055},[1038,1539,1540],{"class":1178},"  console",[1038,1542,1543],{"class":1174},".",[1038,1545,1546],{"class":1213},"log",[1038,1548,1216],{"class":1244},[1038,1550,1256],{"class":1188},[1038,1552,1553],{"class":1192},"New request: ",[1038,1555,1256],{"class":1188},[1038,1557,1558],{"class":1048}," +",[1038,1560,1561],{"class":1213}," getRequestURL",[1038,1563,1216],{"class":1244},[1038,1565,1222],{"class":1178},[1038,1567,1568],{"class":1244},"))\n",[1038,1570,1571,1573],{"class":1040,"line":1066},[1038,1572,1269],{"class":1174},[1038,1574,1272],{"class":1178},[1028,1576,1579],{"className":1159,"code":1577,"filename":1578,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  event.context.auth = { user: 123 }\n})\n","server\u002Fmiddleware\u002Fauth.ts",[1035,1580,1581,1601,1632],{"__ignoreMap":354},[1038,1582,1583,1585,1587,1589,1591,1593,1595,1597,1599],{"class":1040,"line":1041},[1038,1584,1207],{"class":1170},[1038,1586,1210],{"class":1170},[1038,1588,1179],{"class":1213},[1038,1590,1216],{"class":1178},[1038,1592,1216],{"class":1174},[1038,1594,1222],{"class":1221},[1038,1596,1225],{"class":1174},[1038,1598,1229],{"class":1228},[1038,1600,1232],{"class":1174},[1038,1602,1603,1606,1608,1611,1613,1616,1618,1620,1623,1625,1629],{"class":1040,"line":1055},[1038,1604,1605],{"class":1178},"  event",[1038,1607,1543],{"class":1174},[1038,1609,1610],{"class":1178},"context",[1038,1612,1543],{"class":1174},[1038,1614,1615],{"class":1178},"auth",[1038,1617,1328],{"class":1048},[1038,1619,1175],{"class":1174},[1038,1621,1622],{"class":1244}," user",[1038,1624,1248],{"class":1174},[1038,1626,1628],{"class":1627},"sOUxV"," 123",[1038,1630,1631],{"class":1174}," }\n",[1038,1633,1634,1636],{"class":1040,"line":1066},[1038,1635,1269],{"class":1174},[1038,1637,1272],{"class":1178},[1396,1639,1641],{"id":1640},"服务端插件server-plugins","服务端插件（Server Plugins）",[1024,1643,1493,1644,1647],{},[1035,1645,1646],{},"~~\u002Fserver\u002Fplugins"," 目录中的任何文件，并将它们注册为 Nitro 插件。这允许扩展 Nitro 的运行时行为并钩入生命周期事件。",[1024,1649,1650],{},[1429,1651,1431],{},[1028,1653,1656],{"className":1159,"code":1654,"filename":1655,"language":1162,"meta":354,"style":354},"import { definePlugin } from 'nitro'\n\nexport default definePlugin((nitroApp) => {\n  console.log('Nitro plugin', nitroApp)\n})\n","server\u002Fplugins\u002FnitroPlugin.ts",[1035,1657,1658,1678,1682,1703,1728],{"__ignoreMap":354},[1038,1659,1660,1662,1664,1667,1669,1671,1673,1676],{"class":1040,"line":1041},[1038,1661,1171],{"class":1170},[1038,1663,1175],{"class":1174},[1038,1665,1666],{"class":1178}," definePlugin",[1038,1668,1182],{"class":1174},[1038,1670,1185],{"class":1170},[1038,1672,1189],{"class":1188},[1038,1674,1675],{"class":1192},"nitro",[1038,1677,1196],{"class":1188},[1038,1679,1680],{"class":1040,"line":1055},[1038,1681,1202],{"emptyLinePlaceholder":1201},[1038,1683,1684,1686,1688,1690,1692,1694,1697,1699,1701],{"class":1040,"line":1066},[1038,1685,1207],{"class":1170},[1038,1687,1210],{"class":1170},[1038,1689,1666],{"class":1213},[1038,1691,1216],{"class":1178},[1038,1693,1216],{"class":1174},[1038,1695,1696],{"class":1221},"nitroApp",[1038,1698,1225],{"class":1174},[1038,1700,1229],{"class":1228},[1038,1702,1232],{"class":1174},[1038,1704,1705,1707,1709,1711,1713,1715,1718,1720,1723,1726],{"class":1040,"line":1081},[1038,1706,1540],{"class":1178},[1038,1708,1543],{"class":1174},[1038,1710,1546],{"class":1213},[1038,1712,1216],{"class":1244},[1038,1714,1256],{"class":1188},[1038,1716,1717],{"class":1192},"Nitro plugin",[1038,1719,1256],{"class":1188},[1038,1721,1722],{"class":1174},",",[1038,1724,1725],{"class":1178}," nitroApp",[1038,1727,1272],{"class":1244},[1038,1729,1730,1732],{"class":1040,"line":1091},[1038,1731,1269],{"class":1174},[1038,1733,1272],{"class":1178},[1153,1735,1739,1743,1752],{"to":1736,"target":1737,"title":1738},"https:\u002F\u002Fnitro.build\u002Fguide\u002Fplugins","_blank","Nitro 插件",[1396,1740,1742],{"id":1741},"服务端工具函数server-utilities","服务端工具函数（Server Utilities）",[1024,1744,1745,1746,1751],{},"服务端路由由 ",[1470,1747,1750],{"href":1748,"rel":1749},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fh3",[1474],"h3js\u002Fh3"," 驱动，它提供了一组实用的辅助函数。",[1153,1753,1756,1763,1766,1770,1983,2012,2024,2035,2080,2083,2096,2100,2109,2120,2124,2128,2138,2225,2236,2247,2251,2273,2302,2331,2338,2360,2367,2481,2485,2488,2499,2552,2563,2610,2614,2678,2686,2689,2814,2837,2841,2847,2935,2943,2945,2951,2957,2965,3132,3135,3143,3150,3197,3199,3399,3403,3467,3470,3477,3531,3564,3568,3575,3580,3713,3716,3720,3733,3739,3777],{"to":1754,"target":1737,"title":1755},"https:\u002F\u002Fwww.jsdocs.io\u002Fpackage\u002Fh3#package-index-functions","可用的 H3 请求辅助函数",[1024,1757,1758,1759,1762],{},"你可以在 ",[1035,1760,1761],{},"~~\u002Fserver\u002Futils"," 目录中自行添加更多辅助函数。",[1024,1764,1765],{},"例如，你可以定义一个自定义的处理器工具函数，它包裹原始处理器，并在返回最终响应前执行额外的操作。",[1024,1767,1768],{},[1429,1769,1431],{},[1028,1771,1774],{"className":1159,"code":1772,"filename":1773,"language":1162,"meta":354,"style":354},"export const defineWrappedResponseHandler = \u003CT extends EventHandlerRequest, D> (\n  handler: EventHandler\u003CT, D>,\n): EventHandler\u003CT, D> =>\n  defineEventHandler\u003CT>(async (event) => {\n    try {\n      \u002F\u002F 在路由处理器之前执行某些操作\n      const response = await handler(event)\n      \u002F\u002F 在路由处理器之后执行某些操作\n      return { response }\n    } catch (err) {\n      \u002F\u002F 错误处理\n      return { err }\n    }\n  })\n","server\u002Futils\u002Fhandler.ts",[1035,1775,1776,1811,1832,1853,1880,1887,1892,1913,1919,1931,1951,1957,1969,1975],{"__ignoreMap":354},[1038,1777,1778,1780,1783,1787,1789,1792,1795,1798,1801,1803,1806,1808],{"class":1040,"line":1041},[1038,1779,1207],{"class":1170},[1038,1781,1782],{"class":1228}," const",[1038,1784,1786],{"class":1785},"s5Y2e"," defineWrappedResponseHandler",[1038,1788,1328],{"class":1048},[1038,1790,1791],{"class":1174}," \u003C",[1038,1793,1794],{"class":1044},"T",[1038,1796,1797],{"class":1228}," extends",[1038,1799,1800],{"class":1044}," EventHandlerRequest",[1038,1802,1722],{"class":1174},[1038,1804,1805],{"class":1044}," D",[1038,1807,1377],{"class":1174},[1038,1809,1810],{"class":1178}," (\n",[1038,1812,1813,1816,1818,1821,1823,1825,1827,1829],{"class":1040,"line":1055},[1038,1814,1815],{"class":1221},"  handler",[1038,1817,1248],{"class":1048},[1038,1819,1820],{"class":1044}," EventHandler",[1038,1822,1288],{"class":1174},[1038,1824,1794],{"class":1044},[1038,1826,1722],{"class":1174},[1038,1828,1805],{"class":1044},[1038,1830,1831],{"class":1174},">,\n",[1038,1833,1834,1836,1838,1840,1842,1844,1846,1848,1850],{"class":1040,"line":1066},[1038,1835,1225],{"class":1178},[1038,1837,1248],{"class":1048},[1038,1839,1820],{"class":1044},[1038,1841,1288],{"class":1174},[1038,1843,1794],{"class":1044},[1038,1845,1722],{"class":1174},[1038,1847,1805],{"class":1044},[1038,1849,1377],{"class":1174},[1038,1851,1852],{"class":1228}," =>\n",[1038,1854,1855,1858,1860,1862,1864,1866,1869,1872,1874,1876,1878],{"class":1040,"line":1081},[1038,1856,1857],{"class":1213},"  defineEventHandler",[1038,1859,1288],{"class":1174},[1038,1861,1794],{"class":1044},[1038,1863,1377],{"class":1174},[1038,1865,1216],{"class":1178},[1038,1867,1868],{"class":1228},"async",[1038,1870,1871],{"class":1174}," (",[1038,1873,1222],{"class":1221},[1038,1875,1225],{"class":1174},[1038,1877,1229],{"class":1228},[1038,1879,1232],{"class":1174},[1038,1881,1882,1885],{"class":1040,"line":1091},[1038,1883,1884],{"class":1170},"    try",[1038,1886,1232],{"class":1174},[1038,1888,1889],{"class":1040,"line":1104},[1038,1890,1891],{"class":1077},"      \u002F\u002F 在路由处理器之前执行某些操作\n",[1038,1893,1894,1897,1900,1902,1904,1907,1909,1911],{"class":1040,"line":1114},[1038,1895,1896],{"class":1228},"      const",[1038,1898,1899],{"class":1322}," response",[1038,1901,1328],{"class":1048},[1038,1903,1331],{"class":1170},[1038,1905,1906],{"class":1213}," handler",[1038,1908,1216],{"class":1244},[1038,1910,1222],{"class":1178},[1038,1912,1272],{"class":1244},[1038,1914,1916],{"class":1040,"line":1915},8,[1038,1917,1918],{"class":1077},"      \u002F\u002F 在路由处理器之后执行某些操作\n",[1038,1920,1922,1925,1927,1929],{"class":1040,"line":1921},9,[1038,1923,1924],{"class":1170},"      return",[1038,1926,1175],{"class":1174},[1038,1928,1899],{"class":1178},[1038,1930,1631],{"class":1174},[1038,1932,1934,1937,1940,1942,1945,1948],{"class":1040,"line":1933},10,[1038,1935,1936],{"class":1174},"    }",[1038,1938,1939],{"class":1170}," catch",[1038,1941,1871],{"class":1244},[1038,1943,1944],{"class":1178},"err",[1038,1946,1947],{"class":1244},") ",[1038,1949,1950],{"class":1174},"{\n",[1038,1952,1954],{"class":1040,"line":1953},11,[1038,1955,1956],{"class":1077},"      \u002F\u002F 错误处理\n",[1038,1958,1960,1962,1964,1967],{"class":1040,"line":1959},12,[1038,1961,1924],{"class":1170},[1038,1963,1175],{"class":1174},[1038,1965,1966],{"class":1178}," err",[1038,1968,1631],{"class":1174},[1038,1970,1972],{"class":1040,"line":1971},13,[1038,1973,1974],{"class":1174},"    }\n",[1038,1976,1978,1981],{"class":1040,"line":1977},14,[1038,1979,1980],{"class":1174},"  }",[1038,1982,1272],{"class":1178},[1028,1984,1987],{"className":1159,"code":1985,"filename":1986,"language":1162,"meta":354,"style":354},"export default defineWrappedResponseHandler(event => 'hello world')\n","server\u002Fapi\u002Fhello.get.ts",[1035,1988,1989],{"__ignoreMap":354},[1038,1990,1991,1993,1995,1997,1999,2001,2003,2005,2008,2010],{"class":1040,"line":1041},[1038,1992,1207],{"class":1170},[1038,1994,1210],{"class":1170},[1038,1996,1786],{"class":1213},[1038,1998,1216],{"class":1178},[1038,2000,1222],{"class":1221},[1038,2002,1229],{"class":1228},[1038,2004,1189],{"class":1188},[1038,2006,2007],{"class":1192},"hello world",[1038,2009,1256],{"class":1188},[1038,2011,1272],{"class":1178},[1396,2013,2015,2016],{"id":2014},"服务端别名-v43","服务端别名 ",[2017,2018,2023],"badge",{"className":2019,"color":2021,"size":2022},[2020],"align-middle","info","xs","v4.3",[1024,2025,2026,2027,2030,2031,2034],{},"你可以使用 ",[1035,2028,2029],{},"#server"," 别名从 ",[1035,2032,2033],{},"server\u002F"," 目录中的任意位置导入文件，无论导入文件位于何处。",[1028,2036,2039],{"className":1159,"code":2037,"filename":2038,"language":1162,"meta":354,"style":354},"\u002F\u002F 而不是像这样使用相对路径：\n\u002F\u002F import { formatUser } from '..\u002F..\u002F..\u002Futils\u002FformatUser'\n\n\u002F\u002F 使用 #server 别名：\nimport { formatUser } from '#server\u002Futils\u002FformatUser'\n","server\u002Fapi\u002Fusers\u002F[id]\u002Fprofile.ts",[1035,2040,2041,2046,2051,2055,2060],{"__ignoreMap":354},[1038,2042,2043],{"class":1040,"line":1041},[1038,2044,2045],{"class":1077},"\u002F\u002F 而不是像这样使用相对路径：\n",[1038,2047,2048],{"class":1040,"line":1055},[1038,2049,2050],{"class":1077},"\u002F\u002F import { formatUser } from '..\u002F..\u002F..\u002Futils\u002FformatUser'\n",[1038,2052,2053],{"class":1040,"line":1066},[1038,2054,1202],{"emptyLinePlaceholder":1201},[1038,2056,2057],{"class":1040,"line":1081},[1038,2058,2059],{"class":1077},"\u002F\u002F 使用 #server 别名：\n",[1038,2061,2062,2064,2066,2069,2071,2073,2075,2078],{"class":1040,"line":1091},[1038,2063,1171],{"class":1170},[1038,2065,1175],{"class":1174},[1038,2067,2068],{"class":1178}," formatUser",[1038,2070,1182],{"class":1174},[1038,2072,1185],{"class":1170},[1038,2074,1189],{"class":1188},[1038,2076,2077],{"class":1192},"#server\u002Futils\u002FformatUser",[1038,2079,1196],{"class":1188},[1024,2081,2082],{},"此别名可确保服务端代码中的导入保持一致，在深层嵌套的路由处理器中尤其有用。",[1477,2084,2085],{},[1024,2086,2087,2089,2090,2092,2093,2095],{},[1035,2088,2029],{}," 别名只能在 ",[1035,2091,2033],{}," 目录内使用。在客户端代码中使用 ",[1035,2094,2029],{}," 导入会导致错误。",[1396,2097,2099],{"id":2098},"服务端类型server-types","服务端类型（Server Types）",[1024,2101,2102,2104,2105,2108],{},[1035,2103,2033],{}," 目录的自动导入和其他类型与应用（app）目录不同，因为它运行在与 ",[1035,2106,2107],{},"app\u002F"," 目录不同的上下文中。",[1024,2110,2111,2112,2116,2117,2119],{},"默认情况下，Nuxt 4 会生成一个 ",[1470,2113,2114],{"href":181},[1035,2115,182],{},"，其中包含一个覆盖 ",[1035,2118,2033],{}," 文件夹的项目引用，以确保类型准确。",[1396,2121,2123],{"id":2122},"配方recipes","配方（Recipes）",[2125,2126,2127],"h3",{"id":2127},"路由参数",[1024,2129,2130,2131,2134,2135,1475],{},"服务端路由可以像 ",[1035,2132,2133],{},"\u002Fapi\u002Fhello\u002F[name].ts"," 这样在文件名中使用方括号内的动态参数，并通过 ",[1035,2136,2137],{},"event.context.params",[1028,2139,2142],{"className":1159,"code":2140,"filename":2141,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  const name = getRouterParam(event, 'name')\n\n  return `Hello, ${name}!`\n})\n","server\u002Fapi\u002Fhello\u002F[name].ts",[1035,2143,2144,2164,2192,2196,2219],{"__ignoreMap":354},[1038,2145,2146,2148,2150,2152,2154,2156,2158,2160,2162],{"class":1040,"line":1041},[1038,2147,1207],{"class":1170},[1038,2149,1210],{"class":1170},[1038,2151,1179],{"class":1213},[1038,2153,1216],{"class":1178},[1038,2155,1216],{"class":1174},[1038,2157,1222],{"class":1221},[1038,2159,1225],{"class":1174},[1038,2161,1229],{"class":1228},[1038,2163,1232],{"class":1174},[1038,2165,2166,2169,2172,2174,2177,2179,2181,2183,2185,2188,2190],{"class":1040,"line":1055},[1038,2167,2168],{"class":1228},"  const",[1038,2170,2171],{"class":1322}," name",[1038,2173,1328],{"class":1048},[1038,2175,2176],{"class":1213}," getRouterParam",[1038,2178,1216],{"class":1244},[1038,2180,1222],{"class":1178},[1038,2182,1722],{"class":1174},[1038,2184,1189],{"class":1188},[1038,2186,2187],{"class":1192},"name",[1038,2189,1256],{"class":1188},[1038,2191,1272],{"class":1244},[1038,2193,2194],{"class":1040,"line":1066},[1038,2195,1202],{"emptyLinePlaceholder":1201},[1038,2197,2198,2200,2203,2206,2209,2211,2213,2216],{"class":1040,"line":1081},[1038,2199,1237],{"class":1170},[1038,2201,2202],{"class":1188}," `",[1038,2204,2205],{"class":1192},"Hello, ",[1038,2207,2208],{"class":1188},"${",[1038,2210,2187],{"class":1178},[1038,2212,1269],{"class":1188},[1038,2214,2215],{"class":1192},"!",[1038,2217,2218],{"class":1188},"`\n",[1038,2220,2221,2223],{"class":1040,"line":1091},[1038,2222,1269],{"class":1174},[1038,2224,1272],{"class":1178},[2226,2227,2229],"tip",{"to":2228},"https:\u002F\u002Fh3.dev\u002Fexamples\u002Fvalidate-data#validate-params",[1024,2230,2231,2232,2235],{},"或者，使用 ",[1035,2233,2234],{},"getValidatedRouterParams"," 配合 Zod 之类的架构校验器，以获得运行时和类型安全。",[1024,2237,2238,2239,2242,2243,2246],{},"你现在可以通用地调用 ",[1035,2240,2241],{},"\u002Fapi\u002Fhello\u002Fnuxt"," 这个 API，并得到 ",[1035,2244,2245],{},"Hello, nuxt!","。",[2125,2248,2250],{"id":2249},"匹配-http-方法","匹配 HTTP 方法",[1024,2252,2253,2254,2257,2258,2257,2261,2257,2264,2267,2268,2246],{},"处理文件名可以添加 ",[1035,2255,2256],{},".get","、",[1035,2259,2260],{},".post",[1035,2262,2263],{},".put",[1035,2265,2266],{},".delete"," 等后缀，以匹配请求的 ",[1470,2269,2272],{"href":2270,"rel":2271},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FReference\u002FMethods",[1474],"HTTP 方法",[1028,2274,2277],{"className":1159,"code":2275,"filename":2276,"language":1162,"meta":354,"style":354},"export default defineEventHandler(() => 'Test get handler')\n","server\u002Fapi\u002Ftest.get.ts",[1035,2278,2279],{"__ignoreMap":354},[1038,2280,2281,2283,2285,2287,2289,2291,2293,2295,2298,2300],{"class":1040,"line":1041},[1038,2282,1207],{"class":1170},[1038,2284,1210],{"class":1170},[1038,2286,1179],{"class":1213},[1038,2288,1216],{"class":1178},[1038,2290,1450],{"class":1174},[1038,2292,1229],{"class":1228},[1038,2294,1189],{"class":1188},[1038,2296,2297],{"class":1192},"Test get handler",[1038,2299,1256],{"class":1188},[1038,2301,1272],{"class":1178},[1028,2303,2306],{"className":1159,"code":2304,"filename":2305,"language":1162,"meta":354,"style":354},"export default defineEventHandler(() => 'Test post handler')\n","server\u002Fapi\u002Ftest.post.ts",[1035,2307,2308],{"__ignoreMap":354},[1038,2309,2310,2312,2314,2316,2318,2320,2322,2324,2327,2329],{"class":1040,"line":1041},[1038,2311,1207],{"class":1170},[1038,2313,1210],{"class":1170},[1038,2315,1179],{"class":1213},[1038,2317,1216],{"class":1178},[1038,2319,1450],{"class":1174},[1038,2321,1229],{"class":1228},[1038,2323,1189],{"class":1188},[1038,2325,2326],{"class":1192},"Test post handler",[1038,2328,1256],{"class":1188},[1038,2330,1272],{"class":1178},[1024,2332,2333,2334,2337],{},"以上例来说，向 ",[1035,2335,2336],{},"\u002Ftest"," 发起：",[2339,2340,2341,2350,2357],"ul",{},[2342,2343,2344,2347,2348],"li",{},[1429,2345,2346],{},"GET"," 方法：返回 ",[1035,2349,2297],{},[2342,2351,2352,2347,2355],{},[1429,2353,2354],{},"POST",[1035,2356,2326],{},[2342,2358,2359],{},"任何其它方法：返回 405 错误",[1024,2361,2362,2363,2366],{},"你也可以在目录内使用 ",[1035,2364,2365],{},"index.[method].ts","，以不同的方式组织代码，这对于创建 API 命名空间很有用。",[2368,2369,2370,2407,2444],"code-group",{},[1028,2371,2374],{"className":1159,"code":2372,"filename":2373,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  \u002F\u002F 处理 `api\u002Ffoo` 端点的 GET 请求\n})\n","server\u002Fapi\u002Ffoo\u002Findex.get.ts",[1035,2375,2376,2396,2401],{"__ignoreMap":354},[1038,2377,2378,2380,2382,2384,2386,2388,2390,2392,2394],{"class":1040,"line":1041},[1038,2379,1207],{"class":1170},[1038,2381,1210],{"class":1170},[1038,2383,1179],{"class":1213},[1038,2385,1216],{"class":1178},[1038,2387,1216],{"class":1174},[1038,2389,1222],{"class":1221},[1038,2391,1225],{"class":1174},[1038,2393,1229],{"class":1228},[1038,2395,1232],{"class":1174},[1038,2397,2398],{"class":1040,"line":1055},[1038,2399,2400],{"class":1077},"  \u002F\u002F 处理 `api\u002Ffoo` 端点的 GET 请求\n",[1038,2402,2403,2405],{"class":1040,"line":1066},[1038,2404,1269],{"class":1174},[1038,2406,1272],{"class":1178},[1028,2408,2411],{"className":1159,"code":2409,"filename":2410,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  \u002F\u002F 处理 `api\u002Ffoo` 端点的 POST 请求\n})\n","server\u002Fapi\u002Ffoo\u002Findex.post.ts",[1035,2412,2413,2433,2438],{"__ignoreMap":354},[1038,2414,2415,2417,2419,2421,2423,2425,2427,2429,2431],{"class":1040,"line":1041},[1038,2416,1207],{"class":1170},[1038,2418,1210],{"class":1170},[1038,2420,1179],{"class":1213},[1038,2422,1216],{"class":1178},[1038,2424,1216],{"class":1174},[1038,2426,1222],{"class":1221},[1038,2428,1225],{"class":1174},[1038,2430,1229],{"class":1228},[1038,2432,1232],{"class":1174},[1038,2434,2435],{"class":1040,"line":1055},[1038,2436,2437],{"class":1077},"  \u002F\u002F 处理 `api\u002Ffoo` 端点的 POST 请求\n",[1038,2439,2440,2442],{"class":1040,"line":1066},[1038,2441,1269],{"class":1174},[1038,2443,1272],{"class":1178},[1028,2445,2448],{"className":1159,"code":2446,"filename":2447,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  \u002F\u002F 处理 `api\u002Ffoo\u002Fbar` 端点的 GET 请求\n})\n","server\u002Fapi\u002Ffoo\u002Fbar.get.ts",[1035,2449,2450,2470,2475],{"__ignoreMap":354},[1038,2451,2452,2454,2456,2458,2460,2462,2464,2466,2468],{"class":1040,"line":1041},[1038,2453,1207],{"class":1170},[1038,2455,1210],{"class":1170},[1038,2457,1179],{"class":1213},[1038,2459,1216],{"class":1178},[1038,2461,1216],{"class":1174},[1038,2463,1222],{"class":1221},[1038,2465,1225],{"class":1174},[1038,2467,1229],{"class":1228},[1038,2469,1232],{"class":1174},[1038,2471,2472],{"class":1040,"line":1055},[1038,2473,2474],{"class":1077},"  \u002F\u002F 处理 `api\u002Ffoo\u002Fbar` 端点的 GET 请求\n",[1038,2476,2477,2479],{"class":1040,"line":1066},[1038,2478,1269],{"class":1174},[1038,2480,1272],{"class":1178},[2125,2482,2484],{"id":2483},"全捕获路由catch-all-route","全捕获路由（Catch-all Route）",[1024,2486,2487],{},"全捕获路由有助于处理回退路由。",[1024,2489,2490,2491,2494,2495,2498],{},"例如，创建一个名为 ",[1035,2492,2493],{},"~~\u002Fserver\u002Fapi\u002Ffoo\u002F[...].ts"," 的文件，将会为所有未匹配到任何路由处理器的请求（如 ",[1035,2496,2497],{},"\u002Fapi\u002Ffoo\u002Fbar\u002Fbaz","）注册一个全捕获路由。",[1028,2500,2503],{"className":1159,"code":2501,"filename":2502,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  \u002F\u002F event.context.path 获取路由路径：'\u002Fapi\u002Ffoo\u002Fbar\u002Fbaz'\n  \u002F\u002F event.context.params._ 获取路由片段：'bar\u002Fbaz'\n  return `Default foo handler`\n})\n","server\u002Fapi\u002Ffoo\u002F[...].ts",[1035,2504,2505,2525,2530,2535,2546],{"__ignoreMap":354},[1038,2506,2507,2509,2511,2513,2515,2517,2519,2521,2523],{"class":1040,"line":1041},[1038,2508,1207],{"class":1170},[1038,2510,1210],{"class":1170},[1038,2512,1179],{"class":1213},[1038,2514,1216],{"class":1178},[1038,2516,1216],{"class":1174},[1038,2518,1222],{"class":1221},[1038,2520,1225],{"class":1174},[1038,2522,1229],{"class":1228},[1038,2524,1232],{"class":1174},[1038,2526,2527],{"class":1040,"line":1055},[1038,2528,2529],{"class":1077},"  \u002F\u002F event.context.path 获取路由路径：'\u002Fapi\u002Ffoo\u002Fbar\u002Fbaz'\n",[1038,2531,2532],{"class":1040,"line":1066},[1038,2533,2534],{"class":1077},"  \u002F\u002F event.context.params._ 获取路由片段：'bar\u002Fbaz'\n",[1038,2536,2537,2539,2541,2544],{"class":1040,"line":1081},[1038,2538,1237],{"class":1170},[1038,2540,2202],{"class":1188},[1038,2542,2543],{"class":1192},"Default foo handler",[1038,2545,2218],{"class":1188},[1038,2547,2548,2550],{"class":1040,"line":1091},[1038,2549,1269],{"class":1174},[1038,2551,1272],{"class":1178},[1024,2553,2554,2555,2558,2559,2562],{},"你可以通过使用 ",[1035,2556,2557],{},"~~\u002Fserver\u002Fapi\u002Ffoo\u002F[...slug].ts"," 为全捕获路由设置一个名称，并通过 ",[1035,2560,2561],{},"event.context.params.slug"," 访问它。",[1028,2564,2567],{"className":1159,"code":2565,"filename":2566,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  \u002F\u002F event.context.params.slug 获取路由片段：'bar\u002Fbaz'\n  return `Default foo handler`\n})\n","server\u002Fapi\u002Ffoo\u002F[...slug].ts",[1035,2568,2569,2589,2594,2604],{"__ignoreMap":354},[1038,2570,2571,2573,2575,2577,2579,2581,2583,2585,2587],{"class":1040,"line":1041},[1038,2572,1207],{"class":1170},[1038,2574,1210],{"class":1170},[1038,2576,1179],{"class":1213},[1038,2578,1216],{"class":1178},[1038,2580,1216],{"class":1174},[1038,2582,1222],{"class":1221},[1038,2584,1225],{"class":1174},[1038,2586,1229],{"class":1228},[1038,2588,1232],{"class":1174},[1038,2590,2591],{"class":1040,"line":1055},[1038,2592,2593],{"class":1077},"  \u002F\u002F event.context.params.slug 获取路由片段：'bar\u002Fbaz'\n",[1038,2595,2596,2598,2600,2602],{"class":1040,"line":1066},[1038,2597,1237],{"class":1170},[1038,2599,2202],{"class":1188},[1038,2601,2543],{"class":1192},[1038,2603,2218],{"class":1188},[1038,2605,2606,2608],{"class":1040,"line":1081},[1038,2607,1269],{"class":1174},[1038,2609,1272],{"class":1178},[2125,2611,2613],{"id":2612},"请求体处理body-handling","请求体处理（Body Handling）",[1028,2615,2618],{"className":1159,"code":2616,"filename":2617,"language":1162,"meta":354,"style":354},"export default defineEventHandler(async (event) => {\n  const body = await readBody(event)\n  return { body }\n})\n","server\u002Fapi\u002Fsubmit.post.ts",[1035,2619,2620,2642,2662,2672],{"__ignoreMap":354},[1038,2621,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640],{"class":1040,"line":1041},[1038,2623,1207],{"class":1170},[1038,2625,1210],{"class":1170},[1038,2627,1179],{"class":1213},[1038,2629,1216],{"class":1178},[1038,2631,1868],{"class":1228},[1038,2633,1871],{"class":1174},[1038,2635,1222],{"class":1221},[1038,2637,1225],{"class":1174},[1038,2639,1229],{"class":1228},[1038,2641,1232],{"class":1174},[1038,2643,2644,2646,2649,2651,2653,2656,2658,2660],{"class":1040,"line":1055},[1038,2645,2168],{"class":1228},[1038,2647,2648],{"class":1322}," body",[1038,2650,1328],{"class":1048},[1038,2652,1331],{"class":1170},[1038,2654,2655],{"class":1213}," readBody",[1038,2657,1216],{"class":1244},[1038,2659,1222],{"class":1178},[1038,2661,1272],{"class":1244},[1038,2663,2664,2666,2668,2670],{"class":1040,"line":1066},[1038,2665,1237],{"class":1170},[1038,2667,1175],{"class":1174},[1038,2669,2648],{"class":1178},[1038,2671,1631],{"class":1174},[1038,2673,2674,2676],{"class":1040,"line":1081},[1038,2675,1269],{"class":1174},[1038,2677,1272],{"class":1178},[2226,2679,2681],{"to":2680},"https:\u002F\u002Funjs.io\u002Fblog\u002F2023-08-15-h3-towards-the-edge-of-the-web\u002F#runtime-type-safe-request-utils",[1024,2682,2231,2683,2235],{},[1035,2684,2685],{},"readValidatedBody",[1024,2687,2688],{},"你现在可以通用地调用这个 API：",[1028,2690,2693],{"className":1278,"code":2691,"filename":2692,"language":1281,"meta":354,"style":354},"\u003Cscript setup lang=\"ts\">\nasync function submit () {\n  const { body } = await $fetch('\u002Fapi\u002Fsubmit', {\n    method: 'post',\n    body: { test: 123 },\n  })\n}\n\u003C\u002Fscript>\n","app\u002Fapp.vue",[1035,2694,2695,2715,2730,2760,2776,2795,2801,2806],{"__ignoreMap":354},[1038,2696,2697,2699,2701,2703,2705,2707,2709,2711,2713],{"class":1040,"line":1041},[1038,2698,1288],{"class":1174},[1038,2700,1292],{"class":1291},[1038,2702,1296],{"class":1295},[1038,2704,1299],{"class":1295},[1038,2706,1302],{"class":1174},[1038,2708,1305],{"class":1188},[1038,2710,1162],{"class":1192},[1038,2712,1305],{"class":1188},[1038,2714,1312],{"class":1174},[1038,2716,2717,2719,2722,2725,2728],{"class":1040,"line":1055},[1038,2718,1868],{"class":1228},[1038,2720,2721],{"class":1228}," function",[1038,2723,2724],{"class":1213}," submit",[1038,2726,2727],{"class":1174}," ()",[1038,2729,1232],{"class":1174},[1038,2731,2732,2734,2736,2738,2740,2742,2744,2747,2749,2751,2754,2756,2758],{"class":1040,"line":1066},[1038,2733,2168],{"class":1228},[1038,2735,1175],{"class":1174},[1038,2737,2648],{"class":1322},[1038,2739,1182],{"class":1174},[1038,2741,1328],{"class":1048},[1038,2743,1331],{"class":1170},[1038,2745,2746],{"class":1213}," $fetch",[1038,2748,1216],{"class":1244},[1038,2750,1256],{"class":1188},[1038,2752,2753],{"class":1192},"\u002Fapi\u002Fsubmit",[1038,2755,1256],{"class":1188},[1038,2757,1722],{"class":1174},[1038,2759,1232],{"class":1174},[1038,2761,2762,2765,2767,2769,2772,2774],{"class":1040,"line":1081},[1038,2763,2764],{"class":1244},"    method",[1038,2766,1248],{"class":1174},[1038,2768,1189],{"class":1188},[1038,2770,2771],{"class":1192},"post",[1038,2773,1256],{"class":1188},[1038,2775,1259],{"class":1174},[1038,2777,2778,2781,2783,2785,2788,2790,2792],{"class":1040,"line":1091},[1038,2779,2780],{"class":1244},"    body",[1038,2782,1248],{"class":1174},[1038,2784,1175],{"class":1174},[1038,2786,2787],{"class":1244}," test",[1038,2789,1248],{"class":1174},[1038,2791,1628],{"class":1627},[1038,2793,2794],{"class":1174}," },\n",[1038,2796,2797,2799],{"class":1040,"line":1104},[1038,2798,1980],{"class":1174},[1038,2800,1272],{"class":1244},[1038,2802,2803],{"class":1040,"line":1114},[1038,2804,2805],{"class":1174},"}\n",[1038,2807,2808,2810,2812],{"class":1040,"line":1915},[1038,2809,1350],{"class":1174},[1038,2811,1292],{"class":1291},[1038,2813,1312],{"class":1174},[1477,2815,2816],{},[1024,2817,2818,2819,2822,2823,2825,2826,2829,2830,2832,2833,2836],{},"我们在文件名中使用 ",[1035,2820,2821],{},"submit.post.ts"," 只是为了匹配能接收请求体的 ",[1035,2824,2354],{}," 方法请求。在 GET 请求中使用 ",[1035,2827,2828],{},"readBody"," 时，",[1035,2831,2828],{}," 会抛出 ",[1035,2834,2835],{},"405 Method Not Allowed"," HTTP 错误。",[2125,2838,2840],{"id":2839},"查询参数query-parameters","查询参数（Query Parameters）",[1024,2842,2843,2844],{},"示例查询 ",[1035,2845,2846],{},"\u002Fapi\u002Fquery?foo=bar&baz=qux",[1028,2848,2851],{"className":1159,"code":2849,"filename":2850,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  const query = getQuery(event)\n\n  return { a: query.foo, b: query.baz }\n})\n","server\u002Fapi\u002Fquery.get.ts",[1035,2852,2853,2873,2891,2895,2929],{"__ignoreMap":354},[1038,2854,2855,2857,2859,2861,2863,2865,2867,2869,2871],{"class":1040,"line":1041},[1038,2856,1207],{"class":1170},[1038,2858,1210],{"class":1170},[1038,2860,1179],{"class":1213},[1038,2862,1216],{"class":1178},[1038,2864,1216],{"class":1174},[1038,2866,1222],{"class":1221},[1038,2868,1225],{"class":1174},[1038,2870,1229],{"class":1228},[1038,2872,1232],{"class":1174},[1038,2874,2875,2877,2880,2882,2885,2887,2889],{"class":1040,"line":1055},[1038,2876,2168],{"class":1228},[1038,2878,2879],{"class":1322}," query",[1038,2881,1328],{"class":1048},[1038,2883,2884],{"class":1213}," getQuery",[1038,2886,1216],{"class":1244},[1038,2888,1222],{"class":1178},[1038,2890,1272],{"class":1244},[1038,2892,2893],{"class":1040,"line":1066},[1038,2894,1202],{"emptyLinePlaceholder":1201},[1038,2896,2897,2899,2901,2904,2906,2908,2910,2913,2915,2918,2920,2922,2924,2927],{"class":1040,"line":1081},[1038,2898,1237],{"class":1170},[1038,2900,1175],{"class":1174},[1038,2902,2903],{"class":1244}," a",[1038,2905,1248],{"class":1174},[1038,2907,2879],{"class":1178},[1038,2909,1543],{"class":1174},[1038,2911,2912],{"class":1178},"foo",[1038,2914,1722],{"class":1174},[1038,2916,2917],{"class":1244}," b",[1038,2919,1248],{"class":1174},[1038,2921,2879],{"class":1178},[1038,2923,1543],{"class":1174},[1038,2925,2926],{"class":1178},"baz",[1038,2928,1631],{"class":1174},[1038,2930,2931,2933],{"class":1040,"line":1091},[1038,2932,1269],{"class":1174},[1038,2934,1272],{"class":1178},[2226,2936,2938],{"to":2937},"https:\u002F\u002Funjs.io\u002Fblog\u002F2023-08-15-h3-towards-the-edge-of-the-web#runtime-type-safe-request-utils",[1024,2939,2231,2940,2235],{},[1035,2941,2942],{},"getValidatedQuery",[2125,2944,50],{"id":50},[1024,2946,2947,2948,2246],{},"如果不抛出任何错误，将返回状态码 ",[1035,2949,2950],{},"200 OK",[1024,2952,2953,2954,2836],{},"任何未捕获的错误都会返回 ",[1035,2955,2956],{},"500 Internal Server Error",[1024,2958,2959,2960,2964],{},"要返回其它错误码，请使用 ",[1470,2961,2962],{"href":580},[1035,2963,581],{}," 抛出异常：",[1028,2966,2969],{"className":1159,"code":2967,"filename":2968,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  const id = Number.parseInt(event.context.params.id) as number\n\n  if (!Number.isInteger(id)) {\n    throw createError({\n      status: 400,\n      statusText: 'ID should be an integer',\n    })\n  }\n  return 'All good'\n})\n","server\u002Fapi\u002Fvalidation\u002F[id].ts",[1035,2970,2971,2991,3035,3039,3065,3077,3089,3105,3111,3115,3126],{"__ignoreMap":354},[1038,2972,2973,2975,2977,2979,2981,2983,2985,2987,2989],{"class":1040,"line":1041},[1038,2974,1207],{"class":1170},[1038,2976,1210],{"class":1170},[1038,2978,1179],{"class":1213},[1038,2980,1216],{"class":1178},[1038,2982,1216],{"class":1174},[1038,2984,1222],{"class":1221},[1038,2986,1225],{"class":1174},[1038,2988,1229],{"class":1228},[1038,2990,1232],{"class":1174},[1038,2992,2993,2995,2998,3000,3003,3005,3008,3010,3012,3014,3016,3018,3021,3023,3026,3028,3031],{"class":1040,"line":1055},[1038,2994,2168],{"class":1228},[1038,2996,2997],{"class":1322}," id",[1038,2999,1328],{"class":1048},[1038,3001,3002],{"class":1178}," Number",[1038,3004,1543],{"class":1174},[1038,3006,3007],{"class":1213},"parseInt",[1038,3009,1216],{"class":1244},[1038,3011,1222],{"class":1178},[1038,3013,1543],{"class":1174},[1038,3015,1610],{"class":1178},[1038,3017,1543],{"class":1174},[1038,3019,3020],{"class":1178},"params",[1038,3022,1543],{"class":1174},[1038,3024,3025],{"class":1178},"id",[1038,3027,1947],{"class":1244},[1038,3029,3030],{"class":1170},"as",[1038,3032,3034],{"class":3033},"seQRr"," number\n",[1038,3036,3037],{"class":1040,"line":1066},[1038,3038,1202],{"emptyLinePlaceholder":1201},[1038,3040,3041,3044,3046,3048,3051,3053,3056,3058,3060,3063],{"class":1040,"line":1081},[1038,3042,3043],{"class":1170},"  if",[1038,3045,1871],{"class":1244},[1038,3047,2215],{"class":1048},[1038,3049,3050],{"class":1178},"Number",[1038,3052,1543],{"class":1174},[1038,3054,3055],{"class":1213},"isInteger",[1038,3057,1216],{"class":1244},[1038,3059,3025],{"class":1178},[1038,3061,3062],{"class":1244},")) ",[1038,3064,1950],{"class":1174},[1038,3066,3067,3070,3073,3075],{"class":1040,"line":1091},[1038,3068,3069],{"class":1170},"    throw",[1038,3071,3072],{"class":1213}," createError",[1038,3074,1216],{"class":1244},[1038,3076,1950],{"class":1174},[1038,3078,3079,3082,3084,3087],{"class":1040,"line":1104},[1038,3080,3081],{"class":1244},"      status",[1038,3083,1248],{"class":1174},[1038,3085,3086],{"class":1627}," 400",[1038,3088,1259],{"class":1174},[1038,3090,3091,3094,3096,3098,3101,3103],{"class":1040,"line":1114},[1038,3092,3093],{"class":1244},"      statusText",[1038,3095,1248],{"class":1174},[1038,3097,1189],{"class":1188},[1038,3099,3100],{"class":1192},"ID should be an integer",[1038,3102,1256],{"class":1188},[1038,3104,1259],{"class":1174},[1038,3106,3107,3109],{"class":1040,"line":1915},[1038,3108,1936],{"class":1174},[1038,3110,1272],{"class":1244},[1038,3112,3113],{"class":1040,"line":1921},[1038,3114,1264],{"class":1174},[1038,3116,3117,3119,3121,3124],{"class":1040,"line":1933},[1038,3118,1237],{"class":1170},[1038,3120,1189],{"class":1188},[1038,3122,3123],{"class":1192},"All good",[1038,3125,1196],{"class":1188},[1038,3127,3128,3130],{"class":1040,"line":1953},[1038,3129,1269],{"class":1174},[1038,3131,1272],{"class":1178},[2125,3133,3134],{"id":3134},"状态码",[1024,3136,3137,3138,3142],{},"要返回其它状态码，请使用 ",[1470,3139,3140],{"href":656},[1035,3141,657],{}," 工具函数。",[1024,3144,3145,3146,3149],{},"例如，返回 ",[1035,3147,3148],{},"202 Accepted","：",[1028,3151,3153],{"className":1159,"code":3152,"filename":2968,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  setResponseStatus(event, 202)\n})\n",[1035,3154,3155,3175,3191],{"__ignoreMap":354},[1038,3156,3157,3159,3161,3163,3165,3167,3169,3171,3173],{"class":1040,"line":1041},[1038,3158,1207],{"class":1170},[1038,3160,1210],{"class":1170},[1038,3162,1179],{"class":1213},[1038,3164,1216],{"class":1178},[1038,3166,1216],{"class":1174},[1038,3168,1222],{"class":1221},[1038,3170,1225],{"class":1174},[1038,3172,1229],{"class":1228},[1038,3174,1232],{"class":1174},[1038,3176,3177,3180,3182,3184,3186,3189],{"class":1040,"line":1055},[1038,3178,3179],{"class":1213},"  setResponseStatus",[1038,3181,1216],{"class":1244},[1038,3183,1222],{"class":1178},[1038,3185,1722],{"class":1174},[1038,3187,3188],{"class":1627}," 202",[1038,3190,1272],{"class":1244},[1038,3192,3193,3195],{"class":1040,"line":1066},[1038,3194,1269],{"class":1174},[1038,3196,1272],{"class":1178},[2125,3198,322],{"id":322},[2368,3200,3201,3338,3388],{},[1028,3202,3205],{"className":1159,"code":3203,"filename":3204,"language":1162,"meta":354,"style":354},"export default defineEventHandler(async (event) => {\n  const config = useRuntimeConfig()\n\n  const repo = await $fetch('https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnuxt\u002Fnuxt', {\n    headers: {\n      Authorization: `token ${config.githubToken}`,\n    },\n  })\n\n  return repo\n})\n","server\u002Fapi\u002Ffoo.ts",[1035,3206,3207,3229,3244,3248,3274,3283,3310,3315,3321,3325,3332],{"__ignoreMap":354},[1038,3208,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227],{"class":1040,"line":1041},[1038,3210,1207],{"class":1170},[1038,3212,1210],{"class":1170},[1038,3214,1179],{"class":1213},[1038,3216,1216],{"class":1178},[1038,3218,1868],{"class":1228},[1038,3220,1871],{"class":1174},[1038,3222,1222],{"class":1221},[1038,3224,1225],{"class":1174},[1038,3226,1229],{"class":1228},[1038,3228,1232],{"class":1174},[1038,3230,3231,3233,3236,3238,3241],{"class":1040,"line":1055},[1038,3232,2168],{"class":1228},[1038,3234,3235],{"class":1322}," config",[1038,3237,1328],{"class":1048},[1038,3239,3240],{"class":1213}," useRuntimeConfig",[1038,3242,3243],{"class":1244},"()\n",[1038,3245,3246],{"class":1040,"line":1066},[1038,3247,1202],{"emptyLinePlaceholder":1201},[1038,3249,3250,3252,3255,3257,3259,3261,3263,3265,3268,3270,3272],{"class":1040,"line":1081},[1038,3251,2168],{"class":1228},[1038,3253,3254],{"class":1322}," repo",[1038,3256,1328],{"class":1048},[1038,3258,1331],{"class":1170},[1038,3260,2746],{"class":1213},[1038,3262,1216],{"class":1244},[1038,3264,1256],{"class":1188},[1038,3266,3267],{"class":1192},"https:\u002F\u002Fapi.github.com\u002Frepos\u002Fnuxt\u002Fnuxt",[1038,3269,1256],{"class":1188},[1038,3271,1722],{"class":1174},[1038,3273,1232],{"class":1174},[1038,3275,3276,3279,3281],{"class":1040,"line":1091},[1038,3277,3278],{"class":1244},"    headers",[1038,3280,1248],{"class":1174},[1038,3282,1232],{"class":1174},[1038,3284,3285,3288,3290,3292,3295,3297,3300,3302,3305,3308],{"class":1040,"line":1104},[1038,3286,3287],{"class":1244},"      Authorization",[1038,3289,1248],{"class":1174},[1038,3291,2202],{"class":1188},[1038,3293,3294],{"class":1192},"token ",[1038,3296,2208],{"class":1188},[1038,3298,3299],{"class":1178},"config",[1038,3301,1543],{"class":1188},[1038,3303,3304],{"class":1178},"githubToken",[1038,3306,3307],{"class":1188},"}`",[1038,3309,1259],{"class":1174},[1038,3311,3312],{"class":1040,"line":1114},[1038,3313,3314],{"class":1174},"    },\n",[1038,3316,3317,3319],{"class":1040,"line":1915},[1038,3318,1980],{"class":1174},[1038,3320,1272],{"class":1244},[1038,3322,3323],{"class":1040,"line":1921},[1038,3324,1202],{"emptyLinePlaceholder":1201},[1038,3326,3327,3329],{"class":1040,"line":1933},[1038,3328,1237],{"class":1170},[1038,3330,3331],{"class":1178}," repo\n",[1038,3333,3334,3336],{"class":1040,"line":1953},[1038,3335,1269],{"class":1174},[1038,3337,1272],{"class":1178},[1028,3339,3341],{"className":1159,"code":3340,"filename":174,"language":1162,"meta":354,"style":354},"export default defineNuxtConfig({\n  runtimeConfig: {\n    githubToken: '',\n  },\n})\n",[1035,3342,3343,3356,3365,3377,3382],{"__ignoreMap":354},[1038,3344,3345,3347,3349,3352,3354],{"class":1040,"line":1041},[1038,3346,1207],{"class":1170},[1038,3348,1210],{"class":1170},[1038,3350,3351],{"class":1213}," defineNuxtConfig",[1038,3353,1216],{"class":1178},[1038,3355,1950],{"class":1174},[1038,3357,3358,3361,3363],{"class":1040,"line":1055},[1038,3359,3360],{"class":1244},"  runtimeConfig",[1038,3362,1248],{"class":1174},[1038,3364,1232],{"class":1174},[1038,3366,3367,3370,3372,3375],{"class":1040,"line":1066},[1038,3368,3369],{"class":1244},"    githubToken",[1038,3371,1248],{"class":1174},[1038,3373,3374],{"class":1188}," ''",[1038,3376,1259],{"class":1174},[1038,3378,3379],{"class":1040,"line":1081},[1038,3380,3381],{"class":1174},"  },\n",[1038,3383,3384,3386],{"class":1040,"line":1091},[1038,3385,1269],{"class":1174},[1038,3387,1272],{"class":1178},[1028,3389,3393],{"className":3390,"code":3391,"filename":158,"language":3392,"meta":354,"style":354},"language-ini shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","NUXT_GITHUB_TOKEN='\u003Cmy-super-token>'\n","ini",[1035,3394,3395],{"__ignoreMap":354},[1038,3396,3397],{"class":1040,"line":1041},[1038,3398,3391],{},[2125,3400,3402],{"id":3401},"请求-cookie","请求 Cookie",[1028,3404,3407],{"className":1159,"code":3405,"filename":3406,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  const cookies = parseCookies(event)\n\n  return { cookies }\n})\n","server\u002Fapi\u002Fcookies.ts",[1035,3408,3409,3429,3447,3451,3461],{"__ignoreMap":354},[1038,3410,3411,3413,3415,3417,3419,3421,3423,3425,3427],{"class":1040,"line":1041},[1038,3412,1207],{"class":1170},[1038,3414,1210],{"class":1170},[1038,3416,1179],{"class":1213},[1038,3418,1216],{"class":1178},[1038,3420,1216],{"class":1174},[1038,3422,1222],{"class":1221},[1038,3424,1225],{"class":1174},[1038,3426,1229],{"class":1228},[1038,3428,1232],{"class":1174},[1038,3430,3431,3433,3436,3438,3441,3443,3445],{"class":1040,"line":1055},[1038,3432,2168],{"class":1228},[1038,3434,3435],{"class":1322}," cookies",[1038,3437,1328],{"class":1048},[1038,3439,3440],{"class":1213}," parseCookies",[1038,3442,1216],{"class":1244},[1038,3444,1222],{"class":1178},[1038,3446,1272],{"class":1244},[1038,3448,3449],{"class":1040,"line":1066},[1038,3450,1202],{"emptyLinePlaceholder":1201},[1038,3452,3453,3455,3457,3459],{"class":1040,"line":1081},[1038,3454,1237],{"class":1170},[1038,3456,1175],{"class":1174},[1038,3458,3435],{"class":1178},[1038,3460,1631],{"class":1174},[1038,3462,3463,3465],{"class":1040,"line":1091},[1038,3464,1269],{"class":1174},[1038,3466,1272],{"class":1178},[2125,3468,3469],{"id":3469},"转发上下文与请求头",[1024,3471,3472,3473,3476],{},"默认情况下，在服务端路由中发起 fetch 请求时，既不会转发传入请求的请求头，也不会转发请求上下文。你可以使用 ",[1035,3474,3475],{},"event.$fetch"," 在服务端路由发起 fetch 请求时转发请求上下文和请求头。",[1028,3478,3481],{"className":1159,"code":3479,"filename":3480,"language":1162,"meta":354,"style":354},"export default defineEventHandler((event) => {\n  return event.$fetch('\u002Fapi\u002Fforwarded')\n})\n","server\u002Fapi\u002Fforward.ts",[1035,3482,3483,3503,3525],{"__ignoreMap":354},[1038,3484,3485,3487,3489,3491,3493,3495,3497,3499,3501],{"class":1040,"line":1041},[1038,3486,1207],{"class":1170},[1038,3488,1210],{"class":1170},[1038,3490,1179],{"class":1213},[1038,3492,1216],{"class":1178},[1038,3494,1216],{"class":1174},[1038,3496,1222],{"class":1221},[1038,3498,1225],{"class":1174},[1038,3500,1229],{"class":1228},[1038,3502,1232],{"class":1174},[1038,3504,3505,3507,3510,3512,3514,3516,3518,3521,3523],{"class":1040,"line":1055},[1038,3506,1237],{"class":1170},[1038,3508,3509],{"class":1178}," event",[1038,3511,1543],{"class":1174},[1038,3513,553],{"class":1213},[1038,3515,1216],{"class":1244},[1038,3517,1256],{"class":1188},[1038,3519,3520],{"class":1192},"\u002Fapi\u002Fforwarded",[1038,3522,1256],{"class":1188},[1038,3524,1272],{"class":1244},[1038,3526,3527,3529],{"class":1040,"line":1066},[1038,3528,1269],{"class":1174},[1038,3530,1272],{"class":1178},[1477,3532,3533],{},[1024,3534,3535,3538,3539,3542,3543,2257,3546,2257,3549,2257,3552,2257,3555,2257,3558,2257,3561],{},[1429,3536,3537],{},"不应被转发","的请求头将",[1429,3540,3541],{},"不会包含","在请求中。这些请求头例如：\n",[1035,3544,3545],{},"transfer-encoding",[1035,3547,3548],{},"connection",[1035,3550,3551],{},"keep-alive",[1035,3553,3554],{},"upgrade",[1035,3556,3557],{},"expect",[1035,3559,3560],{},"host",[1035,3562,3563],{},"accept",[2125,3565,3567],{"id":3566},"响应后等待-promiseawaiting-promises-after-response","响应后等待 Promise（Awaiting Promises After Response）",[1024,3569,3570,3571,3574],{},"在处理服务端请求时，你可能需要执行一些不应阻塞对客户端的响应（例如缓存和日志记录）的异步任务。你可以使用 ",[1035,3572,3573],{},"event.waitUntil"," 在后台等待一个 Promise，而不会延迟响应。",[1024,3576,3577,3579],{},[1035,3578,3573],{}," 方法接受一个 Promise，该 Promise 会在处理器终止前被等待，确保任务得以完成——即使服务端原本会在响应发送后立即终止处理器。它与运行时平台集成，以利用其在响应发送后处理异步操作的原生能力。",[1028,3581,3584],{"className":1159,"code":3582,"filename":3583,"language":1162,"meta":354,"style":354},"const timeConsumingBackgroundTask = async () => {\n  await new Promise(resolve => setTimeout(resolve, 1000))\n}\n\nexport default eventHandler((event) => {\n  \u002F\u002F 安排一个后台任务，但不阻塞响应\n  event.waitUntil(timeConsumingBackgroundTask())\n\n  \u002F\u002F 立即向客户端发送响应\n  return 'done'\n})\n","server\u002Fapi\u002Fbackground-task.ts",[1035,3585,3586,3604,3636,3640,3644,3665,3670,3687,3691,3696,3707],{"__ignoreMap":354},[1038,3587,3588,3590,3593,3595,3598,3600,3602],{"class":1040,"line":1041},[1038,3589,1317],{"class":1228},[1038,3591,3592],{"class":1785}," timeConsumingBackgroundTask",[1038,3594,1328],{"class":1048},[1038,3596,3597],{"class":1228}," async",[1038,3599,2727],{"class":1174},[1038,3601,1229],{"class":1228},[1038,3603,1232],{"class":1174},[1038,3605,3606,3609,3612,3615,3617,3620,3622,3625,3627,3629,3631,3634],{"class":1040,"line":1055},[1038,3607,3608],{"class":1170},"  await",[1038,3610,3611],{"class":1048}," new",[1038,3613,3614],{"class":3033}," Promise",[1038,3616,1216],{"class":1244},[1038,3618,3619],{"class":1221},"resolve",[1038,3621,1229],{"class":1228},[1038,3623,3624],{"class":1213}," setTimeout",[1038,3626,1216],{"class":1244},[1038,3628,3619],{"class":1178},[1038,3630,1722],{"class":1174},[1038,3632,3633],{"class":1627}," 1000",[1038,3635,1568],{"class":1244},[1038,3637,3638],{"class":1040,"line":1066},[1038,3639,2805],{"class":1174},[1038,3641,3642],{"class":1040,"line":1081},[1038,3643,1202],{"emptyLinePlaceholder":1201},[1038,3645,3646,3648,3650,3653,3655,3657,3659,3661,3663],{"class":1040,"line":1091},[1038,3647,1207],{"class":1170},[1038,3649,1210],{"class":1170},[1038,3651,3652],{"class":1213}," eventHandler",[1038,3654,1216],{"class":1178},[1038,3656,1216],{"class":1174},[1038,3658,1222],{"class":1221},[1038,3660,1225],{"class":1174},[1038,3662,1229],{"class":1228},[1038,3664,1232],{"class":1174},[1038,3666,3667],{"class":1040,"line":1104},[1038,3668,3669],{"class":1077},"  \u002F\u002F 安排一个后台任务，但不阻塞响应\n",[1038,3671,3672,3674,3676,3679,3681,3684],{"class":1040,"line":1114},[1038,3673,1605],{"class":1178},[1038,3675,1543],{"class":1174},[1038,3677,3678],{"class":1213},"waitUntil",[1038,3680,1216],{"class":1244},[1038,3682,3683],{"class":1213},"timeConsumingBackgroundTask",[1038,3685,3686],{"class":1244},"())\n",[1038,3688,3689],{"class":1040,"line":1915},[1038,3690,1202],{"emptyLinePlaceholder":1201},[1038,3692,3693],{"class":1040,"line":1921},[1038,3694,3695],{"class":1077},"  \u002F\u002F 立即向客户端发送响应\n",[1038,3697,3698,3700,3702,3705],{"class":1040,"line":1933},[1038,3699,1237],{"class":1170},[1038,3701,1189],{"class":1188},[1038,3703,3704],{"class":1192},"done",[1038,3706,1196],{"class":1188},[1038,3708,3709,3711],{"class":1040,"line":1953},[1038,3710,1269],{"class":1174},[1038,3712,1272],{"class":1178},[1396,3714,3715],{"id":3715},"高级用法",[2125,3717,3719],{"id":3718},"nitro-配置","Nitro 配置",[1024,3721,2026,3722,3725,3726,3728,3729,2246],{},[1035,3723,3724],{},"nuxt.config"," 中的 ",[1035,3727,1675],{}," 键来直接设置 ",[1470,3730,3719],{"href":3731,"rel":3732},"https:\u002F\u002Fnitro.build\u002Fconfig",[1474],[3734,3735,3736],"warning",{},[1024,3737,3738],{},"这是一个高级选项。自定义配置可能会影响生产部署，因为当 Nitro 在 Nuxt 的 semver 次版本中升级时，配置接口可能会发生变化。",[1028,3740,3742],{"className":1159,"code":3741,"filename":174,"language":1162,"meta":354,"style":354},"export default defineNuxtConfig({\n  \u002F\u002F https:\u002F\u002Fnitro.build\u002Fconfig\n  nitro: {},\n})\n",[1035,3743,3744,3756,3761,3771],{"__ignoreMap":354},[1038,3745,3746,3748,3750,3752,3754],{"class":1040,"line":1041},[1038,3747,1207],{"class":1170},[1038,3749,1210],{"class":1170},[1038,3751,3351],{"class":1213},[1038,3753,1216],{"class":1178},[1038,3755,1950],{"class":1174},[1038,3757,3758],{"class":1040,"line":1055},[1038,3759,3760],{"class":1077},"  \u002F\u002F https:\u002F\u002Fnitro.build\u002Fconfig\n",[1038,3762,3763,3766,3768],{"class":1040,"line":1066},[1038,3764,3765],{"class":1244},"  nitro",[1038,3767,1248],{"class":1174},[1038,3769,3770],{"class":1174}," {},\n",[1038,3772,3773,3775],{"class":1040,"line":1081},[1038,3774,1269],{"class":1174},[1038,3776,1272],{"class":1178},[1153,3778,3779,3783,3904,3908,3913,4016,4020,4080,4084,4144,4153,4220,4235,4239,4256,4261,4266,4438,4441,4611,4616,4619],{"to":209},[2125,3780,3782],{"id":3781},"嵌套路由nested-router","嵌套路由（Nested Router）",[1028,3784,3787],{"className":1159,"code":3785,"filename":3786,"language":1162,"meta":354,"style":354},"import { createRouter, defineEventHandler, useBase } from 'h3'\n\nconst router = createRouter()\n\nrouter.get('\u002Ftest', defineEventHandler(() => 'Hello World'))\n\nexport default useBase('\u002Fapi\u002Fhello', router.handler)\n","server\u002Fapi\u002Fhello\u002F[...slug].ts",[1035,3788,3789,3817,3821,3834,3838,3875,3879],{"__ignoreMap":354},[1038,3790,3791,3793,3795,3798,3800,3802,3804,3807,3809,3811,3813,3815],{"class":1040,"line":1041},[1038,3792,1171],{"class":1170},[1038,3794,1175],{"class":1174},[1038,3796,3797],{"class":1178}," createRouter",[1038,3799,1722],{"class":1174},[1038,3801,1179],{"class":1178},[1038,3803,1722],{"class":1174},[1038,3805,3806],{"class":1178}," useBase",[1038,3808,1182],{"class":1174},[1038,3810,1185],{"class":1170},[1038,3812,1189],{"class":1188},[1038,3814,2125],{"class":1192},[1038,3816,1196],{"class":1188},[1038,3818,3819],{"class":1040,"line":1055},[1038,3820,1202],{"emptyLinePlaceholder":1201},[1038,3822,3823,3825,3828,3830,3832],{"class":1040,"line":1066},[1038,3824,1317],{"class":1228},[1038,3826,3827],{"class":1322}," router",[1038,3829,1328],{"class":1048},[1038,3831,3797],{"class":1213},[1038,3833,3243],{"class":1178},[1038,3835,3836],{"class":1040,"line":1081},[1038,3837,1202],{"emptyLinePlaceholder":1201},[1038,3839,3840,3843,3845,3848,3850,3852,3854,3856,3858,3860,3862,3864,3866,3868,3871,3873],{"class":1040,"line":1091},[1038,3841,3842],{"class":1178},"router",[1038,3844,1543],{"class":1174},[1038,3846,3847],{"class":1213},"get",[1038,3849,1216],{"class":1178},[1038,3851,1256],{"class":1188},[1038,3853,2336],{"class":1192},[1038,3855,1256],{"class":1188},[1038,3857,1722],{"class":1174},[1038,3859,1179],{"class":1213},[1038,3861,1216],{"class":1178},[1038,3863,1450],{"class":1174},[1038,3865,1229],{"class":1228},[1038,3867,1189],{"class":1188},[1038,3869,3870],{"class":1192},"Hello World",[1038,3872,1256],{"class":1188},[1038,3874,1568],{"class":1178},[1038,3876,3877],{"class":1040,"line":1104},[1038,3878,1202],{"emptyLinePlaceholder":1201},[1038,3880,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899,3901],{"class":1040,"line":1114},[1038,3882,1207],{"class":1170},[1038,3884,1210],{"class":1170},[1038,3886,3806],{"class":1213},[1038,3888,1216],{"class":1178},[1038,3890,1256],{"class":1188},[1038,3892,1341],{"class":1192},[1038,3894,1256],{"class":1188},[1038,3896,1722],{"class":1174},[1038,3898,3827],{"class":1178},[1038,3900,1543],{"class":1174},[1038,3902,3903],{"class":1178},"handler)\n",[2125,3905,3907],{"id":3906},"发送流sending-streams","发送流（Sending Streams）",[2226,3909,3910],{},[1024,3911,3912],{},"这是一个实验性功能，在所有环境中均可用。",[1028,3914,3917],{"className":1159,"code":3915,"filename":3916,"language":1162,"meta":354,"style":354},"import fs from 'node:fs'\nimport { sendStream } from 'h3'\n\nexport default defineEventHandler((event) => {\n  return sendStream(event, fs.createReadStream('\u002Fpath\u002Fto\u002Ffile'))\n})\n","server\u002Fapi\u002Ffoo.get.ts",[1035,3918,3919,3936,3955,3959,3979,4010],{"__ignoreMap":354},[1038,3920,3921,3923,3926,3929,3931,3934],{"class":1040,"line":1041},[1038,3922,1171],{"class":1170},[1038,3924,3925],{"class":1178}," fs ",[1038,3927,3928],{"class":1170},"from",[1038,3930,1189],{"class":1188},[1038,3932,3933],{"class":1192},"node:fs",[1038,3935,1196],{"class":1188},[1038,3937,3938,3940,3942,3945,3947,3949,3951,3953],{"class":1040,"line":1055},[1038,3939,1171],{"class":1170},[1038,3941,1175],{"class":1174},[1038,3943,3944],{"class":1178}," sendStream",[1038,3946,1182],{"class":1174},[1038,3948,1185],{"class":1170},[1038,3950,1189],{"class":1188},[1038,3952,2125],{"class":1192},[1038,3954,1196],{"class":1188},[1038,3956,3957],{"class":1040,"line":1066},[1038,3958,1202],{"emptyLinePlaceholder":1201},[1038,3960,3961,3963,3965,3967,3969,3971,3973,3975,3977],{"class":1040,"line":1081},[1038,3962,1207],{"class":1170},[1038,3964,1210],{"class":1170},[1038,3966,1179],{"class":1213},[1038,3968,1216],{"class":1178},[1038,3970,1216],{"class":1174},[1038,3972,1222],{"class":1221},[1038,3974,1225],{"class":1174},[1038,3976,1229],{"class":1228},[1038,3978,1232],{"class":1174},[1038,3980,3981,3983,3985,3987,3989,3991,3994,3996,3999,4001,4003,4006,4008],{"class":1040,"line":1091},[1038,3982,1237],{"class":1170},[1038,3984,3944],{"class":1213},[1038,3986,1216],{"class":1244},[1038,3988,1222],{"class":1178},[1038,3990,1722],{"class":1174},[1038,3992,3993],{"class":1178}," fs",[1038,3995,1543],{"class":1174},[1038,3997,3998],{"class":1213},"createReadStream",[1038,4000,1216],{"class":1244},[1038,4002,1256],{"class":1188},[1038,4004,4005],{"class":1192},"\u002Fpath\u002Fto\u002Ffile",[1038,4007,1256],{"class":1188},[1038,4009,1568],{"class":1244},[1038,4011,4012,4014],{"class":1040,"line":1104},[1038,4013,1269],{"class":1174},[1038,4015,1272],{"class":1178},[2125,4017,4019],{"id":4018},"发送重定向sending-redirect","发送重定向（Sending Redirect）",[1028,4021,4023],{"className":1159,"code":4022,"filename":3916,"language":1162,"meta":354,"style":354},"export default defineEventHandler(async (event) => {\n  await sendRedirect(event, '\u002Fpath\u002Fredirect\u002Fto', 302)\n})\n",[1035,4024,4025,4047,4074],{"__ignoreMap":354},[1038,4026,4027,4029,4031,4033,4035,4037,4039,4041,4043,4045],{"class":1040,"line":1041},[1038,4028,1207],{"class":1170},[1038,4030,1210],{"class":1170},[1038,4032,1179],{"class":1213},[1038,4034,1216],{"class":1178},[1038,4036,1868],{"class":1228},[1038,4038,1871],{"class":1174},[1038,4040,1222],{"class":1221},[1038,4042,1225],{"class":1174},[1038,4044,1229],{"class":1228},[1038,4046,1232],{"class":1174},[1038,4048,4049,4051,4054,4056,4058,4060,4062,4065,4067,4069,4072],{"class":1040,"line":1055},[1038,4050,3608],{"class":1170},[1038,4052,4053],{"class":1213}," sendRedirect",[1038,4055,1216],{"class":1244},[1038,4057,1222],{"class":1178},[1038,4059,1722],{"class":1174},[1038,4061,1189],{"class":1188},[1038,4063,4064],{"class":1192},"\u002Fpath\u002Fredirect\u002Fto",[1038,4066,1256],{"class":1188},[1038,4068,1722],{"class":1174},[1038,4070,4071],{"class":1627}," 302",[1038,4073,1272],{"class":1244},[1038,4075,4076,4078],{"class":1040,"line":1066},[1038,4077,1269],{"class":1174},[1038,4079,1272],{"class":1178},[2125,4081,4083],{"id":4082},"旧式处理器或中间件legacy-handler-or-middleware","旧式处理器或中间件（Legacy Handler or Middleware）",[1028,4085,4088],{"className":1159,"code":4086,"filename":4087,"language":1162,"meta":354,"style":354},"export default fromNodeMiddleware((req, res) => {\n  res.end('Legacy handler')\n})\n","server\u002Fapi\u002Flegacy.ts",[1035,4089,4090,4117,4138],{"__ignoreMap":354},[1038,4091,4092,4094,4096,4099,4101,4103,4106,4108,4111,4113,4115],{"class":1040,"line":1041},[1038,4093,1207],{"class":1170},[1038,4095,1210],{"class":1170},[1038,4097,4098],{"class":1213}," fromNodeMiddleware",[1038,4100,1216],{"class":1178},[1038,4102,1216],{"class":1174},[1038,4104,4105],{"class":1221},"req",[1038,4107,1722],{"class":1174},[1038,4109,4110],{"class":1221}," res",[1038,4112,1225],{"class":1174},[1038,4114,1229],{"class":1228},[1038,4116,1232],{"class":1174},[1038,4118,4119,4122,4124,4127,4129,4131,4134,4136],{"class":1040,"line":1055},[1038,4120,4121],{"class":1178},"  res",[1038,4123,1543],{"class":1174},[1038,4125,4126],{"class":1213},"end",[1038,4128,1216],{"class":1244},[1038,4130,1256],{"class":1188},[1038,4132,4133],{"class":1192},"Legacy handler",[1038,4135,1256],{"class":1188},[1038,4137,1272],{"class":1244},[1038,4139,4140,4142],{"class":1040,"line":1066},[1038,4141,1269],{"class":1174},[1038,4143,1272],{"class":1178},[1147,4145,4146],{},[1024,4147,4148,4149,4152],{},"可以使用 ",[1470,4150,1750],{"href":1748,"rel":4151},[1474]," 提供旧式支持，但建议尽可能避免使用旧式处理器。",[1028,4154,4157],{"className":1159,"code":4155,"filename":4156,"language":1162,"meta":354,"style":354},"export default fromNodeMiddleware((req, res, next) => {\n  console.log('Legacy middleware')\n  next()\n})\n","server\u002Fmiddleware\u002Flegacy.ts",[1035,4158,4159,4188,4207,4214],{"__ignoreMap":354},[1038,4160,4161,4163,4165,4167,4169,4171,4173,4175,4177,4179,4182,4184,4186],{"class":1040,"line":1041},[1038,4162,1207],{"class":1170},[1038,4164,1210],{"class":1170},[1038,4166,4098],{"class":1213},[1038,4168,1216],{"class":1178},[1038,4170,1216],{"class":1174},[1038,4172,4105],{"class":1221},[1038,4174,1722],{"class":1174},[1038,4176,4110],{"class":1221},[1038,4178,1722],{"class":1174},[1038,4180,4181],{"class":1221}," next",[1038,4183,1225],{"class":1174},[1038,4185,1229],{"class":1228},[1038,4187,1232],{"class":1174},[1038,4189,4190,4192,4194,4196,4198,4200,4203,4205],{"class":1040,"line":1055},[1038,4191,1540],{"class":1178},[1038,4193,1543],{"class":1174},[1038,4195,1546],{"class":1213},[1038,4197,1216],{"class":1244},[1038,4199,1256],{"class":1188},[1038,4201,4202],{"class":1192},"Legacy middleware",[1038,4204,1256],{"class":1188},[1038,4206,1272],{"class":1244},[1038,4208,4209,4212],{"class":1040,"line":1066},[1038,4210,4211],{"class":1213},"  next",[1038,4213,3243],{"class":1244},[1038,4215,4216,4218],{"class":1040,"line":1081},[1038,4217,1269],{"class":1174},[1038,4219,1272],{"class":1178},[3734,4221,4222],{},[1024,4223,4224,4225,4228,4229,4231,4232,4234],{},"切勿将 ",[1035,4226,4227],{},"next()"," 回调与 ",[1035,4230,1868],{}," 或返回 ",[1035,4233,1141],{}," 的旧式中间件结合使用。",[2125,4236,4238],{"id":4237},"服务端存储server-storage","服务端存储（Server Storage）",[1024,4240,4241,4242,4247,4248,4251,4252,2246],{},"Nitro 提供了一个跨平台的",[1470,4243,4246],{"href":4244,"rel":4245},"https:\u002F\u002Fnitro.build\u002Fguide\u002Fstorage",[1474],"存储层","。要配置额外的存储挂载点，你可以使用 ",[1035,4249,4250],{},"nitro.storage","，或",[1470,4253,4255],{"href":4254},"\u002Fdocs\u002Fdirectory-structure\u002Fserver#server-plugins","服务端插件",[1024,4257,4258],{},[1429,4259,4260],{},"添加 Redis 存储的示例：",[1024,4262,4263,4264,3149],{},"使用 ",[1035,4265,4250],{},[1028,4267,4269],{"className":1159,"code":4268,"filename":174,"language":1162,"meta":354,"style":354},"export default defineNuxtConfig({\n  nitro: {\n    storage: {\n      redis: {\n        driver: 'redis',\n        \u002F* redis 连接器选项 *\u002F\n        port: 6379, \u002F\u002F Redis 端口\n        host: '127.0.0.1', \u002F\u002F Redis 主机\n        username: '', \u002F\u002F 需要 Redis >= 6\n        password: '',\n        db: 0, \u002F\u002F 默认为 0\n        tls: {}, \u002F\u002F tls\u002Fssl\n      },\n    },\n  },\n})\n",[1035,4270,4271,4283,4291,4300,4309,4325,4330,4345,4364,4378,4389,4404,4417,4422,4426,4431],{"__ignoreMap":354},[1038,4272,4273,4275,4277,4279,4281],{"class":1040,"line":1041},[1038,4274,1207],{"class":1170},[1038,4276,1210],{"class":1170},[1038,4278,3351],{"class":1213},[1038,4280,1216],{"class":1178},[1038,4282,1950],{"class":1174},[1038,4284,4285,4287,4289],{"class":1040,"line":1055},[1038,4286,3765],{"class":1244},[1038,4288,1248],{"class":1174},[1038,4290,1232],{"class":1174},[1038,4292,4293,4296,4298],{"class":1040,"line":1066},[1038,4294,4295],{"class":1244},"    storage",[1038,4297,1248],{"class":1174},[1038,4299,1232],{"class":1174},[1038,4301,4302,4305,4307],{"class":1040,"line":1081},[1038,4303,4304],{"class":1244},"      redis",[1038,4306,1248],{"class":1174},[1038,4308,1232],{"class":1174},[1038,4310,4311,4314,4316,4318,4321,4323],{"class":1040,"line":1091},[1038,4312,4313],{"class":1244},"        driver",[1038,4315,1248],{"class":1174},[1038,4317,1189],{"class":1188},[1038,4319,4320],{"class":1192},"redis",[1038,4322,1256],{"class":1188},[1038,4324,1259],{"class":1174},[1038,4326,4327],{"class":1040,"line":1104},[1038,4328,4329],{"class":1077},"        \u002F* redis 连接器选项 *\u002F\n",[1038,4331,4332,4335,4337,4340,4342],{"class":1040,"line":1114},[1038,4333,4334],{"class":1244},"        port",[1038,4336,1248],{"class":1174},[1038,4338,4339],{"class":1627}," 6379",[1038,4341,1722],{"class":1174},[1038,4343,4344],{"class":1077}," \u002F\u002F Redis 端口\n",[1038,4346,4347,4350,4352,4354,4357,4359,4361],{"class":1040,"line":1915},[1038,4348,4349],{"class":1244},"        host",[1038,4351,1248],{"class":1174},[1038,4353,1189],{"class":1188},[1038,4355,4356],{"class":1192},"127.0.0.1",[1038,4358,1256],{"class":1188},[1038,4360,1722],{"class":1174},[1038,4362,4363],{"class":1077}," \u002F\u002F Redis 主机\n",[1038,4365,4366,4369,4371,4373,4375],{"class":1040,"line":1921},[1038,4367,4368],{"class":1244},"        username",[1038,4370,1248],{"class":1174},[1038,4372,3374],{"class":1188},[1038,4374,1722],{"class":1174},[1038,4376,4377],{"class":1077}," \u002F\u002F 需要 Redis >= 6\n",[1038,4379,4380,4383,4385,4387],{"class":1040,"line":1933},[1038,4381,4382],{"class":1244},"        password",[1038,4384,1248],{"class":1174},[1038,4386,3374],{"class":1188},[1038,4388,1259],{"class":1174},[1038,4390,4391,4394,4396,4399,4401],{"class":1040,"line":1953},[1038,4392,4393],{"class":1244},"        db",[1038,4395,1248],{"class":1174},[1038,4397,4398],{"class":1627}," 0",[1038,4400,1722],{"class":1174},[1038,4402,4403],{"class":1077}," \u002F\u002F 默认为 0\n",[1038,4405,4406,4409,4411,4414],{"class":1040,"line":1959},[1038,4407,4408],{"class":1244},"        tls",[1038,4410,1248],{"class":1174},[1038,4412,4413],{"class":1174}," {},",[1038,4415,4416],{"class":1077}," \u002F\u002F tls\u002Fssl\n",[1038,4418,4419],{"class":1040,"line":1971},[1038,4420,4421],{"class":1174},"      },\n",[1038,4423,4424],{"class":1040,"line":1977},[1038,4425,3314],{"class":1174},[1038,4427,4429],{"class":1040,"line":4428},15,[1038,4430,3381],{"class":1174},[1038,4432,4434,4436],{"class":1040,"line":4433},16,[1038,4435,1269],{"class":1174},[1038,4437,1272],{"class":1178},[1024,4439,4440],{},"然后在你的 API 处理器中：",[1028,4442,4445],{"className":1159,"code":4443,"filename":4444,"language":1162,"meta":354,"style":354},"export default defineEventHandler(async (event) => {\n  \u002F\u002F 列出所有键\n  const keys = await useStorage('redis').getKeys()\n\n  \u002F\u002F 设置一个键\n  await useStorage('redis').setItem('foo', 'bar')\n\n  \u002F\u002F 移除一个键\n  await useStorage('redis').removeItem('foo')\n\n  return {}\n})\n","server\u002Fapi\u002Fstorage\u002Ftest.ts",[1035,4446,4447,4469,4474,4505,4509,4514,4554,4558,4563,4594,4598,4605],{"__ignoreMap":354},[1038,4448,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467],{"class":1040,"line":1041},[1038,4450,1207],{"class":1170},[1038,4452,1210],{"class":1170},[1038,4454,1179],{"class":1213},[1038,4456,1216],{"class":1178},[1038,4458,1868],{"class":1228},[1038,4460,1871],{"class":1174},[1038,4462,1222],{"class":1221},[1038,4464,1225],{"class":1174},[1038,4466,1229],{"class":1228},[1038,4468,1232],{"class":1174},[1038,4470,4471],{"class":1040,"line":1055},[1038,4472,4473],{"class":1077},"  \u002F\u002F 列出所有键\n",[1038,4475,4476,4478,4481,4483,4485,4488,4490,4492,4494,4496,4498,4500,4503],{"class":1040,"line":1066},[1038,4477,2168],{"class":1228},[1038,4479,4480],{"class":1322}," keys",[1038,4482,1328],{"class":1048},[1038,4484,1331],{"class":1170},[1038,4486,4487],{"class":1213}," useStorage",[1038,4489,1216],{"class":1244},[1038,4491,1256],{"class":1188},[1038,4493,4320],{"class":1192},[1038,4495,1256],{"class":1188},[1038,4497,1225],{"class":1244},[1038,4499,1543],{"class":1174},[1038,4501,4502],{"class":1213},"getKeys",[1038,4504,3243],{"class":1244},[1038,4506,4507],{"class":1040,"line":1081},[1038,4508,1202],{"emptyLinePlaceholder":1201},[1038,4510,4511],{"class":1040,"line":1091},[1038,4512,4513],{"class":1077},"  \u002F\u002F 设置一个键\n",[1038,4515,4516,4518,4520,4522,4524,4526,4528,4530,4532,4535,4537,4539,4541,4543,4545,4547,4550,4552],{"class":1040,"line":1104},[1038,4517,3608],{"class":1170},[1038,4519,4487],{"class":1213},[1038,4521,1216],{"class":1244},[1038,4523,1256],{"class":1188},[1038,4525,4320],{"class":1192},[1038,4527,1256],{"class":1188},[1038,4529,1225],{"class":1244},[1038,4531,1543],{"class":1174},[1038,4533,4534],{"class":1213},"setItem",[1038,4536,1216],{"class":1244},[1038,4538,1256],{"class":1188},[1038,4540,2912],{"class":1192},[1038,4542,1256],{"class":1188},[1038,4544,1722],{"class":1174},[1038,4546,1189],{"class":1188},[1038,4548,4549],{"class":1192},"bar",[1038,4551,1256],{"class":1188},[1038,4553,1272],{"class":1244},[1038,4555,4556],{"class":1040,"line":1114},[1038,4557,1202],{"emptyLinePlaceholder":1201},[1038,4559,4560],{"class":1040,"line":1915},[1038,4561,4562],{"class":1077},"  \u002F\u002F 移除一个键\n",[1038,4564,4565,4567,4569,4571,4573,4575,4577,4579,4581,4584,4586,4588,4590,4592],{"class":1040,"line":1921},[1038,4566,3608],{"class":1170},[1038,4568,4487],{"class":1213},[1038,4570,1216],{"class":1244},[1038,4572,1256],{"class":1188},[1038,4574,4320],{"class":1192},[1038,4576,1256],{"class":1188},[1038,4578,1225],{"class":1244},[1038,4580,1543],{"class":1174},[1038,4582,4583],{"class":1213},"removeItem",[1038,4585,1216],{"class":1244},[1038,4587,1256],{"class":1188},[1038,4589,2912],{"class":1192},[1038,4591,1256],{"class":1188},[1038,4593,1272],{"class":1244},[1038,4595,4596],{"class":1040,"line":1933},[1038,4597,1202],{"emptyLinePlaceholder":1201},[1038,4599,4600,4602],{"class":1040,"line":1953},[1038,4601,1237],{"class":1170},[1038,4603,4604],{"class":1174}," {}\n",[1038,4606,4607,4609],{"class":1040,"line":1959},[1038,4608,1269],{"class":1174},[1038,4610,1272],{"class":1178},[1153,4612,4613],{"to":4244,"target":1737},[1024,4614,4615],{},"阅读更多关于 Nitro 存储层的内容。",[1024,4617,4618],{},"或者，你也可以使用服务端插件和运行时配置来创建一个存储挂载点：",[2368,4620,4621,4828],{},[1028,4622,4625],{"className":1159,"code":4623,"filename":4624,"language":1162,"meta":354,"style":354},"import { definePlugin } from 'nitro'\nimport redisDriver from 'unstorage\u002Fdrivers\u002Fredis'\n\nexport default definePlugin(() => {\n  const storage = useStorage()\n\n  \u002F\u002F 从运行时配置或其他来源动态传入凭据\n  const driver = redisDriver({\n    base: 'redis',\n    host: useRuntimeConfig().redis.host,\n    port: useRuntimeConfig().redis.port,\n    \u002F* 其他 redis 连接器选项 *\u002F\n  })\n\n  \u002F\u002F 挂载驱动\n  storage.mount('redis', driver)\n})\n","server\u002Fplugins\u002Fstorage.ts",[1035,4626,4627,4645,4661,4665,4681,4694,4698,4703,4719,4734,4755,4777,4782,4788,4792,4797,4821],{"__ignoreMap":354},[1038,4628,4629,4631,4633,4635,4637,4639,4641,4643],{"class":1040,"line":1041},[1038,4630,1171],{"class":1170},[1038,4632,1175],{"class":1174},[1038,4634,1666],{"class":1178},[1038,4636,1182],{"class":1174},[1038,4638,1185],{"class":1170},[1038,4640,1189],{"class":1188},[1038,4642,1675],{"class":1192},[1038,4644,1196],{"class":1188},[1038,4646,4647,4649,4652,4654,4656,4659],{"class":1040,"line":1055},[1038,4648,1171],{"class":1170},[1038,4650,4651],{"class":1178}," redisDriver ",[1038,4653,3928],{"class":1170},[1038,4655,1189],{"class":1188},[1038,4657,4658],{"class":1192},"unstorage\u002Fdrivers\u002Fredis",[1038,4660,1196],{"class":1188},[1038,4662,4663],{"class":1040,"line":1066},[1038,4664,1202],{"emptyLinePlaceholder":1201},[1038,4666,4667,4669,4671,4673,4675,4677,4679],{"class":1040,"line":1081},[1038,4668,1207],{"class":1170},[1038,4670,1210],{"class":1170},[1038,4672,1666],{"class":1213},[1038,4674,1216],{"class":1178},[1038,4676,1450],{"class":1174},[1038,4678,1229],{"class":1228},[1038,4680,1232],{"class":1174},[1038,4682,4683,4685,4688,4690,4692],{"class":1040,"line":1091},[1038,4684,2168],{"class":1228},[1038,4686,4687],{"class":1322}," storage",[1038,4689,1328],{"class":1048},[1038,4691,4487],{"class":1213},[1038,4693,3243],{"class":1244},[1038,4695,4696],{"class":1040,"line":1104},[1038,4697,1202],{"emptyLinePlaceholder":1201},[1038,4699,4700],{"class":1040,"line":1114},[1038,4701,4702],{"class":1077},"  \u002F\u002F 从运行时配置或其他来源动态传入凭据\n",[1038,4704,4705,4707,4710,4712,4715,4717],{"class":1040,"line":1915},[1038,4706,2168],{"class":1228},[1038,4708,4709],{"class":1322}," driver",[1038,4711,1328],{"class":1048},[1038,4713,4714],{"class":1213}," redisDriver",[1038,4716,1216],{"class":1244},[1038,4718,1950],{"class":1174},[1038,4720,4721,4724,4726,4728,4730,4732],{"class":1040,"line":1921},[1038,4722,4723],{"class":1244},"    base",[1038,4725,1248],{"class":1174},[1038,4727,1189],{"class":1188},[1038,4729,4320],{"class":1192},[1038,4731,1256],{"class":1188},[1038,4733,1259],{"class":1174},[1038,4735,4736,4739,4741,4743,4745,4747,4749,4751,4753],{"class":1040,"line":1933},[1038,4737,4738],{"class":1244},"    host",[1038,4740,1248],{"class":1174},[1038,4742,3240],{"class":1213},[1038,4744,1450],{"class":1244},[1038,4746,1543],{"class":1174},[1038,4748,4320],{"class":1178},[1038,4750,1543],{"class":1174},[1038,4752,3560],{"class":1178},[1038,4754,1259],{"class":1174},[1038,4756,4757,4760,4762,4764,4766,4768,4770,4772,4775],{"class":1040,"line":1953},[1038,4758,4759],{"class":1244},"    port",[1038,4761,1248],{"class":1174},[1038,4763,3240],{"class":1213},[1038,4765,1450],{"class":1244},[1038,4767,1543],{"class":1174},[1038,4769,4320],{"class":1178},[1038,4771,1543],{"class":1174},[1038,4773,4774],{"class":1178},"port",[1038,4776,1259],{"class":1174},[1038,4778,4779],{"class":1040,"line":1959},[1038,4780,4781],{"class":1077},"    \u002F* 其他 redis 连接器选项 *\u002F\n",[1038,4783,4784,4786],{"class":1040,"line":1971},[1038,4785,1980],{"class":1174},[1038,4787,1272],{"class":1244},[1038,4789,4790],{"class":1040,"line":1977},[1038,4791,1202],{"emptyLinePlaceholder":1201},[1038,4793,4794],{"class":1040,"line":4428},[1038,4795,4796],{"class":1077},"  \u002F\u002F 挂载驱动\n",[1038,4798,4799,4802,4804,4807,4809,4811,4813,4815,4817,4819],{"class":1040,"line":4433},[1038,4800,4801],{"class":1178},"  storage",[1038,4803,1543],{"class":1174},[1038,4805,4806],{"class":1213},"mount",[1038,4808,1216],{"class":1244},[1038,4810,1256],{"class":1188},[1038,4812,4320],{"class":1192},[1038,4814,1256],{"class":1188},[1038,4816,1722],{"class":1174},[1038,4818,4709],{"class":1178},[1038,4820,1272],{"class":1244},[1038,4822,4824,4826],{"class":1040,"line":4823},17,[1038,4825,1269],{"class":1174},[1038,4827,1272],{"class":1178},[1028,4829,4831],{"className":1159,"code":4830,"filename":174,"language":1162,"meta":354,"style":354},"export default defineNuxtConfig({\n  runtimeConfig: {\n    redis: { \u002F\u002F 默认值\n      host: '',\n      port: 0,\n      \u002F* 其他 redis 连接器选项 *\u002F\n    },\n  },\n})\n",[1035,4832,4833,4845,4853,4865,4876,4887,4892,4896,4900],{"__ignoreMap":354},[1038,4834,4835,4837,4839,4841,4843],{"class":1040,"line":1041},[1038,4836,1207],{"class":1170},[1038,4838,1210],{"class":1170},[1038,4840,3351],{"class":1213},[1038,4842,1216],{"class":1178},[1038,4844,1950],{"class":1174},[1038,4846,4847,4849,4851],{"class":1040,"line":1055},[1038,4848,3360],{"class":1244},[1038,4850,1248],{"class":1174},[1038,4852,1232],{"class":1174},[1038,4854,4855,4858,4860,4862],{"class":1040,"line":1066},[1038,4856,4857],{"class":1244},"    redis",[1038,4859,1248],{"class":1174},[1038,4861,1175],{"class":1174},[1038,4863,4864],{"class":1077}," \u002F\u002F 默认值\n",[1038,4866,4867,4870,4872,4874],{"class":1040,"line":1081},[1038,4868,4869],{"class":1244},"      host",[1038,4871,1248],{"class":1174},[1038,4873,3374],{"class":1188},[1038,4875,1259],{"class":1174},[1038,4877,4878,4881,4883,4885],{"class":1040,"line":1091},[1038,4879,4880],{"class":1244},"      port",[1038,4882,1248],{"class":1174},[1038,4884,4398],{"class":1627},[1038,4886,1259],{"class":1174},[1038,4888,4889],{"class":1040,"line":1104},[1038,4890,4891],{"class":1077},"      \u002F* 其他 redis 连接器选项 *\u002F\n",[1038,4893,4894],{"class":1040,"line":1114},[1038,4895,3314],{"class":1174},[1038,4897,4898],{"class":1040,"line":1915},[1038,4899,3381],{"class":1174},[1038,4901,4902,4904],{"class":1040,"line":1921},[1038,4903,1269],{"class":1174},[1038,4905,1272],{"class":1178},[4907,4908,4909],"style",{},"html pre.shiki code .sJK67, html code.shiki .sJK67{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .sXPRQ, html code.shiki .sXPRQ{--shiki-light:#39ADB5;--shiki-default:#F97583;--shiki-dark:#89DDFF}html pre.shiki code .sZqJ9, html code.shiki .sZqJ9{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .szyBz, html code.shiki .szyBz{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sF54B, html code.shiki .sF54B{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .smVNa, html code.shiki .smVNa{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .s0jeK, html code.shiki .s0jeK{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .s-Aze, html code.shiki .s-Aze{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .srJn9, html code.shiki .srJn9{--shiki-light:#6182B8;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .ssIVr, html code.shiki .ssIVr{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#FFAB70;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sV7Px, html code.shiki .sV7Px{--shiki-light:#9C3EDA;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sOtFm, html code.shiki .sOtFm{--shiki-light:#E53935;--shiki-default:#E1E4E8;--shiki-dark:#F07178}html pre.shiki code .s6g6u, html code.shiki .s6g6u{--shiki-light:#E53935;--shiki-default:#85E89D;--shiki-dark:#F07178}html pre.shiki code .sXjFp, html code.shiki .sXjFp{--shiki-light:#9C3EDA;--shiki-default:#B392F0;--shiki-dark:#C792EA}html pre.shiki code .sJTDI, html code.shiki .sJTDI{--shiki-light:#90A4AE;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sOUxV, html code.shiki .sOUxV{--shiki-light:#F76D47;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}html pre.shiki code .s5Y2e, html code.shiki .s5Y2e{--shiki-light:#90A4AE;--shiki-default:#B392F0;--shiki-dark:#BABED8}html pre.shiki code .seQRr, html code.shiki .seQRr{--shiki-light:#E2931D;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}",{"title":354,"searchDepth":1066,"depth":1066,"links":4911},[4912,4913,4914],{"id":1398,"depth":1055,"text":1399},{"id":1489,"depth":1055,"text":1490},{"id":1640,"depth":1055,"text":1641},"md",{"head":4917},{"title":2033},"[object Object]",{"title":150,"description":151},"docs\u002F2.directory-structure\u002F1.server","XIPhhx_QSXNbNGO1KVGAnLzkQ0eAUq37p7P62V9B0Go",1785179848049]