[{"data":1,"prerenderedAt":7619},["ShallowReactive",2],{"docs-all-flat":3,"docs-\u002Fdocs\u002Fgetting-started\u002Ftesting":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":70,"body":1020,"description":71,"extension":7613,"meta":7614,"navigation":7615,"path":69,"seo":7616,"stem":7617,"__hash__":7618},"docs\u002Fdocs\u002F1.getting-started\u002F17.testing.md",{"type":1021,"value":1022,"toc":7570},"minimark",[1023,1035,1053,1058,1063,1069,1110,1229,1233,1245,1250,1715,1740,1749,1753,1762,1784,1789,1792,1942,1954,2024,2034,2038,2041,2113,2116,2120,2144,2152,2157,2160,2243,2253,2257,2260,2337,2362,2366,2371,2377,2384,2390,2404,2414,2534,2538,2543,2549,2554,2577,2580,2830,3030,3036,3051,3057,3066,3081,3090,3097,3100,3328,3516,3521,3531,3537,3545,3646,3649,3877,3897,3917,4148,4151,4369,4375,4380,4387,4617,4625,4804,4810,4815,4822,4827,4898,4905,5001,5004,5024,5044,5048,5056,5070,5075,5160,5165,5236,5241,5247,5840,5846,5850,5874,5877,5886,6024,6042,6048,6052,6091,6095,6140,6144,6322,6332,6335,6338,6347,6608,6612,6618,6621,6670,6676,6679,6751,6757,6760,6815,6819,6825,6831,6851,6905,6909,6918,7010,7017,7187,7193,7204,7352,7355,7566],[1024,1025,1026],"tip",{},[1027,1028,1029,1030,1034],"p",{},"如果你是模块作者，可以在 ",[1031,1032,1033],"a",{"href":273},"Module Author's guide"," 中找到更具体的信息。",[1027,1036,1037,1038,1042,1043,1045,1046,1052],{},"Nuxt 通过 ",[1039,1040,1041],"code",{},"@nuxt\u002Ftest-utils"," 为你的 Nuxt 应用提供了一流的端到端（end-to-end）和单元测试支持。",[1039,1044,1041],{}," 是一个测试工具和配置库，目前为 ",[1031,1047,1051],{"href":1048,"rel":1049},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fnuxt\u002Ftree\u002Fmain\u002Ftest",[1050],"nofollow","我们在 Nuxt 自身上使用的测试"," 以及整个模块生态系统中的测试提供动力。",[1054,1055],"video-accordion",{"title":1056,"video-id":1057},"观看 Alexander Lichter 关于开始使用 @nuxt\u002Ftest-utils 的视频","yGzwk9xi9gU",[1059,1060,1062],"h2",{"id":1061},"安装installation","安装（Installation）",[1027,1064,1065,1066,1068],{},"为了让你可以管理其他测试依赖，",[1039,1067,1041],{}," 附带了多个可选的 peer dependencies。例如：",[1070,1071,1072,1084,1100],"ul",{},[1073,1074,1075,1076,1079,1080,1083],"li",{},"你可以在 ",[1039,1077,1078],{},"happy-dom"," 和 ",[1039,1081,1082],{},"jsdom"," 之间选择，用作运行时 Nuxt 环境",[1073,1085,1075,1086,1089,1090,1089,1093,1079,1096,1099],{},[1039,1087,1088],{},"vitest","、",[1039,1091,1092],{},"cucumber",[1039,1094,1095],{},"jest",[1039,1097,1098],{},"playwright"," 之间选择，用作端到端测试运行器",[1073,1101,1102,1103,1106,1107],{},"仅当你希望使用内置的浏览器测试工具（并且没有使用 ",[1039,1104,1105],{},"@playwright\u002Ftest"," 作为你的测试运行器）时，才需要 ",[1039,1108,1109],{},"playwright-core",[1111,1112,1114,1154,1180,1205],"code-group",{"sync":1113},"pm",[1115,1116,1121],"pre",{"className":1117,"code":1118,"filename":1119,"language":1120,"meta":354,"style":354},"language-bash shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","npm i --save-dev @nuxt\u002Ftest-utils vitest @vue\u002Ftest-utils happy-dom playwright-core\n","npm","bash",[1039,1122,1123],{"__ignoreMap":354},[1124,1125,1128,1131,1135,1139,1142,1145,1148,1151],"span",{"class":1126,"line":1127},"line",1,[1124,1129,1119],{"class":1130},"sJK67",[1124,1132,1134],{"class":1133},"s-Aze"," i",[1124,1136,1138],{"class":1137},"supr-"," --save-dev",[1124,1140,1141],{"class":1133}," @nuxt\u002Ftest-utils",[1124,1143,1144],{"class":1133}," vitest",[1124,1146,1147],{"class":1133}," @vue\u002Ftest-utils",[1124,1149,1150],{"class":1133}," happy-dom",[1124,1152,1153],{"class":1133}," playwright-core\n",[1115,1155,1158],{"className":1117,"code":1156,"filename":1157,"language":1120,"meta":354,"style":354},"yarn add --dev @nuxt\u002Ftest-utils vitest @vue\u002Ftest-utils happy-dom playwright-core\n","yarn",[1039,1159,1160],{"__ignoreMap":354},[1124,1161,1162,1164,1167,1170,1172,1174,1176,1178],{"class":1126,"line":1127},[1124,1163,1157],{"class":1130},[1124,1165,1166],{"class":1133}," add",[1124,1168,1169],{"class":1137}," --dev",[1124,1171,1141],{"class":1133},[1124,1173,1144],{"class":1133},[1124,1175,1147],{"class":1133},[1124,1177,1150],{"class":1133},[1124,1179,1153],{"class":1133},[1115,1181,1184],{"className":1117,"code":1182,"filename":1183,"language":1120,"meta":354,"style":354},"pnpm add -D @nuxt\u002Ftest-utils vitest @vue\u002Ftest-utils happy-dom playwright-core\n","pnpm",[1039,1185,1186],{"__ignoreMap":354},[1124,1187,1188,1190,1192,1195,1197,1199,1201,1203],{"class":1126,"line":1127},[1124,1189,1183],{"class":1130},[1124,1191,1166],{"class":1133},[1124,1193,1194],{"class":1137}," -D",[1124,1196,1141],{"class":1133},[1124,1198,1144],{"class":1133},[1124,1200,1147],{"class":1133},[1124,1202,1150],{"class":1133},[1124,1204,1153],{"class":1133},[1115,1206,1209],{"className":1117,"code":1207,"filename":1208,"language":1120,"meta":354,"style":354},"bun add --dev @nuxt\u002Ftest-utils vitest @vue\u002Ftest-utils happy-dom playwright-core\n","bun",[1039,1210,1211],{"__ignoreMap":354},[1124,1212,1213,1215,1217,1219,1221,1223,1225,1227],{"class":1126,"line":1127},[1124,1214,1208],{"class":1130},[1124,1216,1166],{"class":1133},[1124,1218,1169],{"class":1137},[1124,1220,1141],{"class":1133},[1124,1222,1144],{"class":1133},[1124,1224,1147],{"class":1133},[1124,1226,1150],{"class":1133},[1124,1228,1153],{"class":1133},[1059,1230,1232],{"id":1231},"单元测试unit-testing","单元测试（Unit Testing）",[1027,1234,1235,1236,1241,1242,1244],{},"我们目前提供了一个用于需要 ",[1031,1237,1240],{"href":1238,"rel":1239},"https:\u002F\u002Fnuxt.com",[1050],"Nuxt"," 运行时环境的代码单元测试的环境。它目前_仅支持 ",[1039,1243,1088],{},"_（尽管欢迎贡献以添加其他运行时）。",[1246,1247,1249],"h3",{"id":1248},"设置setup","设置（Setup）",[1251,1252,1253,1338,1703],"ol",{},[1073,1254,1255,1256,1259,1260,1263,1264],{},"将 ",[1039,1257,1258],{},"@nuxt\u002Ftest-utils\u002Fmodule"," 添加到你的 ",[1039,1261,1262],{},"nuxt.config"," 文件（可选）。它会将 Vitest 集成添加到你的 Nuxt DevTools 中，支持在开发中运行你的单元测试。",[1115,1265,1270],{"className":1266,"code":1267,"language":1268,"meta":1269,"style":354},"language-ts shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","export default defineNuxtConfig({\n  modules: [\n    '@nuxt\u002Ftest-utils\u002Fmodule',\n  ],\n})\n","ts","twoslash",[1039,1271,1272,1293,1306,1321,1329],{"__ignoreMap":354},[1124,1273,1274,1278,1281,1285,1289],{"class":1126,"line":1127},[1124,1275,1277],{"class":1276},"szyBz","export",[1124,1279,1280],{"class":1276}," default",[1124,1282,1284],{"class":1283},"srJn9"," defineNuxtConfig",[1124,1286,1288],{"class":1287},"smVNa","(",[1124,1290,1292],{"class":1291},"sF54B","{\n",[1124,1294,1296,1300,1303],{"class":1126,"line":1295},2,[1124,1297,1299],{"class":1298},"sOtFm","  modules",[1124,1301,1302],{"class":1291},":",[1124,1304,1305],{"class":1287}," [\n",[1124,1307,1309,1313,1315,1318],{"class":1126,"line":1308},3,[1124,1310,1312],{"class":1311},"s0jeK","    '",[1124,1314,1258],{"class":1133},[1124,1316,1317],{"class":1311},"'",[1124,1319,1320],{"class":1291},",\n",[1124,1322,1324,1327],{"class":1126,"line":1323},4,[1124,1325,1326],{"class":1287},"  ]",[1124,1328,1320],{"class":1291},[1124,1330,1332,1335],{"class":1126,"line":1331},5,[1124,1333,1334],{"class":1291},"}",[1124,1336,1337],{"class":1287},")\n",[1073,1339,1340,1341,1344,1345],{},"创建包含以下内容的 ",[1039,1342,1343],{},"vitest.config.ts","：",[1115,1346,1348],{"className":1266,"code":1347,"language":1268,"meta":1269,"style":354},"import { defineConfig } from 'vitest\u002Fconfig'\nimport { defineVitestProject } from '@nuxt\u002Ftest-utils\u002Fconfig'\n\nexport default defineConfig({\n  test: {\n    projects: [\n      {\n        test: {\n          name: 'unit',\n          include: ['test\u002Funit\u002F*.{test,spec}.ts'],\n          environment: 'node',\n        },\n      },\n      {\n        test: {\n          name: 'e2e',\n          include: ['test\u002Fe2e\u002F*.{test,spec}.ts'],\n          environment: 'node',\n        },\n      },\n      await defineVitestProject({\n        test: {\n          name: 'nuxt',\n          include: ['test\u002Fnuxt\u002F*.{test,spec}.ts'],\n          environment: 'nuxt',\n        },\n      }),\n    ],\n  },\n})\n",[1039,1349,1350,1376,1396,1402,1414,1424,1434,1440,1450,1467,1490,1507,1513,1519,1524,1533,1549,1569,1584,1589,1594,1606,1615,1631,1651,1666,1671,1682,1690,1696],{"__ignoreMap":354},[1124,1351,1352,1355,1358,1361,1364,1367,1370,1373],{"class":1126,"line":1127},[1124,1353,1354],{"class":1276},"import",[1124,1356,1357],{"class":1291}," {",[1124,1359,1360],{"class":1287}," defineConfig",[1124,1362,1363],{"class":1291}," }",[1124,1365,1366],{"class":1276}," from",[1124,1368,1369],{"class":1311}," '",[1124,1371,1372],{"class":1133},"vitest\u002Fconfig",[1124,1374,1375],{"class":1311},"'\n",[1124,1377,1378,1380,1382,1385,1387,1389,1391,1394],{"class":1126,"line":1295},[1124,1379,1354],{"class":1276},[1124,1381,1357],{"class":1291},[1124,1383,1384],{"class":1287}," defineVitestProject",[1124,1386,1363],{"class":1291},[1124,1388,1366],{"class":1276},[1124,1390,1369],{"class":1311},[1124,1392,1393],{"class":1133},"@nuxt\u002Ftest-utils\u002Fconfig",[1124,1395,1375],{"class":1311},[1124,1397,1398],{"class":1126,"line":1308},[1124,1399,1401],{"emptyLinePlaceholder":1400},true,"\n",[1124,1403,1404,1406,1408,1410,1412],{"class":1126,"line":1323},[1124,1405,1277],{"class":1276},[1124,1407,1280],{"class":1276},[1124,1409,1360],{"class":1283},[1124,1411,1288],{"class":1287},[1124,1413,1292],{"class":1291},[1124,1415,1416,1419,1421],{"class":1126,"line":1331},[1124,1417,1418],{"class":1298},"  test",[1124,1420,1302],{"class":1291},[1124,1422,1423],{"class":1291}," {\n",[1124,1425,1427,1430,1432],{"class":1126,"line":1426},6,[1124,1428,1429],{"class":1298},"    projects",[1124,1431,1302],{"class":1291},[1124,1433,1305],{"class":1287},[1124,1435,1437],{"class":1126,"line":1436},7,[1124,1438,1439],{"class":1291},"      {\n",[1124,1441,1443,1446,1448],{"class":1126,"line":1442},8,[1124,1444,1445],{"class":1298},"        test",[1124,1447,1302],{"class":1291},[1124,1449,1423],{"class":1291},[1124,1451,1453,1456,1458,1460,1463,1465],{"class":1126,"line":1452},9,[1124,1454,1455],{"class":1298},"          name",[1124,1457,1302],{"class":1291},[1124,1459,1369],{"class":1311},[1124,1461,1462],{"class":1133},"unit",[1124,1464,1317],{"class":1311},[1124,1466,1320],{"class":1291},[1124,1468,1470,1473,1475,1478,1480,1483,1485,1488],{"class":1126,"line":1469},10,[1124,1471,1472],{"class":1298},"          include",[1124,1474,1302],{"class":1291},[1124,1476,1477],{"class":1287}," [",[1124,1479,1317],{"class":1311},[1124,1481,1482],{"class":1133},"test\u002Funit\u002F*.{test,spec}.ts",[1124,1484,1317],{"class":1311},[1124,1486,1487],{"class":1287},"]",[1124,1489,1320],{"class":1291},[1124,1491,1493,1496,1498,1500,1503,1505],{"class":1126,"line":1492},11,[1124,1494,1495],{"class":1298},"          environment",[1124,1497,1302],{"class":1291},[1124,1499,1369],{"class":1311},[1124,1501,1502],{"class":1133},"node",[1124,1504,1317],{"class":1311},[1124,1506,1320],{"class":1291},[1124,1508,1510],{"class":1126,"line":1509},12,[1124,1511,1512],{"class":1291},"        },\n",[1124,1514,1516],{"class":1126,"line":1515},13,[1124,1517,1518],{"class":1291},"      },\n",[1124,1520,1522],{"class":1126,"line":1521},14,[1124,1523,1439],{"class":1291},[1124,1525,1527,1529,1531],{"class":1126,"line":1526},15,[1124,1528,1445],{"class":1298},[1124,1530,1302],{"class":1291},[1124,1532,1423],{"class":1291},[1124,1534,1536,1538,1540,1542,1545,1547],{"class":1126,"line":1535},16,[1124,1537,1455],{"class":1298},[1124,1539,1302],{"class":1291},[1124,1541,1369],{"class":1311},[1124,1543,1544],{"class":1133},"e2e",[1124,1546,1317],{"class":1311},[1124,1548,1320],{"class":1291},[1124,1550,1552,1554,1556,1558,1560,1563,1565,1567],{"class":1126,"line":1551},17,[1124,1553,1472],{"class":1298},[1124,1555,1302],{"class":1291},[1124,1557,1477],{"class":1287},[1124,1559,1317],{"class":1311},[1124,1561,1562],{"class":1133},"test\u002Fe2e\u002F*.{test,spec}.ts",[1124,1564,1317],{"class":1311},[1124,1566,1487],{"class":1287},[1124,1568,1320],{"class":1291},[1124,1570,1572,1574,1576,1578,1580,1582],{"class":1126,"line":1571},18,[1124,1573,1495],{"class":1298},[1124,1575,1302],{"class":1291},[1124,1577,1369],{"class":1311},[1124,1579,1502],{"class":1133},[1124,1581,1317],{"class":1311},[1124,1583,1320],{"class":1291},[1124,1585,1587],{"class":1126,"line":1586},19,[1124,1588,1512],{"class":1291},[1124,1590,1592],{"class":1126,"line":1591},20,[1124,1593,1518],{"class":1291},[1124,1595,1597,1600,1602,1604],{"class":1126,"line":1596},21,[1124,1598,1599],{"class":1276},"      await",[1124,1601,1384],{"class":1283},[1124,1603,1288],{"class":1287},[1124,1605,1292],{"class":1291},[1124,1607,1609,1611,1613],{"class":1126,"line":1608},22,[1124,1610,1445],{"class":1298},[1124,1612,1302],{"class":1291},[1124,1614,1423],{"class":1291},[1124,1616,1618,1620,1622,1624,1627,1629],{"class":1126,"line":1617},23,[1124,1619,1455],{"class":1298},[1124,1621,1302],{"class":1291},[1124,1623,1369],{"class":1311},[1124,1625,1626],{"class":1133},"nuxt",[1124,1628,1317],{"class":1311},[1124,1630,1320],{"class":1291},[1124,1632,1634,1636,1638,1640,1642,1645,1647,1649],{"class":1126,"line":1633},24,[1124,1635,1472],{"class":1298},[1124,1637,1302],{"class":1291},[1124,1639,1477],{"class":1287},[1124,1641,1317],{"class":1311},[1124,1643,1644],{"class":1133},"test\u002Fnuxt\u002F*.{test,spec}.ts",[1124,1646,1317],{"class":1311},[1124,1648,1487],{"class":1287},[1124,1650,1320],{"class":1291},[1124,1652,1654,1656,1658,1660,1662,1664],{"class":1126,"line":1653},25,[1124,1655,1495],{"class":1298},[1124,1657,1302],{"class":1291},[1124,1659,1369],{"class":1311},[1124,1661,1626],{"class":1133},[1124,1663,1317],{"class":1311},[1124,1665,1320],{"class":1291},[1124,1667,1669],{"class":1126,"line":1668},26,[1124,1670,1512],{"class":1291},[1124,1672,1674,1677,1680],{"class":1126,"line":1673},27,[1124,1675,1676],{"class":1291},"      }",[1124,1678,1679],{"class":1287},")",[1124,1681,1320],{"class":1291},[1124,1683,1685,1688],{"class":1126,"line":1684},28,[1124,1686,1687],{"class":1287},"    ]",[1124,1689,1320],{"class":1291},[1124,1691,1693],{"class":1126,"line":1692},29,[1124,1694,1695],{"class":1291},"  },\n",[1124,1697,1699,1701],{"class":1126,"line":1698},30,[1124,1700,1334],{"class":1291},[1124,1702,1337],{"class":1287},[1073,1704,1705,1706,1709,1710,1714],{},"如果你的 Nuxt 环境测试位于 ",[1039,1707,1708],{},"test\u002Fnuxt\u002F"," 之外，请参阅 ",[1031,1711,1713],{"href":1712},"#typescript-support-in-tests","测试中的 TypeScript 支持"," 将它们添加到 TypeScript 上下文中。",[1024,1716,1717,1730],{},[1027,1718,1719,1720,1722,1723,1725,1726,1729],{},"在 vitest 配置中导入 ",[1039,1721,1041],{}," 时，必须在你的 ",[1039,1724,178],{}," 中指定 ",[1039,1727,1728],{},"\"type\": \"module\"","，或者适当地重命名你的 vitest 配置文件。",[1731,1732,1733],"blockquote",{},[1027,1734,1735,1736,1739],{},"即 ",[1039,1737,1738],{},"vitest.config.m{ts,js}","。",[1024,1741,1742],{},[1027,1743,1744,1745,1748],{},"可以通过使用 ",[1039,1746,1747],{},".env.test"," 文件来设置用于测试的 environment 变量。",[1246,1750,1752],{"id":1751},"使用-nuxt-运行时环境using-a-nuxt-runtime-environment","使用 Nuxt 运行时环境（Using a Nuxt Runtime Environment）",[1027,1754,1755,1756,1761],{},"使用 ",[1031,1757,1760],{"href":1758,"rel":1759},"https:\u002F\u002Fvitest.dev\u002Fguide\u002Fprojects.html#test-projects",[1050],"Vitest projects","，你可以精细控制哪些测试运行在哪个环境中：",[1070,1763,1764,1775],{},[1073,1765,1766,1770,1771,1774],{},[1767,1768,1769],"strong",{},"单元测试","：将常规单元测试放在 ",[1039,1772,1773],{},"test\u002Funit\u002F"," - 这些在 Node 环境中运行以获得速度",[1073,1776,1777,1780,1781,1783],{},[1767,1778,1779],{},"Nuxt 测试","：将依赖 Nuxt 运行时环境的测试放在 ",[1039,1782,1708],{}," - 这些会运行在 Nuxt 运行时环境中",[1785,1786,1788],"h4",{"id":1787},"替代方案简单设置alternative-simple-setup","替代方案：简单设置（Alternative: Simple Setup）",[1027,1790,1791],{},"如果你更喜欢更简单的设置，并希望所有测试都在 Nuxt 环境中运行，可以使用基础配置：",[1115,1793,1795],{"className":1266,"code":1794,"language":1268,"meta":1269,"style":354},"import { defineVitestConfig } from '@nuxt\u002Ftest-utils\u002Fconfig'\nimport { fileURLToPath } from 'node:url'\n\nexport default defineVitestConfig({\n  test: {\n    environment: 'nuxt',\n    \u002F\u002F 你可以选择设置 Nuxt 特定的环境选项\n    \u002F\u002F environmentOptions: {\n    \u002F\u002F   nuxt: {\n    \u002F\u002F     rootDir: fileURLToPath(new URL('.\u002Fplayground', import.meta.url)),\n    \u002F\u002F     domEnvironment: 'happy-dom', \u002F\u002F 'happy-dom'（默认）或 'jsdom'\n    \u002F\u002F     overrides: {\n    \u002F\u002F       \u002F\u002F 你想传入的其他 Nuxt 配置\n    \u002F\u002F     }\n    \u002F\u002F   }\n    \u002F\u002F }\n  },\n})\n",[1039,1796,1797,1816,1836,1840,1852,1860,1875,1881,1886,1891,1896,1904,1909,1917,1922,1927,1932,1936],{"__ignoreMap":354},[1124,1798,1799,1801,1803,1806,1808,1810,1812,1814],{"class":1126,"line":1127},[1124,1800,1354],{"class":1276},[1124,1802,1357],{"class":1291},[1124,1804,1805],{"class":1287}," defineVitestConfig",[1124,1807,1363],{"class":1291},[1124,1809,1366],{"class":1276},[1124,1811,1369],{"class":1311},[1124,1813,1393],{"class":1133},[1124,1815,1375],{"class":1311},[1124,1817,1818,1820,1822,1825,1827,1829,1831,1834],{"class":1126,"line":1295},[1124,1819,1354],{"class":1276},[1124,1821,1357],{"class":1291},[1124,1823,1824],{"class":1287}," fileURLToPath",[1124,1826,1363],{"class":1291},[1124,1828,1366],{"class":1276},[1124,1830,1369],{"class":1311},[1124,1832,1833],{"class":1133},"node:url",[1124,1835,1375],{"class":1311},[1124,1837,1838],{"class":1126,"line":1308},[1124,1839,1401],{"emptyLinePlaceholder":1400},[1124,1841,1842,1844,1846,1848,1850],{"class":1126,"line":1323},[1124,1843,1277],{"class":1276},[1124,1845,1280],{"class":1276},[1124,1847,1805],{"class":1283},[1124,1849,1288],{"class":1287},[1124,1851,1292],{"class":1291},[1124,1853,1854,1856,1858],{"class":1126,"line":1331},[1124,1855,1418],{"class":1298},[1124,1857,1302],{"class":1291},[1124,1859,1423],{"class":1291},[1124,1861,1862,1865,1867,1869,1871,1873],{"class":1126,"line":1426},[1124,1863,1864],{"class":1298},"    environment",[1124,1866,1302],{"class":1291},[1124,1868,1369],{"class":1311},[1124,1870,1626],{"class":1133},[1124,1872,1317],{"class":1311},[1124,1874,1320],{"class":1291},[1124,1876,1877],{"class":1126,"line":1436},[1124,1878,1880],{"class":1879},"sZqJ9","    \u002F\u002F 你可以选择设置 Nuxt 特定的环境选项\n",[1124,1882,1883],{"class":1126,"line":1442},[1124,1884,1885],{"class":1879},"    \u002F\u002F environmentOptions: {\n",[1124,1887,1888],{"class":1126,"line":1452},[1124,1889,1890],{"class":1879},"    \u002F\u002F   nuxt: {\n",[1124,1892,1893],{"class":1126,"line":1469},[1124,1894,1895],{"class":1879},"    \u002F\u002F     rootDir: fileURLToPath(new URL('.\u002Fplayground', import.meta.url)),\n",[1124,1897,1898,1901],{"class":1126,"line":1492},[1124,1899,1900],{"class":1879},"    \u002F\u002F     domEnvironment: 'happy-dom',",[1124,1902,1903],{"class":1879}," \u002F\u002F 'happy-dom'（默认）或 'jsdom'\n",[1124,1905,1906],{"class":1126,"line":1509},[1124,1907,1908],{"class":1879},"    \u002F\u002F     overrides: {\n",[1124,1910,1911,1914],{"class":1126,"line":1515},[1124,1912,1913],{"class":1879},"    \u002F\u002F",[1124,1915,1916],{"class":1879},"       \u002F\u002F 你想传入的其他 Nuxt 配置\n",[1124,1918,1919],{"class":1126,"line":1521},[1124,1920,1921],{"class":1879},"    \u002F\u002F     }\n",[1124,1923,1924],{"class":1126,"line":1526},[1124,1925,1926],{"class":1879},"    \u002F\u002F   }\n",[1124,1928,1929],{"class":1126,"line":1535},[1124,1930,1931],{"class":1879},"    \u002F\u002F }\n",[1124,1933,1934],{"class":1126,"line":1551},[1124,1935,1695],{"class":1291},[1124,1937,1938,1940],{"class":1126,"line":1571},[1124,1939,1334],{"class":1291},[1124,1941,1337],{"class":1287},[1027,1943,1944,1945,1948,1949,1739],{},"如果你使用 ",[1039,1946,1947],{},"environment: 'nuxt'"," 作为默认值的简单设置，可以根据需要为每个测试文件_退出_ ",[1031,1950,1953],{"href":1951,"rel":1952},"https:\u002F\u002Fvitest.dev\u002Fguide\u002Fenvironment.html#test-environment",[1050],"Nuxt 环境",[1115,1955,1957],{"className":1266,"code":1956,"language":1268,"meta":1269,"style":354},"\u002F\u002F @vitest-environment node\nimport { test } from 'vitest'\n\ntest('my test', () => {\n  \u002F\u002F ... 在没有 Nuxt 环境的情况下测试！\n})\n",[1039,1958,1959,1964,1983,1987,2013,2018],{"__ignoreMap":354},[1124,1960,1961],{"class":1126,"line":1127},[1124,1962,1963],{"class":1879},"\u002F\u002F @vitest-environment node\n",[1124,1965,1966,1968,1970,1973,1975,1977,1979,1981],{"class":1126,"line":1295},[1124,1967,1354],{"class":1276},[1124,1969,1357],{"class":1291},[1124,1971,1972],{"class":1287}," test",[1124,1974,1363],{"class":1291},[1124,1976,1366],{"class":1276},[1124,1978,1369],{"class":1311},[1124,1980,1088],{"class":1133},[1124,1982,1375],{"class":1311},[1124,1984,1985],{"class":1126,"line":1308},[1124,1986,1401],{"emptyLinePlaceholder":1400},[1124,1988,1989,1992,1994,1996,1999,2001,2004,2007,2011],{"class":1126,"line":1323},[1124,1990,1991],{"class":1283},"test",[1124,1993,1288],{"class":1287},[1124,1995,1317],{"class":1311},[1124,1997,1998],{"class":1133},"my test",[1124,2000,1317],{"class":1311},[1124,2002,2003],{"class":1291},",",[1124,2005,2006],{"class":1291}," ()",[1124,2008,2010],{"class":2009},"sV7Px"," =>",[1124,2012,1423],{"class":1291},[1124,2014,2015],{"class":1126,"line":1331},[1124,2016,2017],{"class":1879},"  \u002F\u002F ... 在没有 Nuxt 环境的情况下测试！\n",[1124,2019,2020,2022],{"class":1126,"line":1426},[1124,2021,1334],{"class":1291},[1124,2023,1337],{"class":1287},[2025,2026,2027],"warning",{},[1027,2028,2029,2030,2033],{},"不推荐这种方法，因为它创建了一个混合环境，其中 Nuxt Vite 插件会运行，但 Nuxt 入口和 ",[1039,2031,2032],{},"nuxtApp"," 未被初始化。这可能导致难以调试的错误。",[1246,2035,2037],{"id":2036},"组织你的测试organizing-your-tests","组织你的测试（Organizing Your Tests）",[1027,2039,2040],{},"通过基于项目的设置，你可以这样组织你的测试：",[1115,2042,2045],{"className":1117,"code":2043,"filename":2044,"language":1120,"meta":354,"style":354},"test\u002F\n├── e2e\u002F\n│   └── ssr.test.ts\n├── nuxt\u002F\n│   ├── components.test.ts\n│   └── composables.test.ts\n├── unit\u002F\n│   └── utils.test.ts\n","Directory structure",[1039,2046,2047,2052,2060,2071,2078,2088,2097,2104],{"__ignoreMap":354},[1124,2048,2049],{"class":1126,"line":1127},[1124,2050,2051],{"class":1130},"test\u002F\n",[1124,2053,2054,2057],{"class":1126,"line":1295},[1124,2055,2056],{"class":1130},"├──",[1124,2058,2059],{"class":1133}," e2e\u002F\n",[1124,2061,2062,2065,2068],{"class":1126,"line":1308},[1124,2063,2064],{"class":1130},"│",[1124,2066,2067],{"class":1133},"   └──",[1124,2069,2070],{"class":1133}," ssr.test.ts\n",[1124,2072,2073,2075],{"class":1126,"line":1323},[1124,2074,2056],{"class":1130},[1124,2076,2077],{"class":1133}," nuxt\u002F\n",[1124,2079,2080,2082,2085],{"class":1126,"line":1331},[1124,2081,2064],{"class":1130},[1124,2083,2084],{"class":1133},"   ├──",[1124,2086,2087],{"class":1133}," components.test.ts\n",[1124,2089,2090,2092,2094],{"class":1126,"line":1426},[1124,2091,2064],{"class":1130},[1124,2093,2067],{"class":1133},[1124,2095,2096],{"class":1133}," composables.test.ts\n",[1124,2098,2099,2101],{"class":1126,"line":1436},[1124,2100,2056],{"class":1130},[1124,2102,2103],{"class":1133}," unit\u002F\n",[1124,2105,2106,2108,2110],{"class":1126,"line":1442},[1124,2107,2064],{"class":1130},[1124,2109,2067],{"class":1133},[1124,2111,2112],{"class":1133}," utils.test.ts\n",[1027,2114,2115],{},"你当然可以选择任何测试结构，但将 Nuxt 运行时环境与 Nuxt 端到端测试分开对于测试稳定性很重要。",[1785,2117,2119],{"id":2118},"测试中的-typescript-支持typescript-support-in-tests","测试中的 TypeScript 支持（TypeScript Support in Tests）",[1027,2121,2122,2123,1079,2125,2128,2129,2133,2134,1089,2137,1089,2140,2143],{},"默认情况下，",[1039,2124,1708],{},[1039,2126,2127],{},"tests\u002Fnuxt\u002F"," 目录中的测试文件被包含在 ",[1031,2130,2132],{"href":2131},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Ftypescript#how-nuxt-uses-project-references","Nuxt 应用 TypeScript 上下文"," 中。这意味着它们会识别 Nuxt 别名（如 ",[1039,2135,2136],{},"~\u002F",[1039,2138,2139],{},"@\u002F",[1039,2141,2142],{},"#imports","），并且 TypeScript 会感知在你的 Nuxt 应用中工作的自动导入。",[1024,2145,2146],{},[1027,2147,2148,2149,2151],{},"这与推荐的结构相匹配，即只有需要 Nuxt 运行时环境的测试才放在这些目录中。其他目录（如 ",[1039,2150,1773],{},"）中的单元测试可以根据需要手动添加。",[2153,2154,2156],"h5",{"id":2155},"添加其他测试目录adding-other-test-directories","添加其他测试目录（Adding other test directories）",[1027,2158,2159],{},"如果你在其他目录中有将在 Nuxt Vitest 环境中运行的测试，可以通过将它们在你的配置中添加进来，使其包含在 Nuxt 应用 TypeScript 上下文中：",[1115,2161,2163],{"className":1266,"code":2162,"filename":174,"language":1268,"meta":354,"style":354},"export default defineNuxtConfig({\n  typescript: {\n    tsConfig: {\n      include: [\n        \u002F\u002F 此路径相对于生成的 .nuxt\u002Ftsconfig.json\n        '..\u002Ftest\u002Fother-nuxt-context\u002F**\u002F*',\n      ],\n    },\n  },\n})\n",[1039,2164,2165,2177,2186,2195,2204,2209,2221,2228,2233,2237],{"__ignoreMap":354},[1124,2166,2167,2169,2171,2173,2175],{"class":1126,"line":1127},[1124,2168,1277],{"class":1276},[1124,2170,1280],{"class":1276},[1124,2172,1284],{"class":1283},[1124,2174,1288],{"class":1287},[1124,2176,1292],{"class":1291},[1124,2178,2179,2182,2184],{"class":1126,"line":1295},[1124,2180,2181],{"class":1298},"  typescript",[1124,2183,1302],{"class":1291},[1124,2185,1423],{"class":1291},[1124,2187,2188,2191,2193],{"class":1126,"line":1308},[1124,2189,2190],{"class":1298},"    tsConfig",[1124,2192,1302],{"class":1291},[1124,2194,1423],{"class":1291},[1124,2196,2197,2200,2202],{"class":1126,"line":1323},[1124,2198,2199],{"class":1298},"      include",[1124,2201,1302],{"class":1291},[1124,2203,1305],{"class":1287},[1124,2205,2206],{"class":1126,"line":1331},[1124,2207,2208],{"class":1879},"        \u002F\u002F 此路径相对于生成的 .nuxt\u002Ftsconfig.json\n",[1124,2210,2211,2214,2217,2219],{"class":1126,"line":1426},[1124,2212,2213],{"class":1311},"        '",[1124,2215,2216],{"class":1133},"..\u002Ftest\u002Fother-nuxt-context\u002F**\u002F*",[1124,2218,1317],{"class":1311},[1124,2220,1320],{"class":1291},[1124,2222,2223,2226],{"class":1126,"line":1436},[1124,2224,2225],{"class":1287},"      ]",[1124,2227,1320],{"class":1291},[1124,2229,2230],{"class":1126,"line":1442},[1124,2231,2232],{"class":1291},"    },\n",[1124,2234,2235],{"class":1126,"line":1452},[1124,2236,1695],{"class":1291},[1124,2238,2239,2241],{"class":1126,"line":1469},[1124,2240,1334],{"class":1291},[1124,2242,1337],{"class":1287},[2244,2245,2246],"important",{},[1027,2247,2248,2249,2252],{},"单元测试不应依赖像自动导入或 composable 这样的 Nuxt 运行时特性。仅当你的测试从你的源文件导入（例如 ",[1039,2250,2251],{},"~\u002Futils\u002Fhelpers","）时，才添加 TypeScript 路径别名支持，而不是为了 Nuxt 特定特性。",[1785,2254,2256],{"id":2255},"运行测试running-tests","运行测试（Running Tests）",[1027,2258,2259],{},"通过项目设置，你可以运行不同的测试套件：",[1115,2261,2263],{"className":1117,"code":2262,"language":1120,"meta":354,"style":354},"# 运行所有测试\nnpx vitest\n\n# 仅运行单元测试\nnpx vitest --project unit\n\n# 仅运行 Nuxt 测试\nnpx vitest --project nuxt\n\n# 在 watch 模式下运行测试\nnpx vitest --watch\n",[1039,2264,2265,2270,2278,2282,2287,2299,2303,2308,2319,2323,2328],{"__ignoreMap":354},[1124,2266,2267],{"class":1126,"line":1127},[1124,2268,2269],{"class":1879},"# 运行所有测试\n",[1124,2271,2272,2275],{"class":1126,"line":1295},[1124,2273,2274],{"class":1130},"npx",[1124,2276,2277],{"class":1133}," vitest\n",[1124,2279,2280],{"class":1126,"line":1308},[1124,2281,1401],{"emptyLinePlaceholder":1400},[1124,2283,2284],{"class":1126,"line":1323},[1124,2285,2286],{"class":1879},"# 仅运行单元测试\n",[1124,2288,2289,2291,2293,2296],{"class":1126,"line":1331},[1124,2290,2274],{"class":1130},[1124,2292,1144],{"class":1133},[1124,2294,2295],{"class":1137}," --project",[1124,2297,2298],{"class":1133}," unit\n",[1124,2300,2301],{"class":1126,"line":1426},[1124,2302,1401],{"emptyLinePlaceholder":1400},[1124,2304,2305],{"class":1126,"line":1436},[1124,2306,2307],{"class":1879},"# 仅运行 Nuxt 测试\n",[1124,2309,2310,2312,2314,2316],{"class":1126,"line":1442},[1124,2311,2274],{"class":1130},[1124,2313,1144],{"class":1133},[1124,2315,2295],{"class":1137},[1124,2317,2318],{"class":1133}," nuxt\n",[1124,2320,2321],{"class":1126,"line":1452},[1124,2322,1401],{"emptyLinePlaceholder":1400},[1124,2324,2325],{"class":1126,"line":1469},[1124,2326,2327],{"class":1879},"# 在 watch 模式下运行测试\n",[1124,2329,2330,2332,2334],{"class":1126,"line":1492},[1124,2331,2274],{"class":1130},[1124,2333,1144],{"class":1133},[1124,2335,2336],{"class":1137}," --watch\n",[2025,2338,2339,2359],{},[1027,2340,2341,2342,2348,2349,2355,2356,2358],{},"当你在 Nuxt 环境中运行测试时，它们会运行在 ",[1031,2343,2346],{"href":2344,"rel":2345},"https:\u002F\u002Fgithub.com\u002Fcapricorn86\u002Fhappy-dom",[1050],[1039,2347,1078],{}," 或 ",[1031,2350,2353],{"href":2351,"rel":2352},"https:\u002F\u002Fgithub.com\u002Fjsdom\u002Fjsdom",[1050],[1039,2354,1082],{}," 环境中。在你的测试运行之前，会初始化一个全局 Nuxt 应用（包括，例如，运行你在 ",[1039,2357,118],{}," 中定义的任何插件或代码）。",[1027,2360,2361],{},"这意味着你应特别注意不要在测试中修改全局状态（或者，如果需要，在之后重置它）。",[1246,2363,2365],{"id":2364},"内置-mockbuilt-in-mocks","🎭 内置 Mock（Built-In Mocks）",[1027,2367,2368,2370],{},[1039,2369,1041],{}," 为 DOM 环境提供了一些内置 mock。",[1785,2372,2374],{"id":2373},"intersectionobserver",[1039,2375,2376],{},"intersectionObserver",[1027,2378,2379,2380,2383],{},"默认 ",[1039,2381,2382],{},"true","，为 IntersectionObserver API 创建一个没有任何功能的虚拟类",[1785,2385,2387],{"id":2386},"indexeddb",[1039,2388,2389],{},"indexedDB",[1027,2391,2379,2392,2395,2396,2403],{},[1039,2393,2394],{},"false","，使用 ",[1031,2397,2400],{"href":2398,"rel":2399},"https:\u002F\u002Fgithub.com\u002Fdumbmatter\u002FfakeIndexedDB",[1050],[1039,2401,2402],{},"fake-indexeddb"," 创建 IndexedDB API 的功能性 mock",[1027,2405,2406,2407,2409,2410,2413],{},"这些可以在你的 ",[1039,2408,1343],{}," 文件的 ",[1039,2411,2412],{},"environmentOptions"," 部分进行配置：",[1115,2415,2417],{"className":1266,"code":2416,"language":1268,"meta":1269,"style":354},"import { defineVitestConfig } from '@nuxt\u002Ftest-utils\u002Fconfig'\n\nexport default defineVitestConfig({\n  test: {\n    environmentOptions: {\n      nuxt: {\n        mock: {\n          intersectionObserver: true,\n          indexedDb: true,\n        },\n      },\n    },\n  },\n})\n",[1039,2418,2419,2437,2441,2453,2461,2470,2479,2488,2501,2512,2516,2520,2524,2528],{"__ignoreMap":354},[1124,2420,2421,2423,2425,2427,2429,2431,2433,2435],{"class":1126,"line":1127},[1124,2422,1354],{"class":1276},[1124,2424,1357],{"class":1291},[1124,2426,1805],{"class":1287},[1124,2428,1363],{"class":1291},[1124,2430,1366],{"class":1276},[1124,2432,1369],{"class":1311},[1124,2434,1393],{"class":1133},[1124,2436,1375],{"class":1311},[1124,2438,2439],{"class":1126,"line":1295},[1124,2440,1401],{"emptyLinePlaceholder":1400},[1124,2442,2443,2445,2447,2449,2451],{"class":1126,"line":1308},[1124,2444,1277],{"class":1276},[1124,2446,1280],{"class":1276},[1124,2448,1805],{"class":1283},[1124,2450,1288],{"class":1287},[1124,2452,1292],{"class":1291},[1124,2454,2455,2457,2459],{"class":1126,"line":1323},[1124,2456,1418],{"class":1298},[1124,2458,1302],{"class":1291},[1124,2460,1423],{"class":1291},[1124,2462,2463,2466,2468],{"class":1126,"line":1331},[1124,2464,2465],{"class":1298},"    environmentOptions",[1124,2467,1302],{"class":1291},[1124,2469,1423],{"class":1291},[1124,2471,2472,2475,2477],{"class":1126,"line":1426},[1124,2473,2474],{"class":1298},"      nuxt",[1124,2476,1302],{"class":1291},[1124,2478,1423],{"class":1291},[1124,2480,2481,2484,2486],{"class":1126,"line":1436},[1124,2482,2483],{"class":1298},"        mock",[1124,2485,1302],{"class":1291},[1124,2487,1423],{"class":1291},[1124,2489,2490,2493,2495,2499],{"class":1126,"line":1442},[1124,2491,2492],{"class":1298},"          intersectionObserver",[1124,2494,1302],{"class":1291},[1124,2496,2498],{"class":2497},"si1Qm"," true",[1124,2500,1320],{"class":1291},[1124,2502,2503,2506,2508,2510],{"class":1126,"line":1452},[1124,2504,2505],{"class":1298},"          indexedDb",[1124,2507,1302],{"class":1291},[1124,2509,2498],{"class":2497},[1124,2511,1320],{"class":1291},[1124,2513,2514],{"class":1126,"line":1469},[1124,2515,1512],{"class":1291},[1124,2517,2518],{"class":1126,"line":1492},[1124,2519,1518],{"class":1291},[1124,2521,2522],{"class":1126,"line":1509},[1124,2523,2232],{"class":1291},[1124,2525,2526],{"class":1126,"line":1515},[1124,2527,1695],{"class":1291},[1124,2529,2530,2532],{"class":1126,"line":1521},[1124,2531,1334],{"class":1291},[1124,2533,1337],{"class":1287},[1246,2535,2537],{"id":2536},"️-辅助函数helpers","🛠️ 辅助函数（Helpers）",[1027,2539,2540,2542],{},[1039,2541,1041],{}," 提供了许多辅助函数，让测试 Nuxt 应用更容易。",[1785,2544,2546],{"id":2545},"mountsuspended",[1039,2547,2548],{},"mountSuspended",[1027,2550,2551,2553],{},[1039,2552,2548],{}," 允许你在 Nuxt 环境中挂载任何 Vue 组件，允许 async setup 并访问来自你 Nuxt 插件的注入。",[2555,2556,2557],"note",{},[1027,2558,2559,2560,2562,2563,2566,2567,2570,2571,2576],{},"在底层，",[1039,2561,2548],{}," 包裹了 ",[1039,2564,2565],{},"@vue\u002Ftest-utils"," 的 ",[1039,2568,2569],{},"mount","，所以你可以查看 ",[1031,2572,2575],{"href":2573,"rel":2574},"https:\u002F\u002Ftest-utils.vuejs.org\u002Fguide\u002F",[1050],"Vue Test Utils 文档"," 以了解更多关于你可以传入的选项，以及如何使用这个工具。",[1027,2578,2579],{},"例如：",[1115,2581,2583],{"className":1266,"code":2582,"language":1268,"meta":1269,"style":354},"\u002F\u002F @noErrors\nimport { expect, it } from 'vitest'\nimport type { Component } from 'vue'\n\ndeclare module '#components' {\n  export const SomeComponent: Component\n}\n\u002F\u002F ---cut---\n\u002F\u002F tests\u002Fcomponents\u002FSomeComponents.nuxt.spec.ts\nimport { mountSuspended } from '@nuxt\u002Ftest-utils\u002Fruntime'\nimport { SomeComponent } from '#components'\n\nit('can mount some component', async () => {\n  const component = await mountSuspended(SomeComponent)\n  expect(component.text()).toMatchInlineSnapshot(\n    '\"This is an auto-imported component\"',\n  )\n})\n",[1039,2584,2585,2590,2614,2637,2641,2658,2676,2681,2686,2691,2711,2729,2733,2758,2781,2808,2819,2824],{"__ignoreMap":354},[1124,2586,2587],{"class":1126,"line":1127},[1124,2588,2589],{"class":1879},"\u002F\u002F @noErrors\n",[1124,2591,2592,2594,2596,2599,2601,2604,2606,2608,2610,2612],{"class":1126,"line":1295},[1124,2593,1354],{"class":1276},[1124,2595,1357],{"class":1291},[1124,2597,2598],{"class":1287}," expect",[1124,2600,2003],{"class":1291},[1124,2602,2603],{"class":1287}," it",[1124,2605,1363],{"class":1291},[1124,2607,1366],{"class":1276},[1124,2609,1369],{"class":1311},[1124,2611,1088],{"class":1133},[1124,2613,1375],{"class":1311},[1124,2615,2616,2618,2621,2623,2626,2628,2630,2632,2635],{"class":1126,"line":1308},[1124,2617,1354],{"class":1276},[1124,2619,2620],{"class":1276}," type",[1124,2622,1357],{"class":1291},[1124,2624,2625],{"class":1287}," Component",[1124,2627,1363],{"class":1291},[1124,2629,1366],{"class":1276},[1124,2631,1369],{"class":1311},[1124,2633,2634],{"class":1133},"vue",[1124,2636,1375],{"class":1311},[1124,2638,2639],{"class":1126,"line":1323},[1124,2640,1401],{"emptyLinePlaceholder":1400},[1124,2642,2643,2646,2649,2651,2654,2656],{"class":1126,"line":1331},[1124,2644,2645],{"class":2009},"declare",[1124,2647,2648],{"class":2009}," module",[1124,2650,1369],{"class":1311},[1124,2652,2653],{"class":1133},"#components",[1124,2655,1317],{"class":1311},[1124,2657,1423],{"class":1291},[1124,2659,2660,2663,2666,2670,2673],{"class":1126,"line":1426},[1124,2661,2662],{"class":1276},"  export",[1124,2664,2665],{"class":2009}," const",[1124,2667,2669],{"class":2668},"sJTDI"," SomeComponent",[1124,2671,1302],{"class":2672},"sXPRQ",[1124,2674,2675],{"class":1130}," Component\n",[1124,2677,2678],{"class":1126,"line":1436},[1124,2679,2680],{"class":1291},"}\n",[1124,2682,2683],{"class":1126,"line":1442},[1124,2684,2685],{"class":1879},"\u002F\u002F ---cut---\n",[1124,2687,2688],{"class":1126,"line":1452},[1124,2689,2690],{"class":1879},"\u002F\u002F tests\u002Fcomponents\u002FSomeComponents.nuxt.spec.ts\n",[1124,2692,2693,2695,2697,2700,2702,2704,2706,2709],{"class":1126,"line":1469},[1124,2694,1354],{"class":1276},[1124,2696,1357],{"class":1291},[1124,2698,2699],{"class":1287}," mountSuspended",[1124,2701,1363],{"class":1291},[1124,2703,1366],{"class":1276},[1124,2705,1369],{"class":1311},[1124,2707,2708],{"class":1133},"@nuxt\u002Ftest-utils\u002Fruntime",[1124,2710,1375],{"class":1311},[1124,2712,2713,2715,2717,2719,2721,2723,2725,2727],{"class":1126,"line":1492},[1124,2714,1354],{"class":1276},[1124,2716,1357],{"class":1291},[1124,2718,2669],{"class":1287},[1124,2720,1363],{"class":1291},[1124,2722,1366],{"class":1276},[1124,2724,1369],{"class":1311},[1124,2726,2653],{"class":1133},[1124,2728,1375],{"class":1311},[1124,2730,2731],{"class":1126,"line":1509},[1124,2732,1401],{"emptyLinePlaceholder":1400},[1124,2734,2735,2738,2740,2742,2745,2747,2749,2752,2754,2756],{"class":1126,"line":1515},[1124,2736,2737],{"class":1283},"it",[1124,2739,1288],{"class":1287},[1124,2741,1317],{"class":1311},[1124,2743,2744],{"class":1133},"can mount some component",[1124,2746,1317],{"class":1311},[1124,2748,2003],{"class":1291},[1124,2750,2751],{"class":2009}," async",[1124,2753,2006],{"class":1291},[1124,2755,2010],{"class":2009},[1124,2757,1423],{"class":1291},[1124,2759,2760,2763,2766,2769,2772,2774,2776,2779],{"class":1126,"line":1521},[1124,2761,2762],{"class":2009},"  const",[1124,2764,2765],{"class":2668}," component",[1124,2767,2768],{"class":2672}," =",[1124,2770,2771],{"class":1276}," await",[1124,2773,2699],{"class":1283},[1124,2775,1288],{"class":1298},[1124,2777,2778],{"class":1287},"SomeComponent",[1124,2780,1337],{"class":1298},[1124,2782,2783,2786,2788,2791,2794,2797,2800,2802,2805],{"class":1126,"line":1526},[1124,2784,2785],{"class":1283},"  expect",[1124,2787,1288],{"class":1298},[1124,2789,2790],{"class":1287},"component",[1124,2792,2793],{"class":1291},".",[1124,2795,2796],{"class":1283},"text",[1124,2798,2799],{"class":1298},"())",[1124,2801,2793],{"class":1291},[1124,2803,2804],{"class":1283},"toMatchInlineSnapshot",[1124,2806,2807],{"class":1298},"(\n",[1124,2809,2810,2812,2815,2817],{"class":1126,"line":1535},[1124,2811,1312],{"class":1311},[1124,2813,2814],{"class":1133},"\"This is an auto-imported component\"",[1124,2816,1317],{"class":1311},[1124,2818,1320],{"class":1291},[1124,2820,2821],{"class":1126,"line":1551},[1124,2822,2823],{"class":1298},"  )\n",[1124,2825,2826,2828],{"class":1126,"line":1571},[1124,2827,1334],{"class":1291},[1124,2829,1337],{"class":1287},[1115,2831,2833],{"className":1266,"code":2832,"language":1268,"meta":1269,"style":354},"\u002F\u002F @noErrors\nimport { expect, it } from 'vitest'\n\u002F\u002F ---cut---\n\u002F\u002F tests\u002Fcomponents\u002FSomeComponents.nuxt.spec.ts\nimport { mountSuspended } from '@nuxt\u002Ftest-utils\u002Fruntime'\nimport App from '~\u002Fapp.vue'\n\n\u002F\u002F tests\u002FApp.nuxt.spec.ts\nit('can also mount an app', async () => {\n  const component = await mountSuspended(App, { route: '\u002Ftest' })\n  expect(component.html()).toMatchInlineSnapshot(`\n      \"\u003Cdiv>This is an auto-imported component\u003C\u002Fdiv>\n      \u003Cdiv> I am a global component \u003C\u002Fdiv>\n      \u003Cdiv>\u002F\u003C\u002Fdiv>\n      \u003Ca href=\"\u002Ftest\"> Test link \u003C\u002Fa>\"\n    `)\n})\n",[1039,2834,2835,2839,2861,2865,2869,2887,2904,2908,2913,2936,2973,2997,3002,3007,3012,3017,3024],{"__ignoreMap":354},[1124,2836,2837],{"class":1126,"line":1127},[1124,2838,2589],{"class":1879},[1124,2840,2841,2843,2845,2847,2849,2851,2853,2855,2857,2859],{"class":1126,"line":1295},[1124,2842,1354],{"class":1276},[1124,2844,1357],{"class":1291},[1124,2846,2598],{"class":1287},[1124,2848,2003],{"class":1291},[1124,2850,2603],{"class":1287},[1124,2852,1363],{"class":1291},[1124,2854,1366],{"class":1276},[1124,2856,1369],{"class":1311},[1124,2858,1088],{"class":1133},[1124,2860,1375],{"class":1311},[1124,2862,2863],{"class":1126,"line":1308},[1124,2864,2685],{"class":1879},[1124,2866,2867],{"class":1126,"line":1323},[1124,2868,2690],{"class":1879},[1124,2870,2871,2873,2875,2877,2879,2881,2883,2885],{"class":1126,"line":1331},[1124,2872,1354],{"class":1276},[1124,2874,1357],{"class":1291},[1124,2876,2699],{"class":1287},[1124,2878,1363],{"class":1291},[1124,2880,1366],{"class":1276},[1124,2882,1369],{"class":1311},[1124,2884,2708],{"class":1133},[1124,2886,1375],{"class":1311},[1124,2888,2889,2891,2894,2897,2899,2902],{"class":1126,"line":1426},[1124,2890,1354],{"class":1276},[1124,2892,2893],{"class":1287}," App ",[1124,2895,2896],{"class":1276},"from",[1124,2898,1369],{"class":1311},[1124,2900,2901],{"class":1133},"~\u002Fapp.vue",[1124,2903,1375],{"class":1311},[1124,2905,2906],{"class":1126,"line":1436},[1124,2907,1401],{"emptyLinePlaceholder":1400},[1124,2909,2910],{"class":1126,"line":1442},[1124,2911,2912],{"class":1879},"\u002F\u002F tests\u002FApp.nuxt.spec.ts\n",[1124,2914,2915,2917,2919,2921,2924,2926,2928,2930,2932,2934],{"class":1126,"line":1452},[1124,2916,2737],{"class":1283},[1124,2918,1288],{"class":1287},[1124,2920,1317],{"class":1311},[1124,2922,2923],{"class":1133},"can also mount an app",[1124,2925,1317],{"class":1311},[1124,2927,2003],{"class":1291},[1124,2929,2751],{"class":2009},[1124,2931,2006],{"class":1291},[1124,2933,2010],{"class":2009},[1124,2935,1423],{"class":1291},[1124,2937,2938,2940,2942,2944,2946,2948,2950,2953,2955,2957,2960,2962,2964,2967,2969,2971],{"class":1126,"line":1469},[1124,2939,2762],{"class":2009},[1124,2941,2765],{"class":2668},[1124,2943,2768],{"class":2672},[1124,2945,2771],{"class":1276},[1124,2947,2699],{"class":1283},[1124,2949,1288],{"class":1298},[1124,2951,2952],{"class":1287},"App",[1124,2954,2003],{"class":1291},[1124,2956,1357],{"class":1291},[1124,2958,2959],{"class":1298}," route",[1124,2961,1302],{"class":1291},[1124,2963,1369],{"class":1311},[1124,2965,2966],{"class":1133},"\u002Ftest",[1124,2968,1317],{"class":1311},[1124,2970,1363],{"class":1291},[1124,2972,1337],{"class":1298},[1124,2974,2975,2977,2979,2981,2983,2986,2988,2990,2992,2994],{"class":1126,"line":1492},[1124,2976,2785],{"class":1283},[1124,2978,1288],{"class":1298},[1124,2980,2790],{"class":1287},[1124,2982,2793],{"class":1291},[1124,2984,2985],{"class":1283},"html",[1124,2987,2799],{"class":1298},[1124,2989,2793],{"class":1291},[1124,2991,2804],{"class":1283},[1124,2993,1288],{"class":1298},[1124,2995,2996],{"class":1311},"`\n",[1124,2998,2999],{"class":1126,"line":1509},[1124,3000,3001],{"class":1133},"      \"\u003Cdiv>This is an auto-imported component\u003C\u002Fdiv>\n",[1124,3003,3004],{"class":1126,"line":1515},[1124,3005,3006],{"class":1133},"      \u003Cdiv> I am a global component \u003C\u002Fdiv>\n",[1124,3008,3009],{"class":1126,"line":1521},[1124,3010,3011],{"class":1133},"      \u003Cdiv>\u002F\u003C\u002Fdiv>\n",[1124,3013,3014],{"class":1126,"line":1526},[1124,3015,3016],{"class":1133},"      \u003Ca href=\"\u002Ftest\"> Test link \u003C\u002Fa>\"\n",[1124,3018,3019,3022],{"class":1126,"line":1535},[1124,3020,3021],{"class":1311},"    `",[1124,3023,1337],{"class":1298},[1124,3025,3026,3028],{"class":1126,"line":1551},[1124,3027,1334],{"class":1291},[1124,3029,1337],{"class":1287},[1027,3031,3032,3033,3035],{},"options 对象接受 ",[1039,3034,2565],{}," 的 mount 选项以及以下属性：",[1070,3037,3038],{},[1073,3039,3040,3043,3044,3046,3047,3050],{},[1039,3041,3042],{},"route","：初始路由，或 ",[1039,3045,2394],{}," 以跳过初始路由变更（默认 ",[1039,3048,3049],{},"\u002F","）。",[1785,3052,3054],{"id":3053},"rendersuspended",[1039,3055,3056],{},"renderSuspended",[1027,3058,3059,3061,3062,3065],{},[1039,3060,3056],{}," 允许你使用 ",[1039,3063,3064],{},"@testing-library\u002Fvue"," 在 Nuxt 环境中渲染任何 Vue 组件，允许 async setup 并访问来自你 Nuxt 插件的注入。",[1027,3067,3068,3069,1079,3072,3075,3076,3080],{},"这应该与 Testing Library 的工具一起使用，例如 ",[1039,3070,3071],{},"screen",[1039,3073,3074],{},"fireEvent","。在你的项目中安装 ",[1031,3077,3064],{"href":3078,"rel":3079},"https:\u002F\u002Ftesting-library.com\u002Fdocs\u002Fvue-testing-library\u002Fintro\u002F",[1050]," 以使用它们。",[1027,3082,3083,3084,3089],{},"此外，Testing Library 还依赖测试全局变量来进行清理。你应该在你的 ",[1031,3085,3088],{"href":3086,"rel":3087},"https:\u002F\u002Fvitest.dev\u002Fconfig\u002Fglobals",[1050],"Vitest config"," 中开启它们。",[1027,3091,3092,3093,3096],{},"传入的组件会渲染在 ",[1039,3094,3095],{},"\u003Cdiv id=\"test-wrapper\">\u003C\u002Fdiv>"," 内部。",[1027,3098,3099],{},"示例：",[1115,3101,3103],{"className":1266,"code":3102,"language":1268,"meta":1269,"style":354},"\u002F\u002F @noErrors\nimport { expect, it } from 'vitest'\nimport type { Component } from 'vue'\n\ndeclare module '#components' {\n  export const SomeComponent: Component\n}\n\u002F\u002F ---cut---\n\u002F\u002F tests\u002Fcomponents\u002FSomeComponents.nuxt.spec.ts\nimport { renderSuspended } from '@nuxt\u002Ftest-utils\u002Fruntime'\nimport { SomeComponent } from '#components'\nimport { screen } from '@testing-library\u002Fvue'\n\nit('can render some component', async () => {\n  await renderSuspended(SomeComponent)\n  expect(screen.getByText('This is an auto-imported component')).toBeDefined()\n})\n",[1039,3104,3105,3109,3131,3151,3155,3169,3181,3185,3189,3193,3212,3230,3249,3253,3276,3289,3322],{"__ignoreMap":354},[1124,3106,3107],{"class":1126,"line":1127},[1124,3108,2589],{"class":1879},[1124,3110,3111,3113,3115,3117,3119,3121,3123,3125,3127,3129],{"class":1126,"line":1295},[1124,3112,1354],{"class":1276},[1124,3114,1357],{"class":1291},[1124,3116,2598],{"class":1287},[1124,3118,2003],{"class":1291},[1124,3120,2603],{"class":1287},[1124,3122,1363],{"class":1291},[1124,3124,1366],{"class":1276},[1124,3126,1369],{"class":1311},[1124,3128,1088],{"class":1133},[1124,3130,1375],{"class":1311},[1124,3132,3133,3135,3137,3139,3141,3143,3145,3147,3149],{"class":1126,"line":1308},[1124,3134,1354],{"class":1276},[1124,3136,2620],{"class":1276},[1124,3138,1357],{"class":1291},[1124,3140,2625],{"class":1287},[1124,3142,1363],{"class":1291},[1124,3144,1366],{"class":1276},[1124,3146,1369],{"class":1311},[1124,3148,2634],{"class":1133},[1124,3150,1375],{"class":1311},[1124,3152,3153],{"class":1126,"line":1323},[1124,3154,1401],{"emptyLinePlaceholder":1400},[1124,3156,3157,3159,3161,3163,3165,3167],{"class":1126,"line":1331},[1124,3158,2645],{"class":2009},[1124,3160,2648],{"class":2009},[1124,3162,1369],{"class":1311},[1124,3164,2653],{"class":1133},[1124,3166,1317],{"class":1311},[1124,3168,1423],{"class":1291},[1124,3170,3171,3173,3175,3177,3179],{"class":1126,"line":1426},[1124,3172,2662],{"class":1276},[1124,3174,2665],{"class":2009},[1124,3176,2669],{"class":2668},[1124,3178,1302],{"class":2672},[1124,3180,2675],{"class":1130},[1124,3182,3183],{"class":1126,"line":1436},[1124,3184,2680],{"class":1291},[1124,3186,3187],{"class":1126,"line":1442},[1124,3188,2685],{"class":1879},[1124,3190,3191],{"class":1126,"line":1452},[1124,3192,2690],{"class":1879},[1124,3194,3195,3197,3199,3202,3204,3206,3208,3210],{"class":1126,"line":1469},[1124,3196,1354],{"class":1276},[1124,3198,1357],{"class":1291},[1124,3200,3201],{"class":1287}," renderSuspended",[1124,3203,1363],{"class":1291},[1124,3205,1366],{"class":1276},[1124,3207,1369],{"class":1311},[1124,3209,2708],{"class":1133},[1124,3211,1375],{"class":1311},[1124,3213,3214,3216,3218,3220,3222,3224,3226,3228],{"class":1126,"line":1492},[1124,3215,1354],{"class":1276},[1124,3217,1357],{"class":1291},[1124,3219,2669],{"class":1287},[1124,3221,1363],{"class":1291},[1124,3223,1366],{"class":1276},[1124,3225,1369],{"class":1311},[1124,3227,2653],{"class":1133},[1124,3229,1375],{"class":1311},[1124,3231,3232,3234,3236,3239,3241,3243,3245,3247],{"class":1126,"line":1509},[1124,3233,1354],{"class":1276},[1124,3235,1357],{"class":1291},[1124,3237,3238],{"class":1287}," screen",[1124,3240,1363],{"class":1291},[1124,3242,1366],{"class":1276},[1124,3244,1369],{"class":1311},[1124,3246,3064],{"class":1133},[1124,3248,1375],{"class":1311},[1124,3250,3251],{"class":1126,"line":1515},[1124,3252,1401],{"emptyLinePlaceholder":1400},[1124,3254,3255,3257,3259,3261,3264,3266,3268,3270,3272,3274],{"class":1126,"line":1521},[1124,3256,2737],{"class":1283},[1124,3258,1288],{"class":1287},[1124,3260,1317],{"class":1311},[1124,3262,3263],{"class":1133},"can render some component",[1124,3265,1317],{"class":1311},[1124,3267,2003],{"class":1291},[1124,3269,2751],{"class":2009},[1124,3271,2006],{"class":1291},[1124,3273,2010],{"class":2009},[1124,3275,1423],{"class":1291},[1124,3277,3278,3281,3283,3285,3287],{"class":1126,"line":1526},[1124,3279,3280],{"class":1276},"  await",[1124,3282,3201],{"class":1283},[1124,3284,1288],{"class":1298},[1124,3286,2778],{"class":1287},[1124,3288,1337],{"class":1298},[1124,3290,3291,3293,3295,3297,3299,3302,3304,3306,3309,3311,3314,3316,3319],{"class":1126,"line":1535},[1124,3292,2785],{"class":1283},[1124,3294,1288],{"class":1298},[1124,3296,3071],{"class":1287},[1124,3298,2793],{"class":1291},[1124,3300,3301],{"class":1283},"getByText",[1124,3303,1288],{"class":1298},[1124,3305,1317],{"class":1311},[1124,3307,3308],{"class":1133},"This is an auto-imported component",[1124,3310,1317],{"class":1311},[1124,3312,3313],{"class":1298},"))",[1124,3315,2793],{"class":1291},[1124,3317,3318],{"class":1283},"toBeDefined",[1124,3320,3321],{"class":1298},"()\n",[1124,3323,3324,3326],{"class":1126,"line":1551},[1124,3325,1334],{"class":1291},[1124,3327,1337],{"class":1287},[1115,3329,3331],{"className":1266,"code":3330,"language":1268,"meta":1269,"style":354},"\u002F\u002F @noErrors\nimport { expect, it } from 'vitest'\n\u002F\u002F ---cut---\n\u002F\u002F tests\u002FApp.nuxt.spec.ts\nimport { renderSuspended } from '@nuxt\u002Ftest-utils\u002Fruntime'\nimport App from '~\u002Fapp.vue'\n\nit('can also render an app', async () => {\n  const html = await renderSuspended(App, { route: '\u002Ftest' })\n  expect(html).toMatchInlineSnapshot(`\n    \"\u003Cdiv id=\"test-wrapper\">\n      \u003Cdiv>This is an auto-imported component\u003C\u002Fdiv>\n      \u003Cdiv> I am a global component \u003C\u002Fdiv>\n      \u003Cdiv>Index page\u003C\u002Fdiv>\u003Ca href=\"\u002Ftest\"> Test link \u003C\u002Fa>\n    \u003C\u002Fdiv>\"\n  `)\n})\n",[1039,3332,3333,3337,3359,3363,3367,3385,3399,3403,3426,3461,3479,3484,3489,3493,3498,3503,3510],{"__ignoreMap":354},[1124,3334,3335],{"class":1126,"line":1127},[1124,3336,2589],{"class":1879},[1124,3338,3339,3341,3343,3345,3347,3349,3351,3353,3355,3357],{"class":1126,"line":1295},[1124,3340,1354],{"class":1276},[1124,3342,1357],{"class":1291},[1124,3344,2598],{"class":1287},[1124,3346,2003],{"class":1291},[1124,3348,2603],{"class":1287},[1124,3350,1363],{"class":1291},[1124,3352,1366],{"class":1276},[1124,3354,1369],{"class":1311},[1124,3356,1088],{"class":1133},[1124,3358,1375],{"class":1311},[1124,3360,3361],{"class":1126,"line":1308},[1124,3362,2685],{"class":1879},[1124,3364,3365],{"class":1126,"line":1323},[1124,3366,2912],{"class":1879},[1124,3368,3369,3371,3373,3375,3377,3379,3381,3383],{"class":1126,"line":1331},[1124,3370,1354],{"class":1276},[1124,3372,1357],{"class":1291},[1124,3374,3201],{"class":1287},[1124,3376,1363],{"class":1291},[1124,3378,1366],{"class":1276},[1124,3380,1369],{"class":1311},[1124,3382,2708],{"class":1133},[1124,3384,1375],{"class":1311},[1124,3386,3387,3389,3391,3393,3395,3397],{"class":1126,"line":1426},[1124,3388,1354],{"class":1276},[1124,3390,2893],{"class":1287},[1124,3392,2896],{"class":1276},[1124,3394,1369],{"class":1311},[1124,3396,2901],{"class":1133},[1124,3398,1375],{"class":1311},[1124,3400,3401],{"class":1126,"line":1436},[1124,3402,1401],{"emptyLinePlaceholder":1400},[1124,3404,3405,3407,3409,3411,3414,3416,3418,3420,3422,3424],{"class":1126,"line":1442},[1124,3406,2737],{"class":1283},[1124,3408,1288],{"class":1287},[1124,3410,1317],{"class":1311},[1124,3412,3413],{"class":1133},"can also render an app",[1124,3415,1317],{"class":1311},[1124,3417,2003],{"class":1291},[1124,3419,2751],{"class":2009},[1124,3421,2006],{"class":1291},[1124,3423,2010],{"class":2009},[1124,3425,1423],{"class":1291},[1124,3427,3428,3430,3433,3435,3437,3439,3441,3443,3445,3447,3449,3451,3453,3455,3457,3459],{"class":1126,"line":1452},[1124,3429,2762],{"class":2009},[1124,3431,3432],{"class":2668}," html",[1124,3434,2768],{"class":2672},[1124,3436,2771],{"class":1276},[1124,3438,3201],{"class":1283},[1124,3440,1288],{"class":1298},[1124,3442,2952],{"class":1287},[1124,3444,2003],{"class":1291},[1124,3446,1357],{"class":1291},[1124,3448,2959],{"class":1298},[1124,3450,1302],{"class":1291},[1124,3452,1369],{"class":1311},[1124,3454,2966],{"class":1133},[1124,3456,1317],{"class":1311},[1124,3458,1363],{"class":1291},[1124,3460,1337],{"class":1298},[1124,3462,3463,3465,3467,3469,3471,3473,3475,3477],{"class":1126,"line":1469},[1124,3464,2785],{"class":1283},[1124,3466,1288],{"class":1298},[1124,3468,2985],{"class":1287},[1124,3470,1679],{"class":1298},[1124,3472,2793],{"class":1291},[1124,3474,2804],{"class":1283},[1124,3476,1288],{"class":1298},[1124,3478,2996],{"class":1311},[1124,3480,3481],{"class":1126,"line":1492},[1124,3482,3483],{"class":1133},"    \"\u003Cdiv id=\"test-wrapper\">\n",[1124,3485,3486],{"class":1126,"line":1509},[1124,3487,3488],{"class":1133},"      \u003Cdiv>This is an auto-imported component\u003C\u002Fdiv>\n",[1124,3490,3491],{"class":1126,"line":1515},[1124,3492,3006],{"class":1133},[1124,3494,3495],{"class":1126,"line":1521},[1124,3496,3497],{"class":1133},"      \u003Cdiv>Index page\u003C\u002Fdiv>\u003Ca href=\"\u002Ftest\"> Test link \u003C\u002Fa>\n",[1124,3499,3500],{"class":1126,"line":1526},[1124,3501,3502],{"class":1133},"    \u003C\u002Fdiv>\"\n",[1124,3504,3505,3508],{"class":1126,"line":1535},[1124,3506,3507],{"class":1311},"  `",[1124,3509,1337],{"class":1298},[1124,3511,3512,3514],{"class":1126,"line":1551},[1124,3513,1334],{"class":1291},[1124,3515,1337],{"class":1287},[1027,3517,3032,3518,3520],{},[1039,3519,3064],{}," 的 render 选项以及以下属性：",[1070,3522,3523],{},[1073,3524,3525,3043,3527,3046,3529,3050],{},[1039,3526,3042],{},[1039,3528,2394],{},[1039,3530,3049],{},[1785,3532,3534],{"id":3533},"mocknuxtimport",[1039,3535,3536],{},"mockNuxtImport",[1027,3538,3539,3541,3542,3544],{},[1039,3540,3536],{}," 允许你 mock Nuxt 的自动导入功能。例如，要 mock ",[1039,3543,549],{},"，你可以这样做：",[1115,3546,3548],{"className":1266,"code":3547,"language":1268,"meta":1269,"style":354},"import { mockNuxtImport } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nmockNuxtImport('useState', () => {\n  return () => {\n    return { value: 'mocked storage' }\n  }\n})\n\n\u002F\u002F your tests here\n",[1039,3549,3550,3569,3573,3593,3604,3626,3631,3637,3641],{"__ignoreMap":354},[1124,3551,3552,3554,3556,3559,3561,3563,3565,3567],{"class":1126,"line":1127},[1124,3553,1354],{"class":1276},[1124,3555,1357],{"class":1291},[1124,3557,3558],{"class":1287}," mockNuxtImport",[1124,3560,1363],{"class":1291},[1124,3562,1366],{"class":1276},[1124,3564,1369],{"class":1311},[1124,3566,2708],{"class":1133},[1124,3568,1375],{"class":1311},[1124,3570,3571],{"class":1126,"line":1295},[1124,3572,1401],{"emptyLinePlaceholder":1400},[1124,3574,3575,3577,3579,3581,3583,3585,3587,3589,3591],{"class":1126,"line":1308},[1124,3576,3536],{"class":1283},[1124,3578,1288],{"class":1287},[1124,3580,1317],{"class":1311},[1124,3582,549],{"class":1133},[1124,3584,1317],{"class":1311},[1124,3586,2003],{"class":1291},[1124,3588,2006],{"class":1291},[1124,3590,2010],{"class":2009},[1124,3592,1423],{"class":1291},[1124,3594,3595,3598,3600,3602],{"class":1126,"line":1323},[1124,3596,3597],{"class":1276},"  return",[1124,3599,2006],{"class":1291},[1124,3601,2010],{"class":2009},[1124,3603,1423],{"class":1291},[1124,3605,3606,3609,3611,3614,3616,3618,3621,3623],{"class":1126,"line":1331},[1124,3607,3608],{"class":1276},"    return",[1124,3610,1357],{"class":1291},[1124,3612,3613],{"class":1298}," value",[1124,3615,1302],{"class":1291},[1124,3617,1369],{"class":1311},[1124,3619,3620],{"class":1133},"mocked storage",[1124,3622,1317],{"class":1311},[1124,3624,3625],{"class":1291}," }\n",[1124,3627,3628],{"class":1126,"line":1426},[1124,3629,3630],{"class":1291},"  }\n",[1124,3632,3633,3635],{"class":1126,"line":1436},[1124,3634,1334],{"class":1291},[1124,3636,1337],{"class":1287},[1124,3638,3639],{"class":1126,"line":1442},[1124,3640,1401],{"emptyLinePlaceholder":1400},[1124,3642,3643],{"class":1126,"line":1452},[1124,3644,3645],{"class":1879},"\u002F\u002F your tests here\n",[1027,3647,3648],{},"你可以显式地为 mock 指定类型以获得类型安全，并在 mock 复杂功能时使用传入工厂函数的原始实现。",[1115,3650,3653],{"className":1266,"code":3651,"filename":3652,"language":1268,"meta":1269,"style":354},"import { mockNuxtImport } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nmockNuxtImport\u003Ctypeof useState>('useState', (original) => {\n  return (...args) => {\n    return { ...original('some-key'), value: 'mocked state' }\n  }\n})\n\n\u002F\u002F 或者指定要 mock 的目标\nmockNuxtImport(useState, (original) => {\n  return (...args) => {\n    return { ...original('some-key'), value: 'mocked state' }\n  }\n})\n\n\u002F\u002F your tests here\n","test\u002Fnuxt\u002Fimport.test.ts",[1039,3654,3655,3673,3677,3716,3734,3771,3775,3781,3785,3790,3809,3825,3859,3863,3869,3873],{"__ignoreMap":354},[1124,3656,3657,3659,3661,3663,3665,3667,3669,3671],{"class":1126,"line":1127},[1124,3658,1354],{"class":1276},[1124,3660,1357],{"class":1291},[1124,3662,3558],{"class":1287},[1124,3664,1363],{"class":1291},[1124,3666,1366],{"class":1276},[1124,3668,1369],{"class":1311},[1124,3670,2708],{"class":1133},[1124,3672,1375],{"class":1311},[1124,3674,3675],{"class":1126,"line":1295},[1124,3676,1401],{"emptyLinePlaceholder":1400},[1124,3678,3679,3681,3684,3687,3690,3693,3695,3697,3699,3701,3703,3706,3710,3712,3714],{"class":1126,"line":1308},[1124,3680,3536],{"class":1283},[1124,3682,3683],{"class":1291},"\u003C",[1124,3685,3686],{"class":2672},"typeof",[1124,3688,3689],{"class":1287}," useState",[1124,3691,3692],{"class":1291},">",[1124,3694,1288],{"class":1287},[1124,3696,1317],{"class":1311},[1124,3698,549],{"class":1133},[1124,3700,1317],{"class":1311},[1124,3702,2003],{"class":1291},[1124,3704,3705],{"class":1291}," (",[1124,3707,3709],{"class":3708},"ssIVr","original",[1124,3711,1679],{"class":1291},[1124,3713,2010],{"class":2009},[1124,3715,1423],{"class":1291},[1124,3717,3718,3720,3722,3725,3728,3730,3732],{"class":1126,"line":1323},[1124,3719,3597],{"class":1276},[1124,3721,3705],{"class":1291},[1124,3723,3724],{"class":2672},"...",[1124,3726,3727],{"class":3708},"args",[1124,3729,1679],{"class":1291},[1124,3731,2010],{"class":2009},[1124,3733,1423],{"class":1291},[1124,3735,3736,3738,3740,3743,3745,3747,3749,3752,3754,3756,3758,3760,3762,3764,3767,3769],{"class":1126,"line":1331},[1124,3737,3608],{"class":1276},[1124,3739,1357],{"class":1291},[1124,3741,3742],{"class":2672}," ...",[1124,3744,3709],{"class":1283},[1124,3746,1288],{"class":1298},[1124,3748,1317],{"class":1311},[1124,3750,3751],{"class":1133},"some-key",[1124,3753,1317],{"class":1311},[1124,3755,1679],{"class":1298},[1124,3757,2003],{"class":1291},[1124,3759,3613],{"class":1298},[1124,3761,1302],{"class":1291},[1124,3763,1369],{"class":1311},[1124,3765,3766],{"class":1133},"mocked state",[1124,3768,1317],{"class":1311},[1124,3770,3625],{"class":1291},[1124,3772,3773],{"class":1126,"line":1426},[1124,3774,3630],{"class":1291},[1124,3776,3777,3779],{"class":1126,"line":1436},[1124,3778,1334],{"class":1291},[1124,3780,1337],{"class":1287},[1124,3782,3783],{"class":1126,"line":1442},[1124,3784,1401],{"emptyLinePlaceholder":1400},[1124,3786,3787],{"class":1126,"line":1452},[1124,3788,3789],{"class":1879},"\u002F\u002F 或者指定要 mock 的目标\n",[1124,3791,3792,3794,3797,3799,3801,3803,3805,3807],{"class":1126,"line":1469},[1124,3793,3536],{"class":1283},[1124,3795,3796],{"class":1287},"(useState",[1124,3798,2003],{"class":1291},[1124,3800,3705],{"class":1291},[1124,3802,3709],{"class":3708},[1124,3804,1679],{"class":1291},[1124,3806,2010],{"class":2009},[1124,3808,1423],{"class":1291},[1124,3810,3811,3813,3815,3817,3819,3821,3823],{"class":1126,"line":1492},[1124,3812,3597],{"class":1276},[1124,3814,3705],{"class":1291},[1124,3816,3724],{"class":2672},[1124,3818,3727],{"class":3708},[1124,3820,1679],{"class":1291},[1124,3822,2010],{"class":2009},[1124,3824,1423],{"class":1291},[1124,3826,3827,3829,3831,3833,3835,3837,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857],{"class":1126,"line":1509},[1124,3828,3608],{"class":1276},[1124,3830,1357],{"class":1291},[1124,3832,3742],{"class":2672},[1124,3834,3709],{"class":1283},[1124,3836,1288],{"class":1298},[1124,3838,1317],{"class":1311},[1124,3840,3751],{"class":1133},[1124,3842,1317],{"class":1311},[1124,3844,1679],{"class":1298},[1124,3846,2003],{"class":1291},[1124,3848,3613],{"class":1298},[1124,3850,1302],{"class":1291},[1124,3852,1369],{"class":1311},[1124,3854,3766],{"class":1133},[1124,3856,1317],{"class":1311},[1124,3858,3625],{"class":1291},[1124,3860,3861],{"class":1126,"line":1515},[1124,3862,3630],{"class":1291},[1124,3864,3865,3867],{"class":1126,"line":1521},[1124,3866,1334],{"class":1291},[1124,3868,1337],{"class":1287},[1124,3870,3871],{"class":1126,"line":1526},[1124,3872,1401],{"emptyLinePlaceholder":1400},[1124,3874,3875],{"class":1126,"line":1535},[1124,3876,3645],{"class":1879},[2555,3878,3879],{},[1027,3880,3881,3883,3884,3887,3888,3890,3891,3896],{},[1039,3882,3536],{}," 在每个测试文件中对每个被 mock 的导入只能使用一次。它实际上是一个宏，会被转换为 ",[1039,3885,3886],{},"vi.mock","，而 ",[1039,3889,3886],{}," 会被提升（hoisted），如 ",[1031,3892,3895],{"href":3893,"rel":3894},"https:\u002F\u002Fvitest.dev\u002Fapi\u002Fvi#vi-mock",[1050],"Vitest 文档"," 所述。",[1027,3898,3899,3900,3907,3908,3910,3911,3916],{},"如果你需要 mock 一个 Nuxt 导入并在测试之间提供不同的实现，你可以通过使用 ",[1031,3901,3904],{"href":3902,"rel":3903},"https:\u002F\u002Fvitest.dev\u002Fapi\u002Fvi#vi-hoisted",[1050],[1039,3905,3906],{},"vi.hoisted"," 创建并暴露你的 mock，然后在 ",[1039,3909,3536],{}," 中使用那些 mock。这样你就有了对被 mock 导入的访问权，并可以在测试之间更改实现。请注意在每次测试之前或之后",[1031,3912,3915],{"href":3913,"rel":3914},"https:\u002F\u002Fvitest.dev\u002Fapi\u002Fmock#mockrestore",[1050],"恢复 mock"," 以撤销 mock 状态的更改。",[1115,3918,3920],{"className":1266,"code":3919,"language":1268,"meta":1269,"style":354},"import { vi } from 'vitest'\nimport { mockNuxtImport } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nconst { useStateMock } = vi.hoisted(() => {\n  return {\n    useStateMock: vi.fn(() => {\n      return { value: 'mocked storage' }\n    }),\n  }\n})\n\nmockNuxtImport('useState', () => {\n  return useStateMock\n})\n\n\u002F\u002F 然后，在测试中\nuseStateMock.mockImplementation(() => {\n  return { value: 'something else' }\n})\n",[1039,3921,3922,3941,3959,3963,3993,3999,4021,4040,4049,4053,4059,4063,4083,4090,4096,4100,4105,4123,4142],{"__ignoreMap":354},[1124,3923,3924,3926,3928,3931,3933,3935,3937,3939],{"class":1126,"line":1127},[1124,3925,1354],{"class":1276},[1124,3927,1357],{"class":1291},[1124,3929,3930],{"class":1287}," vi",[1124,3932,1363],{"class":1291},[1124,3934,1366],{"class":1276},[1124,3936,1369],{"class":1311},[1124,3938,1088],{"class":1133},[1124,3940,1375],{"class":1311},[1124,3942,3943,3945,3947,3949,3951,3953,3955,3957],{"class":1126,"line":1295},[1124,3944,1354],{"class":1276},[1124,3946,1357],{"class":1291},[1124,3948,3558],{"class":1287},[1124,3950,1363],{"class":1291},[1124,3952,1366],{"class":1276},[1124,3954,1369],{"class":1311},[1124,3956,2708],{"class":1133},[1124,3958,1375],{"class":1311},[1124,3960,3961],{"class":1126,"line":1308},[1124,3962,1401],{"emptyLinePlaceholder":1400},[1124,3964,3965,3968,3970,3973,3975,3977,3979,3981,3984,3986,3989,3991],{"class":1126,"line":1323},[1124,3966,3967],{"class":2009},"const",[1124,3969,1357],{"class":1291},[1124,3971,3972],{"class":2668}," useStateMock",[1124,3974,1363],{"class":1291},[1124,3976,2768],{"class":2672},[1124,3978,3930],{"class":1287},[1124,3980,2793],{"class":1291},[1124,3982,3983],{"class":1283},"hoisted",[1124,3985,1288],{"class":1287},[1124,3987,3988],{"class":1291},"()",[1124,3990,2010],{"class":2009},[1124,3992,1423],{"class":1291},[1124,3994,3995,3997],{"class":1126,"line":1331},[1124,3996,3597],{"class":1276},[1124,3998,1423],{"class":1291},[1124,4000,4001,4004,4006,4008,4010,4013,4015,4017,4019],{"class":1126,"line":1426},[1124,4002,4003],{"class":1298},"    useStateMock",[1124,4005,1302],{"class":1291},[1124,4007,3930],{"class":1287},[1124,4009,2793],{"class":1291},[1124,4011,4012],{"class":1283},"fn",[1124,4014,1288],{"class":1298},[1124,4016,3988],{"class":1291},[1124,4018,2010],{"class":2009},[1124,4020,1423],{"class":1291},[1124,4022,4023,4026,4028,4030,4032,4034,4036,4038],{"class":1126,"line":1436},[1124,4024,4025],{"class":1276},"      return",[1124,4027,1357],{"class":1291},[1124,4029,3613],{"class":1298},[1124,4031,1302],{"class":1291},[1124,4033,1369],{"class":1311},[1124,4035,3620],{"class":1133},[1124,4037,1317],{"class":1311},[1124,4039,3625],{"class":1291},[1124,4041,4042,4045,4047],{"class":1126,"line":1442},[1124,4043,4044],{"class":1291},"    }",[1124,4046,1679],{"class":1298},[1124,4048,1320],{"class":1291},[1124,4050,4051],{"class":1126,"line":1452},[1124,4052,3630],{"class":1291},[1124,4054,4055,4057],{"class":1126,"line":1469},[1124,4056,1334],{"class":1291},[1124,4058,1337],{"class":1287},[1124,4060,4061],{"class":1126,"line":1492},[1124,4062,1401],{"emptyLinePlaceholder":1400},[1124,4064,4065,4067,4069,4071,4073,4075,4077,4079,4081],{"class":1126,"line":1509},[1124,4066,3536],{"class":1283},[1124,4068,1288],{"class":1287},[1124,4070,1317],{"class":1311},[1124,4072,549],{"class":1133},[1124,4074,1317],{"class":1311},[1124,4076,2003],{"class":1291},[1124,4078,2006],{"class":1291},[1124,4080,2010],{"class":2009},[1124,4082,1423],{"class":1291},[1124,4084,4085,4087],{"class":1126,"line":1515},[1124,4086,3597],{"class":1276},[1124,4088,4089],{"class":1287}," useStateMock\n",[1124,4091,4092,4094],{"class":1126,"line":1521},[1124,4093,1334],{"class":1291},[1124,4095,1337],{"class":1287},[1124,4097,4098],{"class":1126,"line":1526},[1124,4099,1401],{"emptyLinePlaceholder":1400},[1124,4101,4102],{"class":1126,"line":1535},[1124,4103,4104],{"class":1879},"\u002F\u002F 然后，在测试中\n",[1124,4106,4107,4110,4112,4115,4117,4119,4121],{"class":1126,"line":1551},[1124,4108,4109],{"class":1287},"useStateMock",[1124,4111,2793],{"class":1291},[1124,4113,4114],{"class":1283},"mockImplementation",[1124,4116,1288],{"class":1287},[1124,4118,3988],{"class":1291},[1124,4120,2010],{"class":2009},[1124,4122,1423],{"class":1291},[1124,4124,4125,4127,4129,4131,4133,4135,4138,4140],{"class":1126,"line":1571},[1124,4126,3597],{"class":1276},[1124,4128,1357],{"class":1291},[1124,4130,3613],{"class":1298},[1124,4132,1302],{"class":1291},[1124,4134,1369],{"class":1311},[1124,4136,4137],{"class":1133},"something else",[1124,4139,1317],{"class":1311},[1124,4141,3625],{"class":1291},[1124,4143,4144,4146],{"class":1126,"line":1586},[1124,4145,1334],{"class":1291},[1124,4147,1337],{"class":1287},[1027,4149,4150],{},"如果你只需要在测试内部 mock 行为，也可以使用以下方法。",[1115,4152,4154],{"className":1266,"code":4153,"language":1268,"meta":1269,"style":354},"import { beforeEach, vi } from 'vitest'\nimport { mockNuxtImport } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nmockNuxtImport(useRoute, original => vi.fn(original))\n\n:beforeEach(() => {\n  vi.resetAllMocks()\n})\n\n\u002F\u002F 然后，在测试中\nconst useRouteOriginal = vi.mocked(useRoute).getMockImplementation()!\nvi.mocked(useRoute).mockImplementation(\n  (...args) => ({ ...useRouteOriginal(...args), path: '\u002Fmocked' }),\n)\n",[1039,4155,4156,4179,4197,4201,4224,4228,4243,4255,4261,4265,4269,4298,4315,4365],{"__ignoreMap":354},[1124,4157,4158,4160,4162,4165,4167,4169,4171,4173,4175,4177],{"class":1126,"line":1127},[1124,4159,1354],{"class":1276},[1124,4161,1357],{"class":1291},[1124,4163,4164],{"class":1287}," beforeEach",[1124,4166,2003],{"class":1291},[1124,4168,3930],{"class":1287},[1124,4170,1363],{"class":1291},[1124,4172,1366],{"class":1276},[1124,4174,1369],{"class":1311},[1124,4176,1088],{"class":1133},[1124,4178,1375],{"class":1311},[1124,4180,4181,4183,4185,4187,4189,4191,4193,4195],{"class":1126,"line":1295},[1124,4182,1354],{"class":1276},[1124,4184,1357],{"class":1291},[1124,4186,3558],{"class":1287},[1124,4188,1363],{"class":1291},[1124,4190,1366],{"class":1276},[1124,4192,1369],{"class":1311},[1124,4194,2708],{"class":1133},[1124,4196,1375],{"class":1311},[1124,4198,4199],{"class":1126,"line":1308},[1124,4200,1401],{"emptyLinePlaceholder":1400},[1124,4202,4203,4205,4208,4210,4213,4215,4217,4219,4221],{"class":1126,"line":1323},[1124,4204,3536],{"class":1283},[1124,4206,4207],{"class":1287},"(useRoute",[1124,4209,2003],{"class":1291},[1124,4211,4212],{"class":3708}," original",[1124,4214,2010],{"class":2009},[1124,4216,3930],{"class":1287},[1124,4218,2793],{"class":1291},[1124,4220,4012],{"class":1283},[1124,4222,4223],{"class":1287},"(original))\n",[1124,4225,4226],{"class":1126,"line":1331},[1124,4227,1401],{"emptyLinePlaceholder":1400},[1124,4229,4230,4232,4235,4237,4239,4241],{"class":1126,"line":1426},[1124,4231,1302],{"class":1287},[1124,4233,4234],{"class":1283},"beforeEach",[1124,4236,1288],{"class":1287},[1124,4238,3988],{"class":1291},[1124,4240,2010],{"class":2009},[1124,4242,1423],{"class":1291},[1124,4244,4245,4248,4250,4253],{"class":1126,"line":1436},[1124,4246,4247],{"class":1287},"  vi",[1124,4249,2793],{"class":1291},[1124,4251,4252],{"class":1283},"resetAllMocks",[1124,4254,3321],{"class":1298},[1124,4256,4257,4259],{"class":1126,"line":1442},[1124,4258,1334],{"class":1291},[1124,4260,1337],{"class":1287},[1124,4262,4263],{"class":1126,"line":1452},[1124,4264,1401],{"emptyLinePlaceholder":1400},[1124,4266,4267],{"class":1126,"line":1469},[1124,4268,4104],{"class":1879},[1124,4270,4271,4273,4276,4278,4280,4282,4285,4288,4290,4293,4295],{"class":1126,"line":1492},[1124,4272,3967],{"class":2009},[1124,4274,4275],{"class":2668}," useRouteOriginal",[1124,4277,2768],{"class":2672},[1124,4279,3930],{"class":1287},[1124,4281,2793],{"class":1291},[1124,4283,4284],{"class":1283},"mocked",[1124,4286,4287],{"class":1287},"(useRoute)",[1124,4289,2793],{"class":1291},[1124,4291,4292],{"class":1283},"getMockImplementation",[1124,4294,3988],{"class":1287},[1124,4296,4297],{"class":2672},"!\n",[1124,4299,4300,4303,4305,4307,4309,4311,4313],{"class":1126,"line":1509},[1124,4301,4302],{"class":1287},"vi",[1124,4304,2793],{"class":1291},[1124,4306,4284],{"class":1283},[1124,4308,4287],{"class":1287},[1124,4310,2793],{"class":1291},[1124,4312,4114],{"class":1283},[1124,4314,2807],{"class":1287},[1124,4316,4317,4320,4322,4324,4326,4328,4330,4333,4335,4338,4340,4342,4345,4347,4350,4352,4354,4357,4359,4361,4363],{"class":1126,"line":1515},[1124,4318,4319],{"class":1291},"  (",[1124,4321,3724],{"class":2672},[1124,4323,3727],{"class":3708},[1124,4325,1679],{"class":1291},[1124,4327,2010],{"class":2009},[1124,4329,3705],{"class":1287},[1124,4331,4332],{"class":1291},"{",[1124,4334,3742],{"class":2672},[1124,4336,4337],{"class":1283},"useRouteOriginal",[1124,4339,1288],{"class":1287},[1124,4341,3724],{"class":2672},[1124,4343,4344],{"class":1287},"args)",[1124,4346,2003],{"class":1291},[1124,4348,4349],{"class":1298}," path",[1124,4351,1302],{"class":1291},[1124,4353,1369],{"class":1311},[1124,4355,4356],{"class":1133},"\u002Fmocked",[1124,4358,1317],{"class":1311},[1124,4360,1363],{"class":1291},[1124,4362,1679],{"class":1287},[1124,4364,1320],{"class":1291},[1124,4366,4367],{"class":1126,"line":1521},[1124,4368,1337],{"class":1287},[1785,4370,4372],{"id":4371},"mockcomponent",[1039,4373,4374],{},"mockComponent",[1027,4376,4377,4379],{},[1039,4378,4374],{}," 允许你 mock Nuxt 的组件。\n第一个参数可以是 PascalCase 形式的组件名，或者组件的相对路径。\n第二个参数是一个返回被 mock 组件的工厂函数。",[1027,4381,4382,4383,4386],{},"例如，要 mock ",[1039,4384,4385],{},"MyComponent","，你可以：",[1115,4388,4390],{"className":1266,"code":4389,"language":1268,"meta":1269,"style":354},"import { mockComponent } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nmockComponent('MyComponent', {\n  props: {\n    value: String,\n  },\n  setup (props) {\n    \u002F\u002F ...\n  },\n})\n\n\u002F\u002F 相对路径或别名也可以\nmockComponent('~\u002Fcomponents\u002Fmy-component.vue', () => {\n  \u002F\u002F 或者使用工厂函数\n  return defineComponent({\n    setup (props) {\n      \u002F\u002F ...\n    },\n  })\n})\n\n\u002F\u002F 或者你可以使用 SFC 重定向到一个 mock 组件\nmockComponent('MyComponent', () => import('.\u002FMockComponent.vue'))\n\n\u002F\u002F your tests here\n",[1039,4391,4392,4411,4415,4431,4440,4452,4456,4471,4476,4480,4486,4490,4495,4516,4521,4532,4545,4550,4554,4561,4567,4571,4576,4609,4613],{"__ignoreMap":354},[1124,4393,4394,4396,4398,4401,4403,4405,4407,4409],{"class":1126,"line":1127},[1124,4395,1354],{"class":1276},[1124,4397,1357],{"class":1291},[1124,4399,4400],{"class":1287}," mockComponent",[1124,4402,1363],{"class":1291},[1124,4404,1366],{"class":1276},[1124,4406,1369],{"class":1311},[1124,4408,2708],{"class":1133},[1124,4410,1375],{"class":1311},[1124,4412,4413],{"class":1126,"line":1295},[1124,4414,1401],{"emptyLinePlaceholder":1400},[1124,4416,4417,4419,4421,4423,4425,4427,4429],{"class":1126,"line":1308},[1124,4418,4374],{"class":1283},[1124,4420,1288],{"class":1287},[1124,4422,1317],{"class":1311},[1124,4424,4385],{"class":1133},[1124,4426,1317],{"class":1311},[1124,4428,2003],{"class":1291},[1124,4430,1423],{"class":1291},[1124,4432,4433,4436,4438],{"class":1126,"line":1323},[1124,4434,4435],{"class":1298},"  props",[1124,4437,1302],{"class":1291},[1124,4439,1423],{"class":1291},[1124,4441,4442,4445,4447,4450],{"class":1126,"line":1331},[1124,4443,4444],{"class":1298},"    value",[1124,4446,1302],{"class":1291},[1124,4448,4449],{"class":1287}," String",[1124,4451,1320],{"class":1291},[1124,4453,4454],{"class":1126,"line":1426},[1124,4455,1695],{"class":1291},[1124,4457,4458,4462,4464,4467,4469],{"class":1126,"line":1436},[1124,4459,4461],{"class":4460},"syA7L","  setup",[1124,4463,3705],{"class":1291},[1124,4465,4466],{"class":3708},"props",[1124,4468,1679],{"class":1291},[1124,4470,1423],{"class":1291},[1124,4472,4473],{"class":1126,"line":1442},[1124,4474,4475],{"class":1879},"    \u002F\u002F ...\n",[1124,4477,4478],{"class":1126,"line":1452},[1124,4479,1695],{"class":1291},[1124,4481,4482,4484],{"class":1126,"line":1469},[1124,4483,1334],{"class":1291},[1124,4485,1337],{"class":1287},[1124,4487,4488],{"class":1126,"line":1492},[1124,4489,1401],{"emptyLinePlaceholder":1400},[1124,4491,4492],{"class":1126,"line":1509},[1124,4493,4494],{"class":1879},"\u002F\u002F 相对路径或别名也可以\n",[1124,4496,4497,4499,4501,4503,4506,4508,4510,4512,4514],{"class":1126,"line":1515},[1124,4498,4374],{"class":1283},[1124,4500,1288],{"class":1287},[1124,4502,1317],{"class":1311},[1124,4504,4505],{"class":1133},"~\u002Fcomponents\u002Fmy-component.vue",[1124,4507,1317],{"class":1311},[1124,4509,2003],{"class":1291},[1124,4511,2006],{"class":1291},[1124,4513,2010],{"class":2009},[1124,4515,1423],{"class":1291},[1124,4517,4518],{"class":1126,"line":1521},[1124,4519,4520],{"class":1879},"  \u002F\u002F 或者使用工厂函数\n",[1124,4522,4523,4525,4528,4530],{"class":1126,"line":1526},[1124,4524,3597],{"class":1276},[1124,4526,4527],{"class":1283}," defineComponent",[1124,4529,1288],{"class":1298},[1124,4531,1292],{"class":1291},[1124,4533,4534,4537,4539,4541,4543],{"class":1126,"line":1535},[1124,4535,4536],{"class":4460},"    setup",[1124,4538,3705],{"class":1291},[1124,4540,4466],{"class":3708},[1124,4542,1679],{"class":1291},[1124,4544,1423],{"class":1291},[1124,4546,4547],{"class":1126,"line":1551},[1124,4548,4549],{"class":1879},"      \u002F\u002F ...\n",[1124,4551,4552],{"class":1126,"line":1571},[1124,4553,2232],{"class":1291},[1124,4555,4556,4559],{"class":1126,"line":1586},[1124,4557,4558],{"class":1291},"  }",[1124,4560,1337],{"class":1298},[1124,4562,4563,4565],{"class":1126,"line":1591},[1124,4564,1334],{"class":1291},[1124,4566,1337],{"class":1287},[1124,4568,4569],{"class":1126,"line":1596},[1124,4570,1401],{"emptyLinePlaceholder":1400},[1124,4572,4573],{"class":1126,"line":1608},[1124,4574,4575],{"class":1879},"\u002F\u002F 或者你可以使用 SFC 重定向到一个 mock 组件\n",[1124,4577,4578,4580,4582,4584,4586,4588,4590,4592,4594,4597,4599,4601,4604,4606],{"class":1126,"line":1617},[1124,4579,4374],{"class":1283},[1124,4581,1288],{"class":1287},[1124,4583,1317],{"class":1311},[1124,4585,4385],{"class":1133},[1124,4587,1317],{"class":1311},[1124,4589,2003],{"class":1291},[1124,4591,2006],{"class":1291},[1124,4593,2010],{"class":2009},[1124,4595,4596],{"class":2672}," import",[1124,4598,1288],{"class":1287},[1124,4600,1317],{"class":1311},[1124,4602,4603],{"class":1133},".\u002FMockComponent.vue",[1124,4605,1317],{"class":1311},[1124,4607,4608],{"class":1287},"))\n",[1124,4610,4611],{"class":1126,"line":1633},[1124,4612,1401],{"emptyLinePlaceholder":1400},[1124,4614,4615],{"class":1126,"line":1653},[1124,4616,3645],{"class":1879},[1731,4618,4619],{},[1027,4620,4621,4624],{},[1767,4622,4623],{},"注意","：你无法在工厂函数中引用局部变量，因为它们会被提升。如果你需要访问 Vue API 或其他变量，你需要在工厂函数中导入它们。",[1115,4626,4628],{"className":1266,"code":4627,"language":1268,"meta":1269,"style":354},"import { mockComponent } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nmockComponent('MyComponent', async () => {\n  const { ref, h } = await import('vue')\n\n  return defineComponent({\n    setup (props) {\n      const counter = ref(0)\n      return () => h('div', null, counter.value)\n    },\n  })\n})\n",[1039,4629,4630,4648,4652,4674,4706,4710,4720,4732,4752,4788,4792,4798],{"__ignoreMap":354},[1124,4631,4632,4634,4636,4638,4640,4642,4644,4646],{"class":1126,"line":1127},[1124,4633,1354],{"class":1276},[1124,4635,1357],{"class":1291},[1124,4637,4400],{"class":1287},[1124,4639,1363],{"class":1291},[1124,4641,1366],{"class":1276},[1124,4643,1369],{"class":1311},[1124,4645,2708],{"class":1133},[1124,4647,1375],{"class":1311},[1124,4649,4650],{"class":1126,"line":1295},[1124,4651,1401],{"emptyLinePlaceholder":1400},[1124,4653,4654,4656,4658,4660,4662,4664,4666,4668,4670,4672],{"class":1126,"line":1308},[1124,4655,4374],{"class":1283},[1124,4657,1288],{"class":1287},[1124,4659,1317],{"class":1311},[1124,4661,4385],{"class":1133},[1124,4663,1317],{"class":1311},[1124,4665,2003],{"class":1291},[1124,4667,2751],{"class":2009},[1124,4669,2006],{"class":1291},[1124,4671,2010],{"class":2009},[1124,4673,1423],{"class":1291},[1124,4675,4676,4678,4680,4683,4685,4688,4690,4692,4694,4696,4698,4700,4702,4704],{"class":1126,"line":1323},[1124,4677,2762],{"class":2009},[1124,4679,1357],{"class":1291},[1124,4681,4682],{"class":2668}," ref",[1124,4684,2003],{"class":1291},[1124,4686,4687],{"class":2668}," h",[1124,4689,1363],{"class":1291},[1124,4691,2768],{"class":2672},[1124,4693,2771],{"class":1276},[1124,4695,4596],{"class":2672},[1124,4697,1288],{"class":1298},[1124,4699,1317],{"class":1311},[1124,4701,2634],{"class":1133},[1124,4703,1317],{"class":1311},[1124,4705,1337],{"class":1298},[1124,4707,4708],{"class":1126,"line":1331},[1124,4709,1401],{"emptyLinePlaceholder":1400},[1124,4711,4712,4714,4716,4718],{"class":1126,"line":1426},[1124,4713,3597],{"class":1276},[1124,4715,4527],{"class":1283},[1124,4717,1288],{"class":1298},[1124,4719,1292],{"class":1291},[1124,4721,4722,4724,4726,4728,4730],{"class":1126,"line":1436},[1124,4723,4536],{"class":4460},[1124,4725,3705],{"class":1291},[1124,4727,4466],{"class":3708},[1124,4729,1679],{"class":1291},[1124,4731,1423],{"class":1291},[1124,4733,4734,4737,4740,4742,4744,4746,4750],{"class":1126,"line":1442},[1124,4735,4736],{"class":2009},"      const",[1124,4738,4739],{"class":2668}," counter",[1124,4741,2768],{"class":2672},[1124,4743,4682],{"class":1283},[1124,4745,1288],{"class":1298},[1124,4747,4749],{"class":4748},"sOUxV","0",[1124,4751,1337],{"class":1298},[1124,4753,4754,4756,4758,4760,4762,4764,4766,4769,4771,4773,4777,4779,4781,4783,4786],{"class":1126,"line":1452},[1124,4755,4025],{"class":1276},[1124,4757,2006],{"class":1291},[1124,4759,2010],{"class":2009},[1124,4761,4687],{"class":1283},[1124,4763,1288],{"class":1298},[1124,4765,1317],{"class":1311},[1124,4767,4768],{"class":1133},"div",[1124,4770,1317],{"class":1311},[1124,4772,2003],{"class":1291},[1124,4774,4776],{"class":4775},"s0q4w"," null",[1124,4778,2003],{"class":1291},[1124,4780,4739],{"class":1287},[1124,4782,2793],{"class":1291},[1124,4784,4785],{"class":1287},"value",[1124,4787,1337],{"class":1298},[1124,4789,4790],{"class":1126,"line":1469},[1124,4791,2232],{"class":1291},[1124,4793,4794,4796],{"class":1126,"line":1492},[1124,4795,4558],{"class":1291},[1124,4797,1337],{"class":1298},[1124,4799,4800,4802],{"class":1126,"line":1509},[1124,4801,1334],{"class":1291},[1124,4803,1337],{"class":1287},[1785,4805,4807],{"id":4806},"registerendpoint",[1039,4808,4809],{},"registerEndpoint",[1027,4811,4812,4814],{},[1039,4813,4809],{}," 允许你创建返回 mock 数据的 Nitro 端点。如果你想测试一个向 API 发起请求以展示某些数据的组件，它会派上用场。",[1027,4816,4817,4818,4821],{},"第一个参数是端点名称（例如 ",[1039,4819,4820],{},"\u002Ftest\u002F","）。\n第二个参数是一个返回 mock 数据的工厂函数。",[1027,4823,4382,4824,4826],{},[1039,4825,4820],{}," 端点，你可以：",[1115,4828,4830],{"className":1266,"code":4829,"language":1268,"meta":1269,"style":354},"import { registerEndpoint } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nregisterEndpoint('\u002Ftest\u002F', () => ({\n  test: 'test-field',\n}))\n",[1039,4831,4832,4851,4855,4877,4892],{"__ignoreMap":354},[1124,4833,4834,4836,4838,4841,4843,4845,4847,4849],{"class":1126,"line":1127},[1124,4835,1354],{"class":1276},[1124,4837,1357],{"class":1291},[1124,4839,4840],{"class":1287}," registerEndpoint",[1124,4842,1363],{"class":1291},[1124,4844,1366],{"class":1276},[1124,4846,1369],{"class":1311},[1124,4848,2708],{"class":1133},[1124,4850,1375],{"class":1311},[1124,4852,4853],{"class":1126,"line":1295},[1124,4854,1401],{"emptyLinePlaceholder":1400},[1124,4856,4857,4859,4861,4863,4865,4867,4869,4871,4873,4875],{"class":1126,"line":1308},[1124,4858,4809],{"class":1283},[1124,4860,1288],{"class":1287},[1124,4862,1317],{"class":1311},[1124,4864,4820],{"class":1133},[1124,4866,1317],{"class":1311},[1124,4868,2003],{"class":1291},[1124,4870,2006],{"class":1291},[1124,4872,2010],{"class":2009},[1124,4874,3705],{"class":1287},[1124,4876,1292],{"class":1291},[1124,4878,4879,4881,4883,4885,4888,4890],{"class":1126,"line":1323},[1124,4880,1418],{"class":1298},[1124,4882,1302],{"class":1291},[1124,4884,1369],{"class":1311},[1124,4886,4887],{"class":1133},"test-field",[1124,4889,1317],{"class":1311},[1124,4891,1320],{"class":1291},[1124,4893,4894,4896],{"class":1126,"line":1331},[1124,4895,1334],{"class":1291},[1124,4897,4608],{"class":1287},[1027,4899,4900,4901,4904],{},"默认情况下，你的请求会使用 ",[1039,4902,4903],{},"GET"," 方法。你可以通过将第二个参数设置为一个对象（而不是函数）来使用其他方法。",[1115,4906,4908],{"className":1266,"code":4907,"language":1268,"meta":1269,"style":354},"import { registerEndpoint } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nregisterEndpoint('\u002Ftest\u002F', {\n  method: 'POST',\n  handler: () => ({ test: 'test-field' }),\n})\n",[1039,4909,4910,4928,4932,4948,4964,4995],{"__ignoreMap":354},[1124,4911,4912,4914,4916,4918,4920,4922,4924,4926],{"class":1126,"line":1127},[1124,4913,1354],{"class":1276},[1124,4915,1357],{"class":1291},[1124,4917,4840],{"class":1287},[1124,4919,1363],{"class":1291},[1124,4921,1366],{"class":1276},[1124,4923,1369],{"class":1311},[1124,4925,2708],{"class":1133},[1124,4927,1375],{"class":1311},[1124,4929,4930],{"class":1126,"line":1295},[1124,4931,1401],{"emptyLinePlaceholder":1400},[1124,4933,4934,4936,4938,4940,4942,4944,4946],{"class":1126,"line":1308},[1124,4935,4809],{"class":1283},[1124,4937,1288],{"class":1287},[1124,4939,1317],{"class":1311},[1124,4941,4820],{"class":1133},[1124,4943,1317],{"class":1311},[1124,4945,2003],{"class":1291},[1124,4947,1423],{"class":1291},[1124,4949,4950,4953,4955,4957,4960,4962],{"class":1126,"line":1323},[1124,4951,4952],{"class":1298},"  method",[1124,4954,1302],{"class":1291},[1124,4956,1369],{"class":1311},[1124,4958,4959],{"class":1133},"POST",[1124,4961,1317],{"class":1311},[1124,4963,1320],{"class":1291},[1124,4965,4966,4969,4971,4973,4975,4977,4979,4981,4983,4985,4987,4989,4991,4993],{"class":1126,"line":1331},[1124,4967,4968],{"class":1283},"  handler",[1124,4970,1302],{"class":1291},[1124,4972,2006],{"class":1291},[1124,4974,2010],{"class":2009},[1124,4976,3705],{"class":1287},[1124,4978,4332],{"class":1291},[1124,4980,1972],{"class":1298},[1124,4982,1302],{"class":1291},[1124,4984,1369],{"class":1311},[1124,4986,4887],{"class":1133},[1124,4988,1317],{"class":1311},[1124,4990,1363],{"class":1291},[1124,4992,1679],{"class":1287},[1124,4994,1320],{"class":1291},[1124,4996,4997,4999],{"class":1126,"line":1426},[1124,4998,1334],{"class":1291},[1124,5000,1337],{"class":1287},[1027,5002,5003],{},"这个对象接受以下属性：",[1070,5005,5006,5012,5018],{},[1073,5007,5008,5011],{},[1039,5009,5010],{},"handler","：事件处理函数",[1073,5013,5014,5017],{},[1039,5015,5016],{},"method","：（可选）要匹配的 HTTP 方法（例如 'GET'、'POST'）",[1073,5019,5020,5023],{},[1039,5021,5022],{},"once","：（可选）如果为 true，该处理函数只会用于第一次匹配的请求，然后自动移除",[1731,5025,5026],{},[1027,5027,5028,5030,5031,5034,5035,5039,5040,5043],{},[1767,5029,4623],{},"：如果你的组件中的请求发往外部 API，你可以使用 ",[1039,5032,5033],{},"baseURL","，然后使用 ",[1031,5036,5038],{"href":5037},"\u002Fdocs\u002Fgetting-started\u002Fconfiguration#environment-overrides","Nuxt 环境覆盖配置","（",[1039,5041,5042],{},"$test","）将其设为空，这样你所有的请求都会发往 Nitro 服务器。",[1785,5045,5047],{"id":5046},"与端到端测试的冲突conflict-with-end-to-end-testing","与端到端测试的冲突（Conflict with End-To-End Testing）",[1027,5049,5050,1079,5052,5055],{},[1039,5051,2708],{},[1039,5053,5054],{},"@nuxt\u002Ftest-utils\u002Fe2e"," 需要在不同的测试环境中运行，因此不能在同一文件中使用。",[1027,5057,5058,5059,5061,5062,5065,5066,5069],{},"如果你想同时使用 ",[1039,5060,1041],{}," 的端到端和单元测试功能，可以将你的测试拆分为单独的文件。然后你可以通过特殊的 ",[1039,5063,5064],{},"\u002F\u002F @vitest-environment nuxt"," 注释为每文件指定测试环境，或者将你的运行时单元测试文件命名为 ",[1039,5067,5068],{},".nuxt.spec.ts"," 扩展名。",[1027,5071,5072],{},[1039,5073,5074],{},"app.nuxt.spec.ts",[1115,5076,5078],{"className":1266,"code":5077,"language":1268,"meta":1269,"style":354},"import { mockNuxtImport } from '@nuxt\u002Ftest-utils\u002Fruntime'\n\nmockNuxtImport('useState', () => {\n  return () => {\n    return { value: 'mocked storage' }\n  }\n})\n",[1039,5079,5080,5098,5102,5122,5132,5150,5154],{"__ignoreMap":354},[1124,5081,5082,5084,5086,5088,5090,5092,5094,5096],{"class":1126,"line":1127},[1124,5083,1354],{"class":1276},[1124,5085,1357],{"class":1291},[1124,5087,3558],{"class":1287},[1124,5089,1363],{"class":1291},[1124,5091,1366],{"class":1276},[1124,5093,1369],{"class":1311},[1124,5095,2708],{"class":1133},[1124,5097,1375],{"class":1311},[1124,5099,5100],{"class":1126,"line":1295},[1124,5101,1401],{"emptyLinePlaceholder":1400},[1124,5103,5104,5106,5108,5110,5112,5114,5116,5118,5120],{"class":1126,"line":1308},[1124,5105,3536],{"class":1283},[1124,5107,1288],{"class":1287},[1124,5109,1317],{"class":1311},[1124,5111,549],{"class":1133},[1124,5113,1317],{"class":1311},[1124,5115,2003],{"class":1291},[1124,5117,2006],{"class":1291},[1124,5119,2010],{"class":2009},[1124,5121,1423],{"class":1291},[1124,5123,5124,5126,5128,5130],{"class":1126,"line":1323},[1124,5125,3597],{"class":1276},[1124,5127,2006],{"class":1291},[1124,5129,2010],{"class":2009},[1124,5131,1423],{"class":1291},[1124,5133,5134,5136,5138,5140,5142,5144,5146,5148],{"class":1126,"line":1331},[1124,5135,3608],{"class":1276},[1124,5137,1357],{"class":1291},[1124,5139,3613],{"class":1298},[1124,5141,1302],{"class":1291},[1124,5143,1369],{"class":1311},[1124,5145,3620],{"class":1133},[1124,5147,1317],{"class":1311},[1124,5149,3625],{"class":1291},[1124,5151,5152],{"class":1126,"line":1426},[1124,5153,3630],{"class":1291},[1124,5155,5156,5158],{"class":1126,"line":1436},[1124,5157,1334],{"class":1291},[1124,5159,1337],{"class":1287},[1027,5161,5162],{},[1039,5163,5164],{},"app.e2e.spec.ts",[1115,5166,5168],{"className":1266,"code":5167,"language":1268,"meta":1269,"style":354},"import { $fetch, setup } from '@nuxt\u002Ftest-utils\u002Fe2e'\n\nawait setup({\n  setupTimeout: 10000,\n})\n\n\u002F\u002F ...\n",[1039,5169,5170,5194,5198,5209,5221,5227,5231],{"__ignoreMap":354},[1124,5171,5172,5174,5176,5179,5181,5184,5186,5188,5190,5192],{"class":1126,"line":1127},[1124,5173,1354],{"class":1276},[1124,5175,1357],{"class":1291},[1124,5177,5178],{"class":1287}," $fetch",[1124,5180,2003],{"class":1291},[1124,5182,5183],{"class":1287}," setup",[1124,5185,1363],{"class":1291},[1124,5187,1366],{"class":1276},[1124,5189,1369],{"class":1311},[1124,5191,5054],{"class":1133},[1124,5193,1375],{"class":1311},[1124,5195,5196],{"class":1126,"line":1295},[1124,5197,1401],{"emptyLinePlaceholder":1400},[1124,5199,5200,5203,5205,5207],{"class":1126,"line":1308},[1124,5201,5202],{"class":1276},"await",[1124,5204,5183],{"class":1283},[1124,5206,1288],{"class":1287},[1124,5208,1292],{"class":1291},[1124,5210,5211,5214,5216,5219],{"class":1126,"line":1323},[1124,5212,5213],{"class":1298},"  setupTimeout",[1124,5215,1302],{"class":1291},[1124,5217,5218],{"class":4748}," 10000",[1124,5220,1320],{"class":1291},[1124,5222,5223,5225],{"class":1126,"line":1331},[1124,5224,1334],{"class":1291},[1124,5226,1337],{"class":1287},[1124,5228,5229],{"class":1126,"line":1426},[1124,5230,1401],{"emptyLinePlaceholder":1400},[1124,5232,5233],{"class":1126,"line":1436},[1124,5234,5235],{"class":1879},"\u002F\u002F ...\n",[1246,5237,1755,5239],{"id":5238},"使用-vuetest-utils",[1039,5240,2565],{},[1027,5242,5243,5244,5246],{},"如果你更喜欢单独使用 ",[1039,5245,2565],{}," 在 Nuxt 中进行单元测试，并且你只测试不依赖 Nuxt composable、自动导入或上下文的组件，你可以按照以下步骤进行设置。",[1251,5248,5249,5339,5446,5542,5597,5783],{},[1073,5250,5251,5252],{},"安装所需的依赖",[1111,5253,5254,5276,5297,5318],{"sync":1113},[1115,5255,5257],{"className":1117,"code":5256,"filename":1119,"language":1120,"meta":354,"style":354},"npm i --save-dev vitest @vue\u002Ftest-utils happy-dom @vitejs\u002Fplugin-vue\n",[1039,5258,5259],{"__ignoreMap":354},[1124,5260,5261,5263,5265,5267,5269,5271,5273],{"class":1126,"line":1127},[1124,5262,1119],{"class":1130},[1124,5264,1134],{"class":1133},[1124,5266,1138],{"class":1137},[1124,5268,1144],{"class":1133},[1124,5270,1147],{"class":1133},[1124,5272,1150],{"class":1133},[1124,5274,5275],{"class":1133}," @vitejs\u002Fplugin-vue\n",[1115,5277,5279],{"className":1117,"code":5278,"filename":1157,"language":1120,"meta":354,"style":354},"yarn add --dev vitest @vue\u002Ftest-utils happy-dom @vitejs\u002Fplugin-vue\n",[1039,5280,5281],{"__ignoreMap":354},[1124,5282,5283,5285,5287,5289,5291,5293,5295],{"class":1126,"line":1127},[1124,5284,1157],{"class":1130},[1124,5286,1166],{"class":1133},[1124,5288,1169],{"class":1137},[1124,5290,1144],{"class":1133},[1124,5292,1147],{"class":1133},[1124,5294,1150],{"class":1133},[1124,5296,5275],{"class":1133},[1115,5298,5300],{"className":1117,"code":5299,"filename":1183,"language":1120,"meta":354,"style":354},"pnpm add -D vitest @vue\u002Ftest-utils happy-dom @vitejs\u002Fplugin-vue\n",[1039,5301,5302],{"__ignoreMap":354},[1124,5303,5304,5306,5308,5310,5312,5314,5316],{"class":1126,"line":1127},[1124,5305,1183],{"class":1130},[1124,5307,1166],{"class":1133},[1124,5309,1194],{"class":1137},[1124,5311,1144],{"class":1133},[1124,5313,1147],{"class":1133},[1124,5315,1150],{"class":1133},[1124,5317,5275],{"class":1133},[1115,5319,5321],{"className":1117,"code":5320,"filename":1208,"language":1120,"meta":354,"style":354},"bun add --dev vitest @vue\u002Ftest-utils happy-dom @vitejs\u002Fplugin-vue\n",[1039,5322,5323],{"__ignoreMap":354},[1124,5324,5325,5327,5329,5331,5333,5335,5337],{"class":1126,"line":1127},[1124,5326,1208],{"class":1130},[1124,5328,1166],{"class":1133},[1124,5330,1169],{"class":1137},[1124,5332,1144],{"class":1133},[1124,5334,1147],{"class":1133},[1124,5336,1150],{"class":1133},[1124,5338,5275],{"class":1133},[1073,5340,1340,5341,1344,5343],{},[1039,5342,1343],{},[1115,5344,5346],{"className":1266,"code":5345,"language":1268,"meta":354,"style":354},"import { defineConfig } from 'vitest\u002Fconfig'\nimport vue from '@vitejs\u002Fplugin-vue'\n\nexport default defineConfig({\n  plugins: [vue()],\n  test: {\n    environment: 'happy-dom',\n  },\n})\n",[1039,5347,5348,5366,5382,5386,5398,5414,5422,5436,5440],{"__ignoreMap":354},[1124,5349,5350,5352,5354,5356,5358,5360,5362,5364],{"class":1126,"line":1127},[1124,5351,1354],{"class":1276},[1124,5353,1357],{"class":1291},[1124,5355,1360],{"class":1287},[1124,5357,1363],{"class":1291},[1124,5359,1366],{"class":1276},[1124,5361,1369],{"class":1311},[1124,5363,1372],{"class":1133},[1124,5365,1375],{"class":1311},[1124,5367,5368,5370,5373,5375,5377,5380],{"class":1126,"line":1295},[1124,5369,1354],{"class":1276},[1124,5371,5372],{"class":1287}," vue ",[1124,5374,2896],{"class":1276},[1124,5376,1369],{"class":1311},[1124,5378,5379],{"class":1133},"@vitejs\u002Fplugin-vue",[1124,5381,1375],{"class":1311},[1124,5383,5384],{"class":1126,"line":1308},[1124,5385,1401],{"emptyLinePlaceholder":1400},[1124,5387,5388,5390,5392,5394,5396],{"class":1126,"line":1323},[1124,5389,1277],{"class":1276},[1124,5391,1280],{"class":1276},[1124,5393,1360],{"class":1283},[1124,5395,1288],{"class":1287},[1124,5397,1292],{"class":1291},[1124,5399,5400,5403,5405,5407,5409,5412],{"class":1126,"line":1331},[1124,5401,5402],{"class":1298},"  plugins",[1124,5404,1302],{"class":1291},[1124,5406,1477],{"class":1287},[1124,5408,2634],{"class":1283},[1124,5410,5411],{"class":1287},"()]",[1124,5413,1320],{"class":1291},[1124,5415,5416,5418,5420],{"class":1126,"line":1426},[1124,5417,1418],{"class":1298},[1124,5419,1302],{"class":1291},[1124,5421,1423],{"class":1291},[1124,5423,5424,5426,5428,5430,5432,5434],{"class":1126,"line":1436},[1124,5425,1864],{"class":1298},[1124,5427,1302],{"class":1291},[1124,5429,1369],{"class":1311},[1124,5431,1078],{"class":1133},[1124,5433,1317],{"class":1311},[1124,5435,1320],{"class":1291},[1124,5437,5438],{"class":1126,"line":1442},[1124,5439,1695],{"class":1291},[1124,5441,5442,5444],{"class":1126,"line":1452},[1124,5443,1334],{"class":1291},[1124,5445,1337],{"class":1287},[1073,5447,5448,5449,5451,5452],{},"在你的 ",[1039,5450,178],{}," 中添加一个新的 test 命令",[1115,5453,5457],{"className":5454,"code":5455,"language":5456,"meta":354,"style":354},"language-json shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","\"scripts\": {\n  \"build\": \"nuxt build\",\n  \"dev\": \"nuxt dev\",\n  ...\n  \"test\": \"vitest\"\n}\n","json",[1039,5458,5459,5474,5496,5515,5521,5538],{"__ignoreMap":354},[1124,5460,5461,5464,5467,5469,5472],{"class":1126,"line":1127},[1124,5462,5463],{"class":1311},"\"",[1124,5465,5466],{"class":1133},"scripts",[1124,5468,5463],{"class":1311},[1124,5470,5471],{"class":1287},": ",[1124,5473,1292],{"class":1291},[1124,5475,5476,5479,5483,5485,5487,5490,5492,5494],{"class":1126,"line":1295},[1124,5477,5478],{"class":4775},"  \"",[1124,5480,5482],{"class":5481},"sS9nB","build",[1124,5484,5463],{"class":4775},[1124,5486,1302],{"class":1291},[1124,5488,5489],{"class":1311}," \"",[1124,5491,677],{"class":1133},[1124,5493,5463],{"class":1311},[1124,5495,1320],{"class":1291},[1124,5497,5498,5500,5503,5505,5507,5509,5511,5513],{"class":1126,"line":1308},[1124,5499,5478],{"class":4775},[1124,5501,5502],{"class":5481},"dev",[1124,5504,5463],{"class":4775},[1124,5506,1302],{"class":1291},[1124,5508,5489],{"class":1311},[1124,5510,689],{"class":1133},[1124,5512,5463],{"class":1311},[1124,5514,1320],{"class":1291},[1124,5516,5517],{"class":1126,"line":1323},[1124,5518,5520],{"class":5519},"soRC5","  ...\n",[1124,5522,5523,5525,5527,5529,5531,5533,5535],{"class":1126,"line":1331},[1124,5524,5478],{"class":4775},[1124,5526,1991],{"class":5481},[1124,5528,5463],{"class":4775},[1124,5530,1302],{"class":1291},[1124,5532,5489],{"class":1311},[1124,5534,1088],{"class":1133},[1124,5536,5537],{"class":1311},"\"\n",[1124,5539,5540],{"class":1126,"line":1426},[1124,5541,2680],{"class":1291},[1073,5543,5544,5545,5548,5549,5552,5553],{},"创建一个简单的 ",[1039,5546,5547],{},"\u003CHelloWorld>"," 组件 ",[1039,5550,5551],{},"app\u002Fcomponents\u002FHelloWorld.vue","，内容如下：",[1115,5554,5557],{"className":5555,"code":5556,"language":2634,"meta":354,"style":354},"language-vue shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","\u003Ctemplate>\n  \u003Cp>Hello world\u003C\u002Fp>\n\u003C\u002Ftemplate>\n",[1039,5558,5559,5570,5589],{"__ignoreMap":354},[1124,5560,5561,5563,5567],{"class":1126,"line":1127},[1124,5562,3683],{"class":1291},[1124,5564,5566],{"class":5565},"s6g6u","template",[1124,5568,5569],{"class":1291},">\n",[1124,5571,5572,5575,5577,5579,5582,5585,5587],{"class":1126,"line":1295},[1124,5573,5574],{"class":1291},"  \u003C",[1124,5576,1027],{"class":5565},[1124,5578,3692],{"class":1291},[1124,5580,5581],{"class":1287},"Hello world",[1124,5583,5584],{"class":1291},"\u003C\u002F",[1124,5586,1027],{"class":5565},[1124,5588,5569],{"class":1291},[1124,5590,5591,5593,5595],{"class":1126,"line":1308},[1124,5592,5584],{"class":1291},[1124,5594,5566],{"class":5565},[1124,5596,5569],{"class":1291},[1073,5598,5599,5600,5603],{},"为这个新创建的组件创建一个简单的单元测试 ",[1039,5601,5602],{},"~\u002Fcomponents\u002FHelloWorld.spec.ts",[1115,5604,5606],{"className":1266,"code":5605,"language":1268,"meta":1269,"style":354},"import { describe, expect, it } from 'vitest'\nimport { mount } from '@vue\u002Ftest-utils'\n\nimport HelloWorld from '.\u002FHelloWorld.vue'\n\ndescribe('HelloWorld', () => {\n  it('component renders Hello world properly', () => {\n    const wrapper = mount(HelloWorld)\n    expect(wrapper.text()).toContain('Hello world')\n  })\n})\n",[1039,5607,5608,5635,5654,5658,5674,5678,5700,5722,5740,5771,5777],{"__ignoreMap":354},[1124,5609,5610,5612,5614,5617,5619,5621,5623,5625,5627,5629,5631,5633],{"class":1126,"line":1127},[1124,5611,1354],{"class":1276},[1124,5613,1357],{"class":1291},[1124,5615,5616],{"class":1287}," describe",[1124,5618,2003],{"class":1291},[1124,5620,2598],{"class":1287},[1124,5622,2003],{"class":1291},[1124,5624,2603],{"class":1287},[1124,5626,1363],{"class":1291},[1124,5628,1366],{"class":1276},[1124,5630,1369],{"class":1311},[1124,5632,1088],{"class":1133},[1124,5634,1375],{"class":1311},[1124,5636,5637,5639,5641,5644,5646,5648,5650,5652],{"class":1126,"line":1295},[1124,5638,1354],{"class":1276},[1124,5640,1357],{"class":1291},[1124,5642,5643],{"class":1287}," mount",[1124,5645,1363],{"class":1291},[1124,5647,1366],{"class":1276},[1124,5649,1369],{"class":1311},[1124,5651,2565],{"class":1133},[1124,5653,1375],{"class":1311},[1124,5655,5656],{"class":1126,"line":1308},[1124,5657,1401],{"emptyLinePlaceholder":1400},[1124,5659,5660,5662,5665,5667,5669,5672],{"class":1126,"line":1323},[1124,5661,1354],{"class":1276},[1124,5663,5664],{"class":1287}," HelloWorld ",[1124,5666,2896],{"class":1276},[1124,5668,1369],{"class":1311},[1124,5670,5671],{"class":1133},".\u002FHelloWorld.vue",[1124,5673,1375],{"class":1311},[1124,5675,5676],{"class":1126,"line":1331},[1124,5677,1401],{"emptyLinePlaceholder":1400},[1124,5679,5680,5683,5685,5687,5690,5692,5694,5696,5698],{"class":1126,"line":1426},[1124,5681,5682],{"class":1283},"describe",[1124,5684,1288],{"class":1287},[1124,5686,1317],{"class":1311},[1124,5688,5689],{"class":1133},"HelloWorld",[1124,5691,1317],{"class":1311},[1124,5693,2003],{"class":1291},[1124,5695,2006],{"class":1291},[1124,5697,2010],{"class":2009},[1124,5699,1423],{"class":1291},[1124,5701,5702,5705,5707,5709,5712,5714,5716,5718,5720],{"class":1126,"line":1436},[1124,5703,5704],{"class":1283},"  it",[1124,5706,1288],{"class":1298},[1124,5708,1317],{"class":1311},[1124,5710,5711],{"class":1133},"component renders Hello world properly",[1124,5713,1317],{"class":1311},[1124,5715,2003],{"class":1291},[1124,5717,2006],{"class":1291},[1124,5719,2010],{"class":2009},[1124,5721,1423],{"class":1291},[1124,5723,5724,5727,5730,5732,5734,5736,5738],{"class":1126,"line":1442},[1124,5725,5726],{"class":2009},"    const",[1124,5728,5729],{"class":2668}," wrapper",[1124,5731,2768],{"class":2672},[1124,5733,5643],{"class":1283},[1124,5735,1288],{"class":1298},[1124,5737,5689],{"class":1287},[1124,5739,1337],{"class":1298},[1124,5741,5742,5745,5747,5750,5752,5754,5756,5758,5761,5763,5765,5767,5769],{"class":1126,"line":1452},[1124,5743,5744],{"class":1283},"    expect",[1124,5746,1288],{"class":1298},[1124,5748,5749],{"class":1287},"wrapper",[1124,5751,2793],{"class":1291},[1124,5753,2796],{"class":1283},[1124,5755,2799],{"class":1298},[1124,5757,2793],{"class":1291},[1124,5759,5760],{"class":1283},"toContain",[1124,5762,1288],{"class":1298},[1124,5764,1317],{"class":1311},[1124,5766,5581],{"class":1133},[1124,5768,1317],{"class":1311},[1124,5770,1337],{"class":1298},[1124,5772,5773,5775],{"class":1126,"line":1469},[1124,5774,4558],{"class":1291},[1124,5776,1337],{"class":1298},[1124,5778,5779,5781],{"class":1126,"line":1492},[1124,5780,1334],{"class":1291},[1124,5782,1337],{"class":1287},[1073,5784,5785,5786],{},"运行 vitest 命令",[1111,5787,5788,5803,5814,5827],{"sync":1113},[1115,5789,5791],{"className":1117,"code":5790,"filename":1119,"language":1120,"meta":354,"style":354},"npm run test\n",[1039,5792,5793],{"__ignoreMap":354},[1124,5794,5795,5797,5800],{"class":1126,"line":1127},[1124,5796,1119],{"class":1130},[1124,5798,5799],{"class":1133}," run",[1124,5801,5802],{"class":1133}," test\n",[1115,5804,5806],{"className":1117,"code":5805,"filename":1157,"language":1120,"meta":354,"style":354},"yarn test\n",[1039,5807,5808],{"__ignoreMap":354},[1124,5809,5810,5812],{"class":1126,"line":1127},[1124,5811,1157],{"class":1130},[1124,5813,5802],{"class":1133},[1115,5815,5817],{"className":1117,"code":5816,"filename":1183,"language":1120,"meta":354,"style":354},"pnpm run test\n",[1039,5818,5819],{"__ignoreMap":354},[1124,5820,5821,5823,5825],{"class":1126,"line":1127},[1124,5822,1183],{"class":1130},[1124,5824,5799],{"class":1133},[1124,5826,5802],{"class":1133},[1115,5828,5830],{"className":1117,"code":5829,"filename":1208,"language":1120,"meta":354,"style":354},"bun run test\n",[1039,5831,5832],{"__ignoreMap":354},[1124,5833,5834,5836,5838],{"class":1126,"line":1127},[1124,5835,1208],{"class":1130},[1124,5837,5799],{"class":1133},[1124,5839,5802],{"class":1133},[1027,5841,5842,5843,5845],{},"恭喜，你已经准备好开始在 Nuxt 中使用 ",[1039,5844,2565],{}," 进行单元测试了！测试愉快！",[1059,5847,5849],{"id":5848},"端到端测试end-to-end-testing","端到端测试（End-To-End Testing）",[1027,5851,5852,5853,1089,5858,1089,5863,1079,5868,5873],{},"对于端到端测试，我们支持 ",[1031,5854,5857],{"href":5855,"rel":5856},"https:\u002F\u002Fgithub.com\u002Fvitest-dev\u002Fvitest",[1050],"Vitest",[1031,5859,5862],{"href":5860,"rel":5861},"https:\u002F\u002Fjestjs.io",[1050],"Jest",[1031,5864,5867],{"href":5865,"rel":5866},"https:\u002F\u002Fcucumber.io\u002F",[1050],"Cucumber",[1031,5869,5872],{"href":5870,"rel":5871},"https:\u002F\u002Fplaywright.dev\u002F",[1050],"Playwright"," 作为测试运行器。",[1246,5875,1249],{"id":5876},"设置setup-1",[1027,5878,5879,5880,5882,5883,5885],{},"在每个使用 ",[1039,5881,5054],{}," 辅助方法的 ",[1039,5884,5682],{}," 块中，你需要在开始之前设置测试上下文。",[1115,5887,5890],{"className":1266,"code":5888,"filename":5889,"language":1268,"meta":1269,"style":354},"import { describe, test } from 'vitest'\nimport { $fetch, setup } from '@nuxt\u002Ftest-utils\u002Fe2e'\n\ndescribe('My test', async () => {\n  await setup({\n    \u002F\u002F 测试上下文选项\n  })\n\n  test('my test', () => {\n    \u002F\u002F ...\n  })\n})\n","test\u002Fmy-test.spec.ts",[1039,5891,5892,5914,5936,5940,5963,5973,5978,5984,5988,6008,6012,6018],{"__ignoreMap":354},[1124,5893,5894,5896,5898,5900,5902,5904,5906,5908,5910,5912],{"class":1126,"line":1127},[1124,5895,1354],{"class":1276},[1124,5897,1357],{"class":1291},[1124,5899,5616],{"class":1287},[1124,5901,2003],{"class":1291},[1124,5903,1972],{"class":1287},[1124,5905,1363],{"class":1291},[1124,5907,1366],{"class":1276},[1124,5909,1369],{"class":1311},[1124,5911,1088],{"class":1133},[1124,5913,1375],{"class":1311},[1124,5915,5916,5918,5920,5922,5924,5926,5928,5930,5932,5934],{"class":1126,"line":1295},[1124,5917,1354],{"class":1276},[1124,5919,1357],{"class":1291},[1124,5921,5178],{"class":1287},[1124,5923,2003],{"class":1291},[1124,5925,5183],{"class":1287},[1124,5927,1363],{"class":1291},[1124,5929,1366],{"class":1276},[1124,5931,1369],{"class":1311},[1124,5933,5054],{"class":1133},[1124,5935,1375],{"class":1311},[1124,5937,5938],{"class":1126,"line":1308},[1124,5939,1401],{"emptyLinePlaceholder":1400},[1124,5941,5942,5944,5946,5948,5951,5953,5955,5957,5959,5961],{"class":1126,"line":1323},[1124,5943,5682],{"class":1283},[1124,5945,1288],{"class":1287},[1124,5947,1317],{"class":1311},[1124,5949,5950],{"class":1133},"My test",[1124,5952,1317],{"class":1311},[1124,5954,2003],{"class":1291},[1124,5956,2751],{"class":2009},[1124,5958,2006],{"class":1291},[1124,5960,2010],{"class":2009},[1124,5962,1423],{"class":1291},[1124,5964,5965,5967,5969,5971],{"class":1126,"line":1331},[1124,5966,3280],{"class":1276},[1124,5968,5183],{"class":1283},[1124,5970,1288],{"class":1298},[1124,5972,1292],{"class":1291},[1124,5974,5975],{"class":1126,"line":1426},[1124,5976,5977],{"class":1879},"    \u002F\u002F 测试上下文选项\n",[1124,5979,5980,5982],{"class":1126,"line":1436},[1124,5981,4558],{"class":1291},[1124,5983,1337],{"class":1298},[1124,5985,5986],{"class":1126,"line":1442},[1124,5987,1401],{"emptyLinePlaceholder":1400},[1124,5989,5990,5992,5994,5996,5998,6000,6002,6004,6006],{"class":1126,"line":1452},[1124,5991,1418],{"class":1283},[1124,5993,1288],{"class":1298},[1124,5995,1317],{"class":1311},[1124,5997,1998],{"class":1133},[1124,5999,1317],{"class":1311},[1124,6001,2003],{"class":1291},[1124,6003,2006],{"class":1291},[1124,6005,2010],{"class":2009},[1124,6007,1423],{"class":1291},[1124,6009,6010],{"class":1126,"line":1469},[1124,6011,4475],{"class":1879},[1124,6013,6014,6016],{"class":1126,"line":1492},[1124,6015,4558],{"class":1291},[1124,6017,1337],{"class":1298},[1124,6019,6020,6022],{"class":1126,"line":1509},[1124,6021,1334],{"class":1291},[1124,6023,1337],{"class":1287},[1027,6025,2559,6026,6029,6030,1089,6033,1089,6035,1079,6038,6041],{},[1039,6027,6028],{},"setup"," 会在 ",[1039,6031,6032],{},"beforeAll",[1039,6034,4234],{},[1039,6036,6037],{},"afterEach",[1039,6039,6040],{},"afterAll"," 中执行多项任务，以正确设置 Nuxt 测试环境。",[1027,6043,6044,6045,6047],{},"请使用以下 ",[1039,6046,6028],{}," 方法的选项。",[1785,6049,6051],{"id":6050},"nuxt-配置nuxt-config","Nuxt 配置（Nuxt Config）",[1070,6053,6054,6074],{},[1073,6055,6056,6059,6060],{},[1039,6057,6058],{},"rootDir","：包含待测试 Nuxt 应用的目录路径。\n",[1070,6061,6062,6068],{},[1073,6063,6064,6065],{},"类型：",[1039,6066,6067],{},"string",[1073,6069,6070,6071],{},"默认：",[1039,6072,6073],{},"'.'",[1073,6075,6076,6079,6080],{},[1039,6077,6078],{},"configFile","：配置文件的名称。\n",[1070,6081,6082,6086],{},[1073,6083,6064,6084],{},[1039,6085,6067],{},[1073,6087,6070,6088],{},[1039,6089,6090],{},"'nuxt.config'",[1785,6092,6094],{"id":6093},"计时timings","计时（Timings）",[1070,6096,6097,6123],{},[1073,6098,6099,6102,6103,6106,6107],{},[1039,6100,6101],{},"setupTimeout","：允许 ",[1039,6104,6105],{},"setupTest"," 完成其工作的时间量（以毫秒为单位）（这可能包括为 Nuxt 应用构建或生成文件，取决于传入的选项）。",[1070,6108,6109,6114],{},[1073,6110,6064,6111],{},[1039,6112,6113],{},"number",[1073,6115,6070,6116,6119,6120],{},[1039,6117,6118],{},"120000","，或在 Windows 上为 ",[1039,6121,6122],{},"240000",[1073,6124,6125,6128,6129],{},[1039,6126,6127],{},"teardownTimeout","：允许拆除测试环境的时间量（以毫秒为单位），例如关闭浏览器。",[1070,6130,6131,6135],{},[1073,6132,6064,6133],{},[1039,6134,6113],{},[1073,6136,6070,6137],{},[1039,6138,6139],{},"30000",[1785,6141,6143],{"id":6142},"特性features","特性（Features）",[1070,6145,6146,6176,6196,6214,6234,6256,6300],{},[1073,6147,6148,6150,6151],{},[1039,6149,5482],{},"：是否运行单独的构建步骤。\n",[1070,6152,6153,6158],{},[1073,6154,6064,6155],{},[1039,6156,6157],{},"boolean",[1073,6159,6070,6160,6162,6163,2348,6166,6168,6169,6172,6173,6175],{},[1039,6161,2382],{},"（如果禁用了 ",[1039,6164,6165],{},"browser",[1039,6167,150],{},"，或者提供了 ",[1039,6170,6171],{},"host","，则为 ",[1039,6174,2394],{},"）",[1073,6177,6178,6180,6181],{},[1039,6179,150],{},"：是否启动一个服务器来响应测试套件中的请求。\n",[1070,6182,6183,6187],{},[1073,6184,6064,6185],{},[1039,6186,6157],{},[1073,6188,6070,6189,6191,6192,6172,6194,6175],{},[1039,6190,2382],{},"（如果提供了 ",[1039,6193,6171],{},[1039,6195,2394],{},[1073,6197,6198,6201,6202],{},[1039,6199,6200],{},"port","：如果提供，将启动的测试服务器端口设为该值。\n",[1070,6203,6204,6209],{},[1073,6205,6064,6206],{},[1039,6207,6208],{},"number | undefined",[1073,6210,6070,6211],{},[1039,6212,6213],{},"undefined",[1073,6215,6216,6218,6219,6223,6224],{},[1039,6217,6171],{},"：如果提供，用作测试目标的 URL，而不是构建并运行一个新的服务器。适用于针对已部署版本（通常在与生产相同的环境中运行）或已运行的本地服务器运行「真实」的端到端测试（这可能会显著减少测试执行时间）。请参阅下面的 ",[1031,6220,6222],{"href":6221},"\u002Fdocs\u002Fgetting-started\u002Ftesting#target-host-end-to-end-example","目标 host 端到端示例","。\n",[1070,6225,6226,6230],{},[1073,6227,6064,6228],{},[1039,6229,6067],{},[1073,6231,6070,6232],{},[1039,6233,6213],{},[1073,6235,6236,6238,6239,6245,6246],{},[1039,6237,6165],{},"：在底层，Nuxt test utils 使用 ",[1031,6240,6243],{"href":6241,"rel":6242},"https:\u002F\u002Fplaywright.dev",[1050],[1039,6244,1098],{}," 执行浏览器测试。如果设置了此选项，将启动一个浏览器，并可在后续测试套件中控制它。\n",[1070,6247,6248,6252],{},[1073,6249,6064,6250],{},[1039,6251,6157],{},[1073,6253,6070,6254],{},[1039,6255,2394],{},[1073,6257,6258,6261],{},[1039,6259,6260],{},"browserOptions",[1070,6262,6263],{},[1073,6264,6265,6266,6269],{},"类型：包含以下属性的 ",[1039,6267,6268],{},"object",[1070,6270,6271,6286],{},[1073,6272,6273,6276,6277,1089,6280,2348,6283],{},[1039,6274,6275],{},"type","：要启动的浏览器类型 - ",[1039,6278,6279],{},"chromium",[1039,6281,6282],{},"firefox",[1039,6284,6285],{},"webkit",[1073,6287,6288,6291,6292,6294,6295,1739],{},[1039,6289,6290],{},"launch","：启动浏览器时传给 playwright 的选项 ",[1039,6293,6268],{},"。请参阅 ",[1031,6296,6299],{"href":6297,"rel":6298},"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fapi\u002Fclass-browsertype#browser-type-launch",[1050],"完整 API 参考",[1073,6301,6302,6305,6306,6223,6310],{},[1039,6303,6304],{},"runner","：指定测试套件的运行器。目前推荐 ",[1031,6307,5857],{"href":6308,"rel":6309},"https:\u002F\u002Fvitest.dev",[1050],[1070,6311,6312,6317],{},[1073,6313,6064,6314],{},[1039,6315,6316],{},"'vitest' | 'jest' | 'cucumber'",[1073,6318,6070,6319],{},[1039,6320,6321],{},"'vitest'",[2153,6323,6325,6326,6328,6329,6331],{"id":6324},"目标-host-端到端示例target-host-end-to-end-example","目标 ",[1039,6327,6171],{}," 端到端示例（Target ",[1039,6330,6171],{}," end-to-end example）",[1027,6333,6334],{},"端到端测试的一个常见用例是针对通常在生产环境中使用的同一环境中运行的已部署应用运行测试。",[1027,6336,6337],{},"对于本地开发或自动化部署流水线，针对一个独立的本地服务器进行测试可能更高效，并且通常比让测试框架在测试之间重建要快。",[1027,6339,6340,6341,6343,6344,6346],{},"要利用一个独立的目标 host 进行端到端测试，只需为 ",[1039,6342,6028],{}," 函数提供所需的 URL 的 ",[1039,6345,6171],{}," 属性。",[1115,6348,6350],{"className":1266,"code":6349,"language":1268,"meta":354,"style":354},"import { createPage, setup } from '@nuxt\u002Ftest-utils\u002Fe2e'\nimport { describe, expect, it } from 'vitest'\n\ndescribe('login page', async () => {\n  await setup({\n    host: 'http:\u002F\u002Flocalhost:8787',\n  })\n\n  it('displays the email and password fields', async () => {\n    const page = await createPage('\u002Flogin')\n    expect(await page.getByTestId('email').isVisible()).toBe(true)\n    expect(await page.getByTestId('password').isVisible()).toBe(true)\n  })\n})\n",[1039,6351,6352,6375,6401,6405,6428,6438,6454,6460,6464,6487,6511,6555,6596,6602],{"__ignoreMap":354},[1124,6353,6354,6356,6358,6361,6363,6365,6367,6369,6371,6373],{"class":1126,"line":1127},[1124,6355,1354],{"class":1276},[1124,6357,1357],{"class":1291},[1124,6359,6360],{"class":1287}," createPage",[1124,6362,2003],{"class":1291},[1124,6364,5183],{"class":1287},[1124,6366,1363],{"class":1291},[1124,6368,1366],{"class":1276},[1124,6370,1369],{"class":1311},[1124,6372,5054],{"class":1133},[1124,6374,1375],{"class":1311},[1124,6376,6377,6379,6381,6383,6385,6387,6389,6391,6393,6395,6397,6399],{"class":1126,"line":1295},[1124,6378,1354],{"class":1276},[1124,6380,1357],{"class":1291},[1124,6382,5616],{"class":1287},[1124,6384,2003],{"class":1291},[1124,6386,2598],{"class":1287},[1124,6388,2003],{"class":1291},[1124,6390,2603],{"class":1287},[1124,6392,1363],{"class":1291},[1124,6394,1366],{"class":1276},[1124,6396,1369],{"class":1311},[1124,6398,1088],{"class":1133},[1124,6400,1375],{"class":1311},[1124,6402,6403],{"class":1126,"line":1308},[1124,6404,1401],{"emptyLinePlaceholder":1400},[1124,6406,6407,6409,6411,6413,6416,6418,6420,6422,6424,6426],{"class":1126,"line":1323},[1124,6408,5682],{"class":1283},[1124,6410,1288],{"class":1287},[1124,6412,1317],{"class":1311},[1124,6414,6415],{"class":1133},"login page",[1124,6417,1317],{"class":1311},[1124,6419,2003],{"class":1291},[1124,6421,2751],{"class":2009},[1124,6423,2006],{"class":1291},[1124,6425,2010],{"class":2009},[1124,6427,1423],{"class":1291},[1124,6429,6430,6432,6434,6436],{"class":1126,"line":1331},[1124,6431,3280],{"class":1276},[1124,6433,5183],{"class":1283},[1124,6435,1288],{"class":1298},[1124,6437,1292],{"class":1291},[1124,6439,6440,6443,6445,6447,6450,6452],{"class":1126,"line":1426},[1124,6441,6442],{"class":1298},"    host",[1124,6444,1302],{"class":1291},[1124,6446,1369],{"class":1311},[1124,6448,6449],{"class":1133},"http:\u002F\u002Flocalhost:8787",[1124,6451,1317],{"class":1311},[1124,6453,1320],{"class":1291},[1124,6455,6456,6458],{"class":1126,"line":1436},[1124,6457,4558],{"class":1291},[1124,6459,1337],{"class":1298},[1124,6461,6462],{"class":1126,"line":1442},[1124,6463,1401],{"emptyLinePlaceholder":1400},[1124,6465,6466,6468,6470,6472,6475,6477,6479,6481,6483,6485],{"class":1126,"line":1452},[1124,6467,5704],{"class":1283},[1124,6469,1288],{"class":1298},[1124,6471,1317],{"class":1311},[1124,6473,6474],{"class":1133},"displays the email and password fields",[1124,6476,1317],{"class":1311},[1124,6478,2003],{"class":1291},[1124,6480,2751],{"class":2009},[1124,6482,2006],{"class":1291},[1124,6484,2010],{"class":2009},[1124,6486,1423],{"class":1291},[1124,6488,6489,6491,6494,6496,6498,6500,6502,6504,6507,6509],{"class":1126,"line":1469},[1124,6490,5726],{"class":2009},[1124,6492,6493],{"class":2668}," page",[1124,6495,2768],{"class":2672},[1124,6497,2771],{"class":1276},[1124,6499,6360],{"class":1283},[1124,6501,1288],{"class":1298},[1124,6503,1317],{"class":1311},[1124,6505,6506],{"class":1133},"\u002Flogin",[1124,6508,1317],{"class":1311},[1124,6510,1337],{"class":1298},[1124,6512,6513,6515,6517,6519,6521,6523,6526,6528,6530,6533,6535,6537,6539,6542,6544,6546,6549,6551,6553],{"class":1126,"line":1492},[1124,6514,5744],{"class":1283},[1124,6516,1288],{"class":1298},[1124,6518,5202],{"class":1276},[1124,6520,6493],{"class":1287},[1124,6522,2793],{"class":1291},[1124,6524,6525],{"class":1283},"getByTestId",[1124,6527,1288],{"class":1298},[1124,6529,1317],{"class":1311},[1124,6531,6532],{"class":1133},"email",[1124,6534,1317],{"class":1311},[1124,6536,1679],{"class":1298},[1124,6538,2793],{"class":1291},[1124,6540,6541],{"class":1283},"isVisible",[1124,6543,2799],{"class":1298},[1124,6545,2793],{"class":1291},[1124,6547,6548],{"class":1283},"toBe",[1124,6550,1288],{"class":1298},[1124,6552,2382],{"class":2497},[1124,6554,1337],{"class":1298},[1124,6556,6557,6559,6561,6563,6565,6567,6569,6571,6573,6576,6578,6580,6582,6584,6586,6588,6590,6592,6594],{"class":1126,"line":1509},[1124,6558,5744],{"class":1283},[1124,6560,1288],{"class":1298},[1124,6562,5202],{"class":1276},[1124,6564,6493],{"class":1287},[1124,6566,2793],{"class":1291},[1124,6568,6525],{"class":1283},[1124,6570,1288],{"class":1298},[1124,6572,1317],{"class":1311},[1124,6574,6575],{"class":1133},"password",[1124,6577,1317],{"class":1311},[1124,6579,1679],{"class":1298},[1124,6581,2793],{"class":1291},[1124,6583,6541],{"class":1283},[1124,6585,2799],{"class":1298},[1124,6587,2793],{"class":1291},[1124,6589,6548],{"class":1283},[1124,6591,1288],{"class":1298},[1124,6593,2382],{"class":2497},[1124,6595,1337],{"class":1298},[1124,6597,6598,6600],{"class":1126,"line":1515},[1124,6599,4558],{"class":1291},[1124,6601,1337],{"class":1298},[1124,6603,6604,6606],{"class":1126,"line":1521},[1124,6605,1334],{"class":1291},[1124,6607,1337],{"class":1287},[1246,6609,6611],{"id":6610},"api","API",[1785,6613,6615],{"id":6614},"fetchurl",[1039,6616,6617],{},"$fetch(url)",[1027,6619,6620],{},"获取服务端渲染页面的 HTML。",[1115,6622,6624],{"className":1266,"code":6623,"language":1268,"meta":1269,"style":354},"import { $fetch } from '@nuxt\u002Ftest-utils\u002Fe2e'\n\nconst html = await $fetch('\u002F')\n",[1039,6625,6626,6644,6648],{"__ignoreMap":354},[1124,6627,6628,6630,6632,6634,6636,6638,6640,6642],{"class":1126,"line":1127},[1124,6629,1354],{"class":1276},[1124,6631,1357],{"class":1291},[1124,6633,5178],{"class":1287},[1124,6635,1363],{"class":1291},[1124,6637,1366],{"class":1276},[1124,6639,1369],{"class":1311},[1124,6641,5054],{"class":1133},[1124,6643,1375],{"class":1311},[1124,6645,6646],{"class":1126,"line":1295},[1124,6647,1401],{"emptyLinePlaceholder":1400},[1124,6649,6650,6652,6654,6656,6658,6660,6662,6664,6666,6668],{"class":1126,"line":1308},[1124,6651,3967],{"class":2009},[1124,6653,3432],{"class":2668},[1124,6655,2768],{"class":2672},[1124,6657,2771],{"class":1276},[1124,6659,5178],{"class":1283},[1124,6661,1288],{"class":1287},[1124,6663,1317],{"class":1311},[1124,6665,3049],{"class":1133},[1124,6667,1317],{"class":1311},[1124,6669,1337],{"class":1287},[1785,6671,6673],{"id":6672},"fetchurl-1",[1039,6674,6675],{},"fetch(url)",[1027,6677,6678],{},"获取服务端渲染页面的响应。",[1115,6680,6682],{"className":1266,"code":6681,"language":1268,"meta":1269,"style":354},"import { fetch } from '@nuxt\u002Ftest-utils\u002Fe2e'\n\nconst res = await fetch('\u002F')\nconst { body, headers } = res\n",[1039,6683,6684,6703,6707,6730],{"__ignoreMap":354},[1124,6685,6686,6688,6690,6693,6695,6697,6699,6701],{"class":1126,"line":1127},[1124,6687,1354],{"class":1276},[1124,6689,1357],{"class":1291},[1124,6691,6692],{"class":1287}," fetch",[1124,6694,1363],{"class":1291},[1124,6696,1366],{"class":1276},[1124,6698,1369],{"class":1311},[1124,6700,5054],{"class":1133},[1124,6702,1375],{"class":1311},[1124,6704,6705],{"class":1126,"line":1295},[1124,6706,1401],{"emptyLinePlaceholder":1400},[1124,6708,6709,6711,6714,6716,6718,6720,6722,6724,6726,6728],{"class":1126,"line":1308},[1124,6710,3967],{"class":2009},[1124,6712,6713],{"class":2668}," res",[1124,6715,2768],{"class":2672},[1124,6717,2771],{"class":1276},[1124,6719,6692],{"class":1283},[1124,6721,1288],{"class":1287},[1124,6723,1317],{"class":1311},[1124,6725,3049],{"class":1133},[1124,6727,1317],{"class":1311},[1124,6729,1337],{"class":1287},[1124,6731,6732,6734,6736,6739,6741,6744,6746,6748],{"class":1126,"line":1323},[1124,6733,3967],{"class":2009},[1124,6735,1357],{"class":1291},[1124,6737,6738],{"class":2668}," body",[1124,6740,2003],{"class":1291},[1124,6742,6743],{"class":2668}," headers",[1124,6745,1363],{"class":1291},[1124,6747,2768],{"class":2672},[1124,6749,6750],{"class":1287}," res\n",[1785,6752,6754],{"id":6753},"urlpath",[1039,6755,6756],{},"url(path)",[1027,6758,6759],{},"获取给定页面的完整 URL（包括测试服务器运行的端口）。",[1115,6761,6763],{"className":1266,"code":6762,"language":1268,"meta":1269,"style":354},"import { url } from '@nuxt\u002Ftest-utils\u002Fe2e'\n\nconst pageUrl = url('\u002Fpage')\n\u002F\u002F 'http:\u002F\u002Flocalhost:6840\u002Fpage'\n",[1039,6764,6765,6784,6788,6810],{"__ignoreMap":354},[1124,6766,6767,6769,6771,6774,6776,6778,6780,6782],{"class":1126,"line":1127},[1124,6768,1354],{"class":1276},[1124,6770,1357],{"class":1291},[1124,6772,6773],{"class":1287}," url",[1124,6775,1363],{"class":1291},[1124,6777,1366],{"class":1276},[1124,6779,1369],{"class":1311},[1124,6781,5054],{"class":1133},[1124,6783,1375],{"class":1311},[1124,6785,6786],{"class":1126,"line":1295},[1124,6787,1401],{"emptyLinePlaceholder":1400},[1124,6789,6790,6792,6795,6797,6799,6801,6803,6806,6808],{"class":1126,"line":1308},[1124,6791,3967],{"class":2009},[1124,6793,6794],{"class":2668}," pageUrl",[1124,6796,2768],{"class":2672},[1124,6798,6773],{"class":1283},[1124,6800,1288],{"class":1287},[1124,6802,1317],{"class":1311},[1124,6804,6805],{"class":1133},"\u002Fpage",[1124,6807,1317],{"class":1311},[1124,6809,1337],{"class":1287},[1124,6811,6812],{"class":1126,"line":1323},[1124,6813,6814],{"class":1879},"\u002F\u002F 'http:\u002F\u002Flocalhost:6840\u002Fpage'\n",[1246,6816,6818],{"id":6817},"在浏览器中测试testing-in-a-browser","在浏览器中测试（Testing in a Browser）",[1027,6820,6821,6822,6824],{},"我们提供对使用 Playwright（在 ",[1039,6823,1041],{}," 内部）的内置支持，可以通过编程方式或通过 Playwright 测试运行器。",[1785,6826,6828],{"id":6827},"createpageurl",[1039,6829,6830],{},"createPage(url)",[1027,6832,6833,6834,1089,6836,2348,6838,6840,6841,6844,6845,6850],{},"在 ",[1039,6835,1088],{},[1039,6837,1095],{},[1039,6839,1092],{}," 中，你可以通过 ",[1039,6842,6843],{},"createPage"," 创建一个配置好的 Playwright 浏览器实例，并（可选地）将其指向运行中服务器的某个路径。你可以从 ",[1031,6846,6849],{"href":6847,"rel":6848},"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fapi\u002Fclass-page",[1050],"Playwright 文档"," 中了解更多可用的 API 方法。",[1115,6852,6854],{"className":1266,"code":6853,"language":1268,"meta":1269,"style":354},"import { createPage } from '@nuxt\u002Ftest-utils\u002Fe2e'\n\nconst page = await createPage('\u002Fpage')\n\u002F\u002F 你可以通过 `page` 变量访问所有 Playwright API\n",[1039,6855,6856,6874,6878,6900],{"__ignoreMap":354},[1124,6857,6858,6860,6862,6864,6866,6868,6870,6872],{"class":1126,"line":1127},[1124,6859,1354],{"class":1276},[1124,6861,1357],{"class":1291},[1124,6863,6360],{"class":1287},[1124,6865,1363],{"class":1291},[1124,6867,1366],{"class":1276},[1124,6869,1369],{"class":1311},[1124,6871,5054],{"class":1133},[1124,6873,1375],{"class":1311},[1124,6875,6876],{"class":1126,"line":1295},[1124,6877,1401],{"emptyLinePlaceholder":1400},[1124,6879,6880,6882,6884,6886,6888,6890,6892,6894,6896,6898],{"class":1126,"line":1308},[1124,6881,3967],{"class":2009},[1124,6883,6493],{"class":2668},[1124,6885,2768],{"class":2672},[1124,6887,2771],{"class":1276},[1124,6889,6360],{"class":1283},[1124,6891,1288],{"class":1287},[1124,6893,1317],{"class":1311},[1124,6895,6805],{"class":1133},[1124,6897,1317],{"class":1311},[1124,6899,1337],{"class":1287},[1124,6901,6902],{"class":1126,"line":1323},[1124,6903,6904],{"class":1879},"\u002F\u002F 你可以通过 `page` 变量访问所有 Playwright API\n",[1785,6906,6908],{"id":6907},"使用-playwright-测试运行器测试testing-with-playwright-test-runner","使用 Playwright 测试运行器测试（Testing with Playwright Test Runner）",[1027,6910,6911,6912,6917],{},"我们也提供在 ",[1031,6913,6916],{"href":6914,"rel":6915},"https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fintro",[1050],"Playwright 测试运行器"," 中测试 Nuxt 的一流支持。",[1111,6919,6920,6939,6956,6973,6990],{"sync":1113},[1115,6921,6923],{"className":1117,"code":6922,"filename":1119,"language":1120,"meta":354,"style":354},"npm i --save-dev @playwright\u002Ftest @nuxt\u002Ftest-utils\n",[1039,6924,6925],{"__ignoreMap":354},[1124,6926,6927,6929,6931,6933,6936],{"class":1126,"line":1127},[1124,6928,1119],{"class":1130},[1124,6930,1134],{"class":1133},[1124,6932,1138],{"class":1137},[1124,6934,6935],{"class":1133}," @playwright\u002Ftest",[1124,6937,6938],{"class":1133}," @nuxt\u002Ftest-utils\n",[1115,6940,6942],{"className":1117,"code":6941,"filename":1157,"language":1120,"meta":354,"style":354},"yarn add --dev @playwright\u002Ftest @nuxt\u002Ftest-utils\n",[1039,6943,6944],{"__ignoreMap":354},[1124,6945,6946,6948,6950,6952,6954],{"class":1126,"line":1127},[1124,6947,1157],{"class":1130},[1124,6949,1166],{"class":1133},[1124,6951,1169],{"class":1137},[1124,6953,6935],{"class":1133},[1124,6955,6938],{"class":1133},[1115,6957,6959],{"className":1117,"code":6958,"filename":1183,"language":1120,"meta":354,"style":354},"pnpm add -D @playwright\u002Ftest @nuxt\u002Ftest-utils\n",[1039,6960,6961],{"__ignoreMap":354},[1124,6962,6963,6965,6967,6969,6971],{"class":1126,"line":1127},[1124,6964,1183],{"class":1130},[1124,6966,1166],{"class":1133},[1124,6968,1194],{"class":1137},[1124,6970,6935],{"class":1133},[1124,6972,6938],{"class":1133},[1115,6974,6976],{"className":1117,"code":6975,"filename":1208,"language":1120,"meta":354,"style":354},"bun add --dev @playwright\u002Ftest @nuxt\u002Ftest-utils\n",[1039,6977,6978],{"__ignoreMap":354},[1124,6979,6980,6982,6984,6986,6988],{"class":1126,"line":1127},[1124,6981,1208],{"class":1130},[1124,6983,1166],{"class":1133},[1124,6985,1169],{"class":1137},[1124,6987,6935],{"class":1133},[1124,6989,6938],{"class":1133},[1115,6991,6994],{"className":1117,"code":6992,"filename":6993,"language":1120,"meta":354,"style":354},"deno add --dev npm:@playwright\u002Ftest npm:@nuxt\u002Ftest-utils\n","deno",[1039,6995,6996],{"__ignoreMap":354},[1124,6997,6998,7000,7002,7004,7007],{"class":1126,"line":1127},[1124,6999,6993],{"class":1130},[1124,7001,1166],{"class":1133},[1124,7003,1169],{"class":1137},[1124,7005,7006],{"class":1133}," npm:@playwright\u002Ftest",[1124,7008,7009],{"class":1133}," npm:@nuxt\u002Ftest-utils\n",[1027,7011,7012,7013,7016],{},"你可以提供全局 Nuxt 配置，其配置细节与本节前面提到的 ",[1039,7014,7015],{},"setup()"," 函数相同。",[1115,7018,7021],{"className":1266,"code":7019,"filename":7020,"language":1268,"meta":354,"style":354},"import { fileURLToPath } from 'node:url'\nimport { defineConfig, devices } from '@playwright\u002Ftest'\nimport type { ConfigOptions } from '@nuxt\u002Ftest-utils\u002Fplaywright'\n\nexport default defineConfig\u003CConfigOptions>({\n  use: {\n    nuxt: {\n      rootDir: fileURLToPath(new URL('.', import.meta.url)),\n    },\n  },\n  \u002F\u002F ...\n})\n","playwright.config.ts",[1039,7022,7023,7041,7064,7086,7090,7109,7118,7127,7168,7172,7176,7181],{"__ignoreMap":354},[1124,7024,7025,7027,7029,7031,7033,7035,7037,7039],{"class":1126,"line":1127},[1124,7026,1354],{"class":1276},[1124,7028,1357],{"class":1291},[1124,7030,1824],{"class":1287},[1124,7032,1363],{"class":1291},[1124,7034,1366],{"class":1276},[1124,7036,1369],{"class":1311},[1124,7038,1833],{"class":1133},[1124,7040,1375],{"class":1311},[1124,7042,7043,7045,7047,7049,7051,7054,7056,7058,7060,7062],{"class":1126,"line":1295},[1124,7044,1354],{"class":1276},[1124,7046,1357],{"class":1291},[1124,7048,1360],{"class":1287},[1124,7050,2003],{"class":1291},[1124,7052,7053],{"class":1287}," devices",[1124,7055,1363],{"class":1291},[1124,7057,1366],{"class":1276},[1124,7059,1369],{"class":1311},[1124,7061,1105],{"class":1133},[1124,7063,1375],{"class":1311},[1124,7065,7066,7068,7070,7072,7075,7077,7079,7081,7084],{"class":1126,"line":1308},[1124,7067,1354],{"class":1276},[1124,7069,2620],{"class":1276},[1124,7071,1357],{"class":1291},[1124,7073,7074],{"class":1287}," ConfigOptions",[1124,7076,1363],{"class":1291},[1124,7078,1366],{"class":1276},[1124,7080,1369],{"class":1311},[1124,7082,7083],{"class":1133},"@nuxt\u002Ftest-utils\u002Fplaywright",[1124,7085,1375],{"class":1311},[1124,7087,7088],{"class":1126,"line":1323},[1124,7089,1401],{"emptyLinePlaceholder":1400},[1124,7091,7092,7094,7096,7098,7100,7103,7105,7107],{"class":1126,"line":1331},[1124,7093,1277],{"class":1276},[1124,7095,1280],{"class":1276},[1124,7097,1360],{"class":1283},[1124,7099,3683],{"class":1291},[1124,7101,7102],{"class":1130},"ConfigOptions",[1124,7104,3692],{"class":1291},[1124,7106,1288],{"class":1287},[1124,7108,1292],{"class":1291},[1124,7110,7111,7114,7116],{"class":1126,"line":1426},[1124,7112,7113],{"class":1298},"  use",[1124,7115,1302],{"class":1291},[1124,7117,1423],{"class":1291},[1124,7119,7120,7123,7125],{"class":1126,"line":1436},[1124,7121,7122],{"class":1298},"    nuxt",[1124,7124,1302],{"class":1291},[1124,7126,1423],{"class":1291},[1124,7128,7129,7132,7134,7136,7138,7141,7144,7146,7148,7150,7152,7154,7156,7158,7161,7163,7166],{"class":1126,"line":1442},[1124,7130,7131],{"class":1298},"      rootDir",[1124,7133,1302],{"class":1291},[1124,7135,1824],{"class":1283},[1124,7137,1288],{"class":1287},[1124,7139,7140],{"class":2672},"new",[1124,7142,7143],{"class":1283}," URL",[1124,7145,1288],{"class":1287},[1124,7147,1317],{"class":1311},[1124,7149,2793],{"class":1133},[1124,7151,1317],{"class":1311},[1124,7153,2003],{"class":1291},[1124,7155,4596],{"class":1276},[1124,7157,2793],{"class":1291},[1124,7159,7160],{"class":2668},"meta",[1124,7162,2793],{"class":1291},[1124,7164,7165],{"class":1287},"url))",[1124,7167,1320],{"class":1291},[1124,7169,7170],{"class":1126,"line":1452},[1124,7171,2232],{"class":1291},[1124,7173,7174],{"class":1126,"line":1469},[1124,7175,1695],{"class":1291},[1124,7177,7178],{"class":1126,"line":1492},[1124,7179,7180],{"class":1879},"  \u002F\u002F ...\n",[1124,7182,7183,7185],{"class":1126,"line":1509},[1124,7184,1334],{"class":1291},[1124,7186,1337],{"class":1287},[7188,7189],"read-more",{"target":7190,"title":7191,"to":7192},"_blank","查看完整示例配置","https:\u002F\u002Fgithub.com\u002Fnuxt\u002Ftest-utils\u002Fblob\u002Fmain\u002Fexamples\u002Fapp-playwright\u002Fplaywright.config.ts",[1027,7194,7195,7196,7198,7199,1079,7202,1344],{},"你的测试文件随后应直接从 ",[1039,7197,7083],{}," 使用 ",[1039,7200,7201],{},"expect",[1039,7203,1991],{},[1115,7205,7208],{"className":1266,"code":7206,"filename":7207,"language":1268,"meta":354,"style":354},"import { expect, test } from '@nuxt\u002Ftest-utils\u002Fplaywright'\n\ntest('test', async ({ page, goto }) => {\n  await goto('\u002F', { waitUntil: 'hydration' })\n  await expect(page.getByRole('heading')).toHaveText('Welcome to Playwright!')\n})\n","tests\u002Fexample.test.ts",[1039,7209,7210,7232,7236,7269,7303,7346],{"__ignoreMap":354},[1124,7211,7212,7214,7216,7218,7220,7222,7224,7226,7228,7230],{"class":1126,"line":1127},[1124,7213,1354],{"class":1276},[1124,7215,1357],{"class":1291},[1124,7217,2598],{"class":1287},[1124,7219,2003],{"class":1291},[1124,7221,1972],{"class":1287},[1124,7223,1363],{"class":1291},[1124,7225,1366],{"class":1276},[1124,7227,1369],{"class":1311},[1124,7229,7083],{"class":1133},[1124,7231,1375],{"class":1311},[1124,7233,7234],{"class":1126,"line":1295},[1124,7235,1401],{"emptyLinePlaceholder":1400},[1124,7237,7238,7240,7242,7244,7246,7248,7250,7252,7255,7257,7259,7262,7265,7267],{"class":1126,"line":1308},[1124,7239,1991],{"class":1283},[1124,7241,1288],{"class":1287},[1124,7243,1317],{"class":1311},[1124,7245,1991],{"class":1133},[1124,7247,1317],{"class":1311},[1124,7249,2003],{"class":1291},[1124,7251,2751],{"class":2009},[1124,7253,7254],{"class":1291}," ({",[1124,7256,6493],{"class":3708},[1124,7258,2003],{"class":1291},[1124,7260,7261],{"class":3708}," goto",[1124,7263,7264],{"class":1291}," })",[1124,7266,2010],{"class":2009},[1124,7268,1423],{"class":1291},[1124,7270,7271,7273,7275,7277,7279,7281,7283,7285,7287,7290,7292,7294,7297,7299,7301],{"class":1126,"line":1323},[1124,7272,3280],{"class":1276},[1124,7274,7261],{"class":1276},[1124,7276,1288],{"class":1298},[1124,7278,1317],{"class":1311},[1124,7280,3049],{"class":1133},[1124,7282,1317],{"class":1311},[1124,7284,2003],{"class":1291},[1124,7286,1357],{"class":1291},[1124,7288,7289],{"class":1298}," waitUntil",[1124,7291,1302],{"class":1291},[1124,7293,1369],{"class":1311},[1124,7295,7296],{"class":1133},"hydration",[1124,7298,1317],{"class":1311},[1124,7300,1363],{"class":1291},[1124,7302,1337],{"class":1298},[1124,7304,7305,7307,7309,7311,7314,7316,7319,7321,7323,7326,7328,7330,7332,7335,7337,7339,7342,7344],{"class":1126,"line":1331},[1124,7306,3280],{"class":1276},[1124,7308,2598],{"class":1283},[1124,7310,1288],{"class":1298},[1124,7312,7313],{"class":1287},"page",[1124,7315,2793],{"class":1291},[1124,7317,7318],{"class":1283},"getByRole",[1124,7320,1288],{"class":1298},[1124,7322,1317],{"class":1311},[1124,7324,7325],{"class":1133},"heading",[1124,7327,1317],{"class":1311},[1124,7329,3313],{"class":1298},[1124,7331,2793],{"class":1291},[1124,7333,7334],{"class":1283},"toHaveText",[1124,7336,1288],{"class":1298},[1124,7338,1317],{"class":1311},[1124,7340,7341],{"class":1133},"Welcome to Playwright!",[1124,7343,1317],{"class":1311},[1124,7345,1337],{"class":1298},[1124,7347,7348,7350],{"class":1126,"line":1426},[1124,7349,1334],{"class":1291},[1124,7351,1337],{"class":1287},[1027,7353,7354],{},"你也可以直接在测试文件中配置你的 Nuxt 服务器：",[1115,7356,7358],{"className":1266,"code":7357,"filename":7207,"language":1268,"meta":354,"style":354},"import { expect, test } from '@nuxt\u002Ftest-utils\u002Fplaywright'\n\ntest.use({\n  nuxt: {\n    rootDir: fileURLToPath(new URL('..', import.meta.url)),\n  },\n})\n\ntest('test', async ({ page, goto }) => {\n  await goto('\u002F', { waitUntil: 'hydration' })\n  await expect(page.getByRole('heading')).toHaveText('Welcome to Playwright!')\n})\n",[1039,7359,7360,7382,7386,7399,7408,7446,7450,7456,7460,7490,7522,7560],{"__ignoreMap":354},[1124,7361,7362,7364,7366,7368,7370,7372,7374,7376,7378,7380],{"class":1126,"line":1127},[1124,7363,1354],{"class":1276},[1124,7365,1357],{"class":1291},[1124,7367,2598],{"class":1287},[1124,7369,2003],{"class":1291},[1124,7371,1972],{"class":1287},[1124,7373,1363],{"class":1291},[1124,7375,1366],{"class":1276},[1124,7377,1369],{"class":1311},[1124,7379,7083],{"class":1133},[1124,7381,1375],{"class":1311},[1124,7383,7384],{"class":1126,"line":1295},[1124,7385,1401],{"emptyLinePlaceholder":1400},[1124,7387,7388,7390,7392,7395,7397],{"class":1126,"line":1308},[1124,7389,1991],{"class":1287},[1124,7391,2793],{"class":1291},[1124,7393,7394],{"class":1283},"use",[1124,7396,1288],{"class":1287},[1124,7398,1292],{"class":1291},[1124,7400,7401,7404,7406],{"class":1126,"line":1323},[1124,7402,7403],{"class":1298},"  nuxt",[1124,7405,1302],{"class":1291},[1124,7407,1423],{"class":1291},[1124,7409,7410,7413,7415,7417,7419,7421,7423,7425,7427,7430,7432,7434,7436,7438,7440,7442,7444],{"class":1126,"line":1331},[1124,7411,7412],{"class":1298},"    rootDir",[1124,7414,1302],{"class":1291},[1124,7416,1824],{"class":1283},[1124,7418,1288],{"class":1287},[1124,7420,7140],{"class":2672},[1124,7422,7143],{"class":1283},[1124,7424,1288],{"class":1287},[1124,7426,1317],{"class":1311},[1124,7428,7429],{"class":1133},"..",[1124,7431,1317],{"class":1311},[1124,7433,2003],{"class":1291},[1124,7435,4596],{"class":1276},[1124,7437,2793],{"class":1291},[1124,7439,7160],{"class":2668},[1124,7441,2793],{"class":1291},[1124,7443,7165],{"class":1287},[1124,7445,1320],{"class":1291},[1124,7447,7448],{"class":1126,"line":1426},[1124,7449,1695],{"class":1291},[1124,7451,7452,7454],{"class":1126,"line":1436},[1124,7453,1334],{"class":1291},[1124,7455,1337],{"class":1287},[1124,7457,7458],{"class":1126,"line":1442},[1124,7459,1401],{"emptyLinePlaceholder":1400},[1124,7461,7462,7464,7466,7468,7470,7472,7474,7476,7478,7480,7482,7484,7486,7488],{"class":1126,"line":1452},[1124,7463,1991],{"class":1283},[1124,7465,1288],{"class":1287},[1124,7467,1317],{"class":1311},[1124,7469,1991],{"class":1133},[1124,7471,1317],{"class":1311},[1124,7473,2003],{"class":1291},[1124,7475,2751],{"class":2009},[1124,7477,7254],{"class":1291},[1124,7479,6493],{"class":3708},[1124,7481,2003],{"class":1291},[1124,7483,7261],{"class":3708},[1124,7485,7264],{"class":1291},[1124,7487,2010],{"class":2009},[1124,7489,1423],{"class":1291},[1124,7491,7492,7494,7496,7498,7500,7502,7504,7506,7508,7510,7512,7514,7516,7518,7520],{"class":1126,"line":1469},[1124,7493,3280],{"class":1276},[1124,7495,7261],{"class":1276},[1124,7497,1288],{"class":1298},[1124,7499,1317],{"class":1311},[1124,7501,3049],{"class":1133},[1124,7503,1317],{"class":1311},[1124,7505,2003],{"class":1291},[1124,7507,1357],{"class":1291},[1124,7509,7289],{"class":1298},[1124,7511,1302],{"class":1291},[1124,7513,1369],{"class":1311},[1124,7515,7296],{"class":1133},[1124,7517,1317],{"class":1311},[1124,7519,1363],{"class":1291},[1124,7521,1337],{"class":1298},[1124,7523,7524,7526,7528,7530,7532,7534,7536,7538,7540,7542,7544,7546,7548,7550,7552,7554,7556,7558],{"class":1126,"line":1492},[1124,7525,3280],{"class":1276},[1124,7527,2598],{"class":1283},[1124,7529,1288],{"class":1298},[1124,7531,7313],{"class":1287},[1124,7533,2793],{"class":1291},[1124,7535,7318],{"class":1283},[1124,7537,1288],{"class":1298},[1124,7539,1317],{"class":1311},[1124,7541,7325],{"class":1133},[1124,7543,1317],{"class":1311},[1124,7545,3313],{"class":1298},[1124,7547,2793],{"class":1291},[1124,7549,7334],{"class":1283},[1124,7551,1288],{"class":1298},[1124,7553,1317],{"class":1311},[1124,7555,7341],{"class":1133},[1124,7557,1317],{"class":1311},[1124,7559,1337],{"class":1298},[1124,7561,7562,7564],{"class":1126,"line":1509},[1124,7563,1334],{"class":1291},[1124,7565,1337],{"class":1287},[7567,7568,7569],"style",{},"html pre.shiki code .sJK67, html code.shiki .sJK67{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .s-Aze, html code.shiki .s-Aze{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .supr-, html code.shiki .supr-{--shiki-light:#91B859;--shiki-default:#79B8FF;--shiki-dark:#C3E88D}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 .srJn9, html code.shiki .srJn9{--shiki-light:#6182B8;--shiki-default:#B392F0;--shiki-dark:#82AAFF}html pre.shiki code .smVNa, html code.shiki .smVNa{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#BABED8}html pre.shiki code .sF54B, html code.shiki .sF54B{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}html pre.shiki code .sOtFm, html code.shiki .sOtFm{--shiki-light:#E53935;--shiki-default:#E1E4E8;--shiki-dark:#F07178}html pre.shiki code .s0jeK, html code.shiki .s0jeK{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--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 pre.shiki code .sV7Px, html code.shiki .sV7Px{--shiki-light:#9C3EDA;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .si1Qm, html code.shiki .si1Qm{--shiki-light:#FF5370;--shiki-default:#79B8FF;--shiki-dark:#FF9CAC}html pre.shiki code .sJTDI, html code.shiki .sJTDI{--shiki-light:#90A4AE;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sXPRQ, html code.shiki .sXPRQ{--shiki-light:#39ADB5;--shiki-default:#F97583;--shiki-dark:#89DDFF}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 .syA7L, html code.shiki .syA7L{--shiki-light:#E53935;--shiki-default:#B392F0;--shiki-dark:#F07178}html pre.shiki code .sOUxV, html code.shiki .sOUxV{--shiki-light:#F76D47;--shiki-default:#79B8FF;--shiki-dark:#F78C6C}html pre.shiki code .s0q4w, html code.shiki .s0q4w{--shiki-light:#39ADB5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .sS9nB, html code.shiki .sS9nB{--shiki-light:#9C3EDA;--shiki-default:#79B8FF;--shiki-dark:#C792EA}html pre.shiki code .soRC5, html code.shiki .soRC5{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:inherit}html pre.shiki code .s6g6u, html code.shiki .s6g6u{--shiki-light:#E53935;--shiki-default:#85E89D;--shiki-dark:#F07178}",{"title":354,"searchDepth":1308,"depth":1308,"links":7571},[7572,7573,7597],{"id":1061,"depth":1295,"text":1062},{"id":1231,"depth":1295,"text":1232,"children":7574},[7575,7576,7579,7583,7587,7595],{"id":1248,"depth":1308,"text":1249},{"id":1751,"depth":1308,"text":1752,"children":7577},[7578],{"id":1787,"depth":1323,"text":1788},{"id":2036,"depth":1308,"text":2037,"children":7580},[7581,7582],{"id":2118,"depth":1323,"text":2119},{"id":2255,"depth":1323,"text":2256},{"id":2364,"depth":1308,"text":2365,"children":7584},[7585,7586],{"id":2373,"depth":1323,"text":2376},{"id":2386,"depth":1323,"text":2389},{"id":2536,"depth":1308,"text":2537,"children":7588},[7589,7590,7591,7592,7593,7594],{"id":2545,"depth":1323,"text":2548},{"id":3053,"depth":1323,"text":3056},{"id":3533,"depth":1323,"text":3536},{"id":4371,"depth":1323,"text":4374},{"id":4806,"depth":1323,"text":4809},{"id":5046,"depth":1323,"text":5047},{"id":5238,"depth":1308,"text":7596},"使用 @vue\u002Ftest-utils",{"id":5848,"depth":1295,"text":5849,"children":7598},[7599,7604,7609],{"id":5876,"depth":1308,"text":1249,"children":7600},[7601,7602,7603],{"id":6050,"depth":1323,"text":6051},{"id":6093,"depth":1323,"text":6094},{"id":6142,"depth":1323,"text":6143},{"id":6610,"depth":1308,"text":6611,"children":7605},[7606,7607,7608],{"id":6614,"depth":1323,"text":6617},{"id":6672,"depth":1323,"text":6675},{"id":6753,"depth":1323,"text":6756},{"id":6817,"depth":1308,"text":6818,"children":7610},[7611,7612],{"id":6827,"depth":1323,"text":6830},{"id":6907,"depth":1323,"text":6908},"md",{},"[object Object]",{"title":70,"description":71},"docs\u002F1.getting-started\u002F17.testing","dWCyXOi9zUb02l6RHW5MsVd39fvZqnhH7pa_TANOSNM",1785179852551]