[{"data":1,"prerenderedAt":3087},["ShallowReactive",2],{"docs-all-flat":3,"docs-\u002Fdocs\u002Fguide\u002Fconcepts\u002Fesm":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":218,"body":1020,"description":219,"extension":3081,"meta":3082,"navigation":3083,"path":217,"seo":3084,"stem":3085,"__hash__":3086},"docs\u002Fdocs\u002F3.guide\u002F1.concepts\u002F7.esm.md",{"type":1021,"value":1022,"toc":3063},"minimark",[1023,1027,1031,1036,1047,1126,1129,1133,1141,1183,1202,1206,1209,1212,1295,1298,1320,1329,1354,1361,1365,1390,1396,1405,1430,1434,1451,1457,1637,1640,1881,1885,1893,1896,1903,1968,1971,1974,1977,2034,2037,2046,2095,2101,2148,2166,2202,2205,2241,2244,2279,2282,2375,2384,2456,2459,2462,2495,2498,2507,2605,2706,2727,2860,2966,2969,2992,3059],[1024,1025,1026],"p",{},"本指南帮助解释什么是 ES 模块，以及如何让你的 Nuxt 应用（或上游库）兼容 ESM。",[1028,1029,1030],"h2",{"id":1030},"背景",[1032,1033,1035],"h3",{"id":1034},"commonjs-模块","CommonJS 模块",[1024,1037,1038,1039,1046],{},"CommonJS（CJS）是 Node.js 引入的一种格式，允许在相互隔离的 JavaScript 模块之间共享功能（",[1040,1041,1045],"a",{"href":1042,"rel":1043},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fmodules.html",[1044],"nofollow","了解更多","）。\n你可能已经熟悉这种语法：",[1048,1049,1053],"pre",{"className":1050,"code":1051,"language":1052,"meta":354,"style":354},"language-js shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","const a = require('.\u002Fa')\n\nmodule.exports.a = a\n","js",[1054,1055,1056,1094,1101],"code",{"__ignoreMap":354},[1057,1058,1061,1065,1069,1073,1077,1081,1085,1089,1091],"span",{"class":1059,"line":1060},"line",1,[1057,1062,1064],{"class":1063},"sV7Px","const",[1057,1066,1068],{"class":1067},"sJTDI"," a",[1057,1070,1072],{"class":1071},"sXPRQ"," =",[1057,1074,1076],{"class":1075},"srJn9"," require",[1057,1078,1080],{"class":1079},"smVNa","(",[1057,1082,1084],{"class":1083},"s0jeK","'",[1057,1086,1088],{"class":1087},"s-Aze",".\u002Fa",[1057,1090,1084],{"class":1083},[1057,1092,1093],{"class":1079},")\n",[1057,1095,1097],{"class":1059,"line":1096},2,[1057,1098,1100],{"emptyLinePlaceholder":1099},true,"\n",[1057,1102,1104,1108,1112,1115,1117,1120,1123],{"class":1059,"line":1103},3,[1057,1105,1107],{"class":1106},"s0q4w","module",[1057,1109,1111],{"class":1110},"sF54B",".",[1057,1113,1114],{"class":1106},"exports",[1057,1116,1111],{"class":1110},[1057,1118,1119],{"class":1079},"a ",[1057,1121,1122],{"class":1071},"=",[1057,1124,1125],{"class":1079}," a\n",[1024,1127,1128],{},"像 webpack 和 Rollup 这样的打包工具支持这种语法，并允许你在浏览器中使用用 CommonJS 编写的模块。",[1032,1130,1132],{"id":1131},"esm-语法","ESM 语法",[1024,1134,1135,1136,1140],{},"大多数时候，当人们谈论 ESM 与 CJS 时，他们指的是编写",[1040,1137,214],{"href":1138,"rel":1139},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FGuide\u002FModules",[1044],"的不同语法。",[1048,1142,1144],{"className":1050,"code":1143,"language":1052,"meta":354,"style":354},"import a from '.\u002Fa'\n\nexport { a }\n",[1054,1145,1146,1166,1170],{"__ignoreMap":354},[1057,1147,1148,1152,1155,1158,1161,1163],{"class":1059,"line":1060},[1057,1149,1151],{"class":1150},"szyBz","import",[1057,1153,1154],{"class":1079}," a ",[1057,1156,1157],{"class":1150},"from",[1057,1159,1160],{"class":1083}," '",[1057,1162,1088],{"class":1087},[1057,1164,1165],{"class":1083},"'\n",[1057,1167,1168],{"class":1059,"line":1096},[1057,1169,1100],{"emptyLinePlaceholder":1099},[1057,1171,1172,1175,1178,1180],{"class":1059,"line":1103},[1057,1173,1174],{"class":1150},"export",[1057,1176,1177],{"class":1110}," {",[1057,1179,1068],{"class":1079},[1057,1181,1182],{"class":1110}," }\n",[1024,1184,1185,1186,1191,1192,1195,1196,1201],{},"在 ECMAScript 模块（ESM）成为标准（花了 10 多年！）之前，像 ",[1040,1187,1190],{"href":1188,"rel":1189},"https:\u002F\u002Fwebpack.js.org\u002Fguides\u002Fecma-script-modules\u002F",[1044],"webpack"," 这样的工具，甚至 TypeScript 这样的语言，都已经开始支持所谓的 ",[1193,1194,1132],"strong",{},"。\n不过，它与实际的规范有一些关键差异；这里有一个",[1040,1197,1200],{"href":1198,"rel":1199},"https:\u002F\u002Fhacks.mozilla.org\u002F2018\u002F03\u002Fes-modules-a-cartoon-deep-dive\u002F",[1044],"有帮助的讲解","。",[1032,1203,1205],{"id":1204},"什么是原生esm","什么是「原生」ESM？",[1024,1207,1208],{},"你可能已经使用 ESM 语法编写应用很久了。毕竟它原生受浏览器支持，而在 Nuxt 2 中，我们把你编写的所有代码编译成合适的格式（服务端用 CJS，浏览器用 ESM）。",[1024,1210,1211],{},"当你向包中添加模块时，情况略有不同。某个示例库可能会同时暴露 CJS 和 ESM 版本，让我们自行选择想要哪一个：",[1048,1213,1217],{"className":1214,"code":1215,"language":1216,"meta":354,"style":354},"language-json shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","{\n  \"name\": \"sample-library\",\n  \"main\": \"dist\u002Fsample-library.cjs.js\",\n  \"module\": \"dist\u002Fsample-library.esm.js\"\n}\n","json",[1054,1218,1219,1224,1250,1270,1289],{"__ignoreMap":354},[1057,1220,1221],{"class":1059,"line":1060},[1057,1222,1223],{"class":1110},"{\n",[1057,1225,1226,1229,1233,1236,1239,1242,1245,1247],{"class":1059,"line":1096},[1057,1227,1228],{"class":1106},"  \"",[1057,1230,1232],{"class":1231},"sS9nB","name",[1057,1234,1235],{"class":1106},"\"",[1057,1237,1238],{"class":1110},":",[1057,1240,1241],{"class":1083}," \"",[1057,1243,1244],{"class":1087},"sample-library",[1057,1246,1235],{"class":1083},[1057,1248,1249],{"class":1110},",\n",[1057,1251,1252,1254,1257,1259,1261,1263,1266,1268],{"class":1059,"line":1103},[1057,1253,1228],{"class":1106},[1057,1255,1256],{"class":1231},"main",[1057,1258,1235],{"class":1106},[1057,1260,1238],{"class":1110},[1057,1262,1241],{"class":1083},[1057,1264,1265],{"class":1087},"dist\u002Fsample-library.cjs.js",[1057,1267,1235],{"class":1083},[1057,1269,1249],{"class":1110},[1057,1271,1273,1275,1277,1279,1281,1283,1286],{"class":1059,"line":1272},4,[1057,1274,1228],{"class":1106},[1057,1276,1107],{"class":1231},[1057,1278,1235],{"class":1106},[1057,1280,1238],{"class":1110},[1057,1282,1241],{"class":1083},[1057,1284,1285],{"class":1087},"dist\u002Fsample-library.esm.js",[1057,1287,1288],{"class":1083},"\"\n",[1057,1290,1292],{"class":1059,"line":1291},5,[1057,1293,1294],{"class":1110},"}\n",[1024,1296,1297],{},"因此在 Nuxt 2 中，打包工具（webpack）会为服务端构建引入 CJS 文件（'main'），为客户端构建使用 ESM 文件（'module'）。",[1299,1300,1301],"note",{},[1024,1302,1303,1305,1306,1312,1313,1319],{},[1054,1304,1107],{}," 字段是 webpack、Rollup 之类的打包工具使用的约定，但 Node.js 本身并不识别。Node.js 只使用 ",[1040,1307,1310],{"href":1308,"rel":1309},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fpackages.html#exports",[1044],[1054,1311,1114],{}," 和 ",[1040,1314,1317],{"href":1315,"rel":1316},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fpackages.html#main",[1044],[1054,1318,1256],{}," 字段来进行模块解析。",[1024,1321,1322,1323,1328],{},"不过，在最近的 Node.js LTS 版本中，现在已经可以在 Node.js 中",[1040,1324,1327],{"href":1325,"rel":1326},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fesm.html",[1044],"使用原生 ESM 模块","。这意味着 Node.js 自身可以处理使用 ESM 语法的 JavaScript，尽管默认情况下它并不这样做。启用 ESM 语法最常见的两种方式是：",[1330,1331,1332,1347],"ul",{},[1333,1334,1335,1336,1338,1339,1342,1343,1346],"li",{},"在 ",[1054,1337,178],{}," 中设置 ",[1054,1340,1341],{},"\"type\": \"module\"","，并继续使用 ",[1054,1344,1345],{},".js"," 扩展名",[1333,1348,1349,1350,1353],{},"使用 ",[1054,1351,1352],{},".mjs"," 文件扩展名（推荐）",[1024,1355,1356,1357,1360],{},"这也是我们对 Nuxt Nitro 所做的；我们输出了一个 ",[1054,1358,1359],{},".output\u002Fserver\u002Findex.mjs"," 文件。这告诉 Node.js 将此文件视为原生 ES 模块。",[1032,1362,1364],{"id":1363},"在-nodejs-上下文中哪些导入是有效的","在 Node.js 上下文中哪些导入是有效的？",[1024,1366,1367,1368,1370,1371,1374,1375,1377,1378,1380,1381,1383,1384,1386,1387,1389],{},"当你 ",[1054,1369,1151],{}," 一个模块而不是 ",[1054,1372,1373],{},"require"," 它时，Node.js 的解析方式不同。例如，当你导入 ",[1054,1376,1244],{}," 时，Node.js 会在该库的 ",[1054,1379,178],{}," 中查找 ",[1054,1382,1114],{}," 条目，如果未定义 ",[1054,1385,1114],{}," 则回退到 ",[1054,1388,1256],{}," 条目。",[1024,1391,1392,1393,1201],{},"对于动态导入也是如此，例如 ",[1054,1394,1395],{},"const b = await import('sample-library')",[1024,1397,1398,1399,1404],{},"Node 支持以下几种导入（参见",[1040,1400,1403],{"href":1401,"rel":1402},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fpackages.html#determining-module-system",[1044],"文档","）：",[1406,1407,1408,1414,1420],"ol",{},[1333,1409,1410,1411,1413],{},"以 ",[1054,1412,1352],{}," 结尾的文件 - 预期使用 ESM 语法",[1333,1415,1410,1416,1419],{},[1054,1417,1418],{},".cjs"," 结尾的文件 - 预期使用 CJS 语法",[1333,1421,1410,1422,1424,1425,1427,1428],{},[1054,1423,1345],{}," 结尾的文件 - 预期使用 CJS 语法，除非它们的 ",[1054,1426,178],{}," 设置了 ",[1054,1429,1341],{},[1032,1431,1433],{"id":1432},"可能会出现哪些问题","可能会出现哪些问题？",[1024,1435,1436,1437,1440,1441,1444,1445,1447,1448,1450],{},"长期以来，模块作者一直在产出 ESM 语法的构建产物，但使用诸如 ",[1054,1438,1439],{},".esm.js"," 或 ",[1054,1442,1443],{},".es.js"," 这样的约定，并将它们添加到 ",[1054,1446,178],{}," 的 ",[1054,1449,1107],{}," 字段中。这之前一直不是问题，因为它们只被 webpack 之类的打包工具使用，而打包工具并不特别关心文件扩展名。",[1024,1452,1453,1454,1456],{},"然而，如果你尝试在 Node.js 的 ESM 上下文中导入一个带有 ",[1054,1455,1439],{}," 文件的包，它将无法工作，你会得到类似这样的错误：",[1048,1458,1463],{"className":1459,"code":1460,"filename":1461,"language":1462,"meta":354,"style":354},"language-bash shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","(node:22145) Warning: To load an ES module, set \"type\": \"module\" in the package.json or use the .mjs extension.\n\u002Fpath\u002Fto\u002Findex.js:1\n\nexport default {}\n^^^^^^\n\nSyntaxError: Unexpected token 'export'\n    at wrapSafe (internal\u002Fmodules\u002Fcjs\u002Floader.js:1001:16)\n    at Module._compile (internal\u002Fmodules\u002Fcjs\u002Floader.js:1049:27)\n    at Object.Module._extensions..js (internal\u002Fmodules\u002Fcjs\u002Floader.js:1114:10)\n    ....\n    at async Object.loadESM (internal\u002Fprocess\u002Fesm_loader.js:68:5)\n","Terminal","bash",[1054,1464,1465,1535,1540,1544,1554,1559,1564,1582,1594,1605,1616,1623],{"__ignoreMap":354},[1057,1466,1467,1469,1473,1476,1479,1482,1485,1488,1491,1494,1497,1499,1502,1504,1506,1508,1510,1512,1515,1518,1521,1524,1527,1529,1532],{"class":1059,"line":1060},[1057,1468,1080],{"class":1110},[1057,1470,1472],{"class":1471},"sJK67","node:22145",[1057,1474,1475],{"class":1110},")",[1057,1477,1478],{"class":1471}," Warning:",[1057,1480,1481],{"class":1087}," To",[1057,1483,1484],{"class":1087}," load",[1057,1486,1487],{"class":1087}," an",[1057,1489,1490],{"class":1087}," ES",[1057,1492,1493],{"class":1087}," module,",[1057,1495,1496],{"class":1087}," set",[1057,1498,1241],{"class":1083},[1057,1500,1501],{"class":1087},"type",[1057,1503,1235],{"class":1083},[1057,1505,1238],{"class":1087},[1057,1507,1241],{"class":1083},[1057,1509,1107],{"class":1087},[1057,1511,1235],{"class":1083},[1057,1513,1514],{"class":1087}," in",[1057,1516,1517],{"class":1087}," the",[1057,1519,1520],{"class":1087}," package.json",[1057,1522,1523],{"class":1087}," or",[1057,1525,1526],{"class":1087}," use",[1057,1528,1517],{"class":1087},[1057,1530,1531],{"class":1087}," .mjs",[1057,1533,1534],{"class":1087}," extension.\n",[1057,1536,1537],{"class":1059,"line":1096},[1057,1538,1539],{"class":1471},"\u002Fpath\u002Fto\u002Findex.js:1\n",[1057,1541,1542],{"class":1059,"line":1103},[1057,1543,1100],{"emptyLinePlaceholder":1099},[1057,1545,1546,1548,1551],{"class":1059,"line":1272},[1057,1547,1174],{"class":1063},[1057,1549,1550],{"class":1079}," default ",[1057,1552,1553],{"class":1110},"{}\n",[1057,1555,1556],{"class":1059,"line":1291},[1057,1557,1558],{"class":1471},"^^^^^^\n",[1057,1560,1562],{"class":1059,"line":1561},6,[1057,1563,1100],{"emptyLinePlaceholder":1099},[1057,1565,1567,1570,1573,1576,1578,1580],{"class":1059,"line":1566},7,[1057,1568,1569],{"class":1471},"SyntaxError:",[1057,1571,1572],{"class":1087}," Unexpected",[1057,1574,1575],{"class":1087}," token",[1057,1577,1160],{"class":1083},[1057,1579,1174],{"class":1087},[1057,1581,1165],{"class":1083},[1057,1583,1585,1588,1591],{"class":1059,"line":1584},8,[1057,1586,1587],{"class":1471},"    at",[1057,1589,1590],{"class":1087}," wrapSafe",[1057,1592,1593],{"class":1079}," (internal\u002Fmodules\u002Fcjs\u002Floader.js:1001:16)\n",[1057,1595,1597,1599,1602],{"class":1059,"line":1596},9,[1057,1598,1587],{"class":1471},[1057,1600,1601],{"class":1087}," Module._compile",[1057,1603,1604],{"class":1079}," (internal\u002Fmodules\u002Fcjs\u002Floader.js:1049:27)\n",[1057,1606,1608,1610,1613],{"class":1059,"line":1607},10,[1057,1609,1587],{"class":1471},[1057,1611,1612],{"class":1087}," Object.Module._extensions..js",[1057,1614,1615],{"class":1079}," (internal\u002Fmodules\u002Fcjs\u002Floader.js:1114:10)\n",[1057,1617,1619],{"class":1059,"line":1618},11,[1057,1620,1622],{"class":1621},"scsZY","    ....\n",[1057,1624,1626,1628,1631,1634],{"class":1059,"line":1625},12,[1057,1627,1587],{"class":1471},[1057,1629,1630],{"class":1087}," async",[1057,1632,1633],{"class":1087}," Object.loadESM",[1057,1635,1636],{"class":1079}," (internal\u002Fprocess\u002Fesm_loader.js:68:5)\n",[1024,1638,1639],{},"如果你从一个 Node.js 认为是 CJS 的 ESM 语法构建产物中做具名导入，你也可能会得到这个错误：",[1048,1641,1643],{"className":1459,"code":1642,"filename":1461,"language":1462,"meta":354,"style":354},"file:\u002F\u002F\u002Fpath\u002Fto\u002Findex.mjs:5\nimport { named } from 'sample-library'\n         ^^^^^\nSyntaxError: Named export 'named' not found. The requested module 'sample-library' is a CommonJS module, which may not support all module.exports as named exports.\n\nCommonJS modules can always be imported via the default export, for example using:\n\nimport pkg from 'sample-library';\nconst { named } = pkg;\n\n    at ModuleJob._instantiate (internal\u002Fmodules\u002Fesm\u002Fmodule_job.js:120:21)\n    at async ModuleJob.run (internal\u002Fmodules\u002Fesm\u002Fmodule_job.js:165:5)\n    at async Loader.import (internal\u002Fesm\u002Floader.js:177:24)\n    at async Object.loadESM (internal\u002Fprocess\u002Fesm_loader.js:68:5)\n",[1054,1644,1645,1650,1671,1676,1749,1753,1793,1797,1815,1831,1835,1845,1857,1870],{"__ignoreMap":354},[1057,1646,1647],{"class":1059,"line":1060},[1057,1648,1649],{"class":1471},"file:\u002F\u002F\u002Fpath\u002Fto\u002Findex.mjs:5\n",[1057,1651,1652,1654,1656,1659,1662,1665,1667,1669],{"class":1059,"line":1096},[1057,1653,1151],{"class":1471},[1057,1655,1177],{"class":1087},[1057,1657,1658],{"class":1087}," named",[1057,1660,1661],{"class":1087}," }",[1057,1663,1664],{"class":1087}," from",[1057,1666,1160],{"class":1083},[1057,1668,1244],{"class":1087},[1057,1670,1165],{"class":1083},[1057,1672,1673],{"class":1059,"line":1103},[1057,1674,1675],{"class":1471},"         ^^^^^\n",[1057,1677,1678,1680,1683,1686,1688,1691,1693,1696,1699,1702,1705,1708,1710,1712,1714,1717,1719,1722,1724,1727,1730,1732,1735,1738,1741,1744,1746],{"class":1059,"line":1272},[1057,1679,1569],{"class":1471},[1057,1681,1682],{"class":1087}," Named",[1057,1684,1685],{"class":1087}," export",[1057,1687,1160],{"class":1083},[1057,1689,1690],{"class":1087},"named",[1057,1692,1084],{"class":1083},[1057,1694,1695],{"class":1087}," not",[1057,1697,1698],{"class":1087}," found.",[1057,1700,1701],{"class":1087}," The",[1057,1703,1704],{"class":1087}," requested",[1057,1706,1707],{"class":1087}," module",[1057,1709,1160],{"class":1083},[1057,1711,1244],{"class":1087},[1057,1713,1084],{"class":1083},[1057,1715,1716],{"class":1087}," is",[1057,1718,1068],{"class":1087},[1057,1720,1721],{"class":1087}," CommonJS",[1057,1723,1493],{"class":1087},[1057,1725,1726],{"class":1087}," which",[1057,1728,1729],{"class":1087}," may",[1057,1731,1695],{"class":1087},[1057,1733,1734],{"class":1087}," support",[1057,1736,1737],{"class":1087}," all",[1057,1739,1740],{"class":1087}," module.exports",[1057,1742,1743],{"class":1087}," as",[1057,1745,1658],{"class":1087},[1057,1747,1748],{"class":1087}," exports.\n",[1057,1750,1751],{"class":1059,"line":1291},[1057,1752,1100],{"emptyLinePlaceholder":1099},[1057,1754,1755,1758,1761,1764,1767,1770,1773,1776,1778,1781,1784,1787,1790],{"class":1059,"line":1561},[1057,1756,1757],{"class":1471},"CommonJS",[1057,1759,1760],{"class":1087}," modules",[1057,1762,1763],{"class":1087}," can",[1057,1765,1766],{"class":1087}," always",[1057,1768,1769],{"class":1087}," be",[1057,1771,1772],{"class":1087}," imported",[1057,1774,1775],{"class":1087}," via",[1057,1777,1517],{"class":1087},[1057,1779,1780],{"class":1087}," default",[1057,1782,1783],{"class":1087}," export,",[1057,1785,1786],{"class":1087}," for",[1057,1788,1789],{"class":1087}," example",[1057,1791,1792],{"class":1087}," using:\n",[1057,1794,1795],{"class":1059,"line":1566},[1057,1796,1100],{"emptyLinePlaceholder":1099},[1057,1798,1799,1801,1804,1806,1808,1810,1812],{"class":1059,"line":1584},[1057,1800,1151],{"class":1471},[1057,1802,1803],{"class":1087}," pkg",[1057,1805,1664],{"class":1087},[1057,1807,1160],{"class":1083},[1057,1809,1244],{"class":1087},[1057,1811,1084],{"class":1083},[1057,1813,1814],{"class":1110},";\n",[1057,1816,1817,1819,1821,1823,1825,1827,1829],{"class":1059,"line":1596},[1057,1818,1064],{"class":1471},[1057,1820,1177],{"class":1087},[1057,1822,1658],{"class":1087},[1057,1824,1661],{"class":1087},[1057,1826,1072],{"class":1087},[1057,1828,1803],{"class":1087},[1057,1830,1814],{"class":1110},[1057,1832,1833],{"class":1059,"line":1607},[1057,1834,1100],{"emptyLinePlaceholder":1099},[1057,1836,1837,1839,1842],{"class":1059,"line":1618},[1057,1838,1587],{"class":1471},[1057,1840,1841],{"class":1087}," ModuleJob._instantiate",[1057,1843,1844],{"class":1079}," (internal\u002Fmodules\u002Fesm\u002Fmodule_job.js:120:21)\n",[1057,1846,1847,1849,1851,1854],{"class":1059,"line":1625},[1057,1848,1587],{"class":1471},[1057,1850,1630],{"class":1087},[1057,1852,1853],{"class":1087}," ModuleJob.run",[1057,1855,1856],{"class":1079}," (internal\u002Fmodules\u002Fesm\u002Fmodule_job.js:165:5)\n",[1057,1858,1860,1862,1864,1867],{"class":1059,"line":1859},13,[1057,1861,1587],{"class":1471},[1057,1863,1630],{"class":1087},[1057,1865,1866],{"class":1087}," Loader.import",[1057,1868,1869],{"class":1079}," (internal\u002Fesm\u002Floader.js:177:24)\n",[1057,1871,1873,1875,1877,1879],{"class":1059,"line":1872},14,[1057,1874,1587],{"class":1471},[1057,1876,1630],{"class":1087},[1057,1878,1633],{"class":1087},[1057,1880,1636],{"class":1079},[1028,1882,1884],{"id":1883},"排查-esm-问题","排查 ESM 问题",[1024,1886,1887,1888,1892],{},"如果你遇到了这些错误，问题几乎肯定出在上游库。它们需要",[1040,1889,1891],{"href":1890},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fesm#library-author-guide","修复自己的库"," 以支持被 Node 导入。",[1032,1894,1895],{"id":1895},"转译库",[1024,1897,1898,1899,1902],{},"在此期间，你可以通过将这些库添加到 ",[1054,1900,1901],{},"build.transpile","，告诉 Nuxt 不要尝试导入它们：",[1048,1904,1909],{"className":1905,"code":1906,"language":1907,"meta":1908,"style":354},"language-ts shiki shiki-themes material-theme-lighter github-dark material-theme-palenight","export default defineNuxtConfig({\n  build: {\n    transpile: ['sample-library'],\n  },\n})\n","ts","twoslash",[1054,1910,1911,1924,1935,1956,1961],{"__ignoreMap":354},[1057,1912,1913,1915,1917,1920,1922],{"class":1059,"line":1060},[1057,1914,1174],{"class":1150},[1057,1916,1780],{"class":1150},[1057,1918,1919],{"class":1075}," defineNuxtConfig",[1057,1921,1080],{"class":1079},[1057,1923,1223],{"class":1110},[1057,1925,1926,1930,1932],{"class":1059,"line":1096},[1057,1927,1929],{"class":1928},"sOtFm","  build",[1057,1931,1238],{"class":1110},[1057,1933,1934],{"class":1110}," {\n",[1057,1936,1937,1940,1942,1945,1947,1949,1951,1954],{"class":1059,"line":1103},[1057,1938,1939],{"class":1928},"    transpile",[1057,1941,1238],{"class":1110},[1057,1943,1944],{"class":1079}," [",[1057,1946,1084],{"class":1083},[1057,1948,1244],{"class":1087},[1057,1950,1084],{"class":1083},[1057,1952,1953],{"class":1079},"]",[1057,1955,1249],{"class":1110},[1057,1957,1958],{"class":1059,"line":1272},[1057,1959,1960],{"class":1110},"  },\n",[1057,1962,1963,1966],{"class":1059,"line":1291},[1057,1964,1965],{"class":1110},"}",[1057,1967,1093],{"class":1079},[1024,1969,1970],{},"你可能会发现你_还_需要添加这些库所导入的其他包。",[1032,1972,1973],{"id":1973},"为库设置别名",[1024,1975,1976],{},"在某些情况下，你可能还需要手动将库别名到 CJS 版本，例如：",[1048,1978,1980],{"className":1905,"code":1979,"language":1907,"meta":1908,"style":354},"export default defineNuxtConfig({\n  alias: {\n    'sample-library': 'sample-library\u002Fdist\u002Fsample-library.cjs.js',\n  },\n})\n",[1054,1981,1982,1994,2003,2024,2028],{"__ignoreMap":354},[1057,1983,1984,1986,1988,1990,1992],{"class":1059,"line":1060},[1057,1985,1174],{"class":1150},[1057,1987,1780],{"class":1150},[1057,1989,1919],{"class":1075},[1057,1991,1080],{"class":1079},[1057,1993,1223],{"class":1110},[1057,1995,1996,1999,2001],{"class":1059,"line":1096},[1057,1997,1998],{"class":1928},"  alias",[1057,2000,1238],{"class":1110},[1057,2002,1934],{"class":1110},[1057,2004,2005,2008,2011,2013,2015,2017,2020,2022],{"class":1059,"line":1103},[1057,2006,2007],{"class":1083},"    '",[1057,2009,1244],{"class":2010},"sSD0A",[1057,2012,1084],{"class":1083},[1057,2014,1238],{"class":1110},[1057,2016,1160],{"class":1083},[1057,2018,2019],{"class":1087},"sample-library\u002Fdist\u002Fsample-library.cjs.js",[1057,2021,1084],{"class":1083},[1057,2023,1249],{"class":1110},[1057,2025,2026],{"class":1059,"line":1272},[1057,2027,1960],{"class":1110},[1057,2029,2030,2032],{"class":1059,"line":1291},[1057,2031,1965],{"class":1110},[1057,2033,1093],{"class":1079},[1032,2035,2036],{"id":2036},"默认导出",[1024,2038,2039,2040,1440,2043,2045],{},"CommonJS 格式的依赖，可以使用 ",[1054,2041,2042],{},"module.exports",[1054,2044,1114],{}," 来提供默认导出：",[1048,2047,2050],{"className":1050,"code":2048,"filename":2049,"language":1052,"meta":354,"style":354},"module.exports = { test: 123 }\n\u002F\u002F 或\nexports.test = 123\n","node_modules\u002Fcjs-pkg\u002Findex.js",[1054,2051,2052,2075,2081],{"__ignoreMap":354},[1057,2053,2054,2056,2058,2060,2062,2064,2067,2069,2073],{"class":1059,"line":1060},[1057,2055,1107],{"class":1106},[1057,2057,1111],{"class":1110},[1057,2059,1114],{"class":1106},[1057,2061,1072],{"class":1071},[1057,2063,1177],{"class":1110},[1057,2065,2066],{"class":1928}," test",[1057,2068,1238],{"class":1110},[1057,2070,2072],{"class":2071},"sOUxV"," 123",[1057,2074,1182],{"class":1110},[1057,2076,2077],{"class":1059,"line":1096},[1057,2078,2080],{"class":2079},"sZqJ9","\u002F\u002F 或\n",[1057,2082,2083,2085,2087,2090,2092],{"class":1059,"line":1103},[1057,2084,1114],{"class":1106},[1057,2086,1111],{"class":1110},[1057,2088,2089],{"class":1079},"test ",[1057,2091,1122],{"class":1071},[1057,2093,2094],{"class":2071}," 123\n",[1024,2096,2097,2098,2100],{},"如果我们 ",[1054,2099,1373],{}," 这样的依赖，这通常能正常工作：",[1048,2102,2105],{"className":1050,"code":2103,"filename":2104,"language":1052,"meta":354,"style":354},"const pkg = require('cjs-pkg')\n\nconsole.log(pkg) \u002F\u002F { test: 123 }\n","test.cjs",[1054,2106,2107,2128,2132],{"__ignoreMap":354},[1057,2108,2109,2111,2113,2115,2117,2119,2121,2124,2126],{"class":1059,"line":1060},[1057,2110,1064],{"class":1063},[1057,2112,1803],{"class":1067},[1057,2114,1072],{"class":1071},[1057,2116,1076],{"class":1075},[1057,2118,1080],{"class":1079},[1057,2120,1084],{"class":1083},[1057,2122,2123],{"class":1087},"cjs-pkg",[1057,2125,1084],{"class":1083},[1057,2127,1093],{"class":1079},[1057,2129,2130],{"class":1059,"line":1096},[1057,2131,1100],{"emptyLinePlaceholder":1099},[1057,2133,2134,2137,2139,2142,2145],{"class":1059,"line":1103},[1057,2135,2136],{"class":1079},"console",[1057,2138,1111],{"class":1110},[1057,2140,2141],{"class":1075},"log",[1057,2143,2144],{"class":1079},"(pkg) ",[1057,2146,2147],{"class":2079},"\u002F\u002F { test: 123 }\n",[1024,2149,2150,2155,2156,2165],{},[1040,2151,2154],{"href":2152,"rel":2153},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fesm.html#interoperability-with-commonjs",[1044],"原生 ESM 模式下的 Node.js","、",[1040,2157,2160,2161,2164],{"href":2158,"rel":2159},"https:\u002F\u002Fwww.typescriptlang.org\u002Ftsconfig\u002F#esModuleInterop",[1044],"启用了 ",[1054,2162,2163],{},"esModuleInterop"," 的 TypeScript"," 以及 webpack 之类的打包工具，都提供了一种兼容机制，让我们可以默认导入这样的库。\n这种机制通常被称为「interop require default」（互操作默认导入）：",[1048,2167,2169],{"className":1050,"code":2168,"language":1052,"meta":354,"style":354},"import pkg from 'cjs-pkg'\n\nconsole.log(pkg) \u002F\u002F { test: 123 }\n",[1054,2170,2171,2186,2190],{"__ignoreMap":354},[1057,2172,2173,2175,2178,2180,2182,2184],{"class":1059,"line":1060},[1057,2174,1151],{"class":1150},[1057,2176,2177],{"class":1079}," pkg ",[1057,2179,1157],{"class":1150},[1057,2181,1160],{"class":1083},[1057,2183,2123],{"class":1087},[1057,2185,1165],{"class":1083},[1057,2187,2188],{"class":1059,"line":1096},[1057,2189,1100],{"emptyLinePlaceholder":1099},[1057,2191,2192,2194,2196,2198,2200],{"class":1059,"line":1103},[1057,2193,2136],{"class":1079},[1057,2195,1111],{"class":1110},[1057,2197,2141],{"class":1075},[1057,2199,2144],{"class":1079},[1057,2201,2147],{"class":2079},[1024,2203,2204],{},"然而，由于语法检测的复杂性和不同的打包格式，互操作默认导入总有可能失败，最终得到类似这样的结果：",[1048,2206,2208],{"className":1050,"code":2207,"language":1052,"meta":354,"style":354},"import pkg from 'cjs-pkg'\n\nconsole.log(pkg) \u002F\u002F { default: { test: 123 } }\n",[1054,2209,2210,2224,2228],{"__ignoreMap":354},[1057,2211,2212,2214,2216,2218,2220,2222],{"class":1059,"line":1060},[1057,2213,1151],{"class":1150},[1057,2215,2177],{"class":1079},[1057,2217,1157],{"class":1150},[1057,2219,1160],{"class":1083},[1057,2221,2123],{"class":1087},[1057,2223,1165],{"class":1083},[1057,2225,2226],{"class":1059,"line":1096},[1057,2227,1100],{"emptyLinePlaceholder":1099},[1057,2229,2230,2232,2234,2236,2238],{"class":1059,"line":1103},[1057,2231,2136],{"class":1079},[1057,2233,1111],{"class":1110},[1057,2235,2141],{"class":1075},[1057,2237,2144],{"class":1079},[1057,2239,2240],{"class":2079},"\u002F\u002F { default: { test: 123 } }\n",[1024,2242,2243],{},"同样，在使用动态导入语法（在 CJS 和 ESM 文件中都是如此）时，我们总是会遇到这种情况：",[1048,2245,2247],{"className":1050,"code":2246,"language":1052,"meta":354,"style":354},"import('cjs-pkg').then(console.log) \u002F\u002F [Module: null prototype] { default: { test: '123' } }\n",[1054,2248,2249],{"__ignoreMap":354},[1057,2250,2251,2253,2255,2257,2259,2261,2263,2265,2268,2271,2273,2276],{"class":1059,"line":1060},[1057,2252,1151],{"class":1071},[1057,2254,1080],{"class":1079},[1057,2256,1084],{"class":1083},[1057,2258,2123],{"class":1087},[1057,2260,1084],{"class":1083},[1057,2262,1475],{"class":1079},[1057,2264,1111],{"class":1110},[1057,2266,2267],{"class":1075},"then",[1057,2269,2270],{"class":1079},"(console",[1057,2272,1111],{"class":1110},[1057,2274,2275],{"class":1079},"log) ",[1057,2277,2278],{"class":2079},"\u002F\u002F [Module: null prototype] { default: { test: '123' } }\n",[1024,2280,2281],{},"在这种情况下，我们需要手动进行默认导出互操作：",[1048,2283,2285],{"className":1050,"code":2284,"language":1052,"meta":354,"style":354},"\u002F\u002F 静态导入\nimport { default as pkg } from 'cjs-pkg'\n\n\u002F\u002F 动态导入\nimport('cjs-pkg').then(m => m.default || m).then(console.log)\n",[1054,2286,2287,2292,2314,2318,2323],{"__ignoreMap":354},[1057,2288,2289],{"class":1059,"line":1060},[1057,2290,2291],{"class":2079},"\u002F\u002F 静态导入\n",[1057,2293,2294,2296,2298,2300,2302,2304,2306,2308,2310,2312],{"class":1059,"line":1096},[1057,2295,1151],{"class":1150},[1057,2297,1177],{"class":1110},[1057,2299,1780],{"class":1150},[1057,2301,1743],{"class":1150},[1057,2303,1803],{"class":1079},[1057,2305,1661],{"class":1110},[1057,2307,1664],{"class":1150},[1057,2309,1160],{"class":1083},[1057,2311,2123],{"class":1087},[1057,2313,1165],{"class":1083},[1057,2315,2316],{"class":1059,"line":1103},[1057,2317,1100],{"emptyLinePlaceholder":1099},[1057,2319,2320],{"class":1059,"line":1272},[1057,2321,2322],{"class":2079},"\u002F\u002F 动态导入\n",[1057,2324,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343,2347,2350,2353,2355,2358,2361,2364,2366,2368,2370,2372],{"class":1059,"line":1291},[1057,2326,1151],{"class":1071},[1057,2328,1080],{"class":1079},[1057,2330,1084],{"class":1083},[1057,2332,2123],{"class":1087},[1057,2334,1084],{"class":1083},[1057,2336,1475],{"class":1079},[1057,2338,1111],{"class":1110},[1057,2340,2267],{"class":1075},[1057,2342,1080],{"class":1079},[1057,2344,2346],{"class":2345},"ssIVr","m",[1057,2348,2349],{"class":1063}," =>",[1057,2351,2352],{"class":1079}," m",[1057,2354,1111],{"class":1110},[1057,2356,2357],{"class":1079},"default ",[1057,2359,2360],{"class":1071},"||",[1057,2362,2363],{"class":1079}," m)",[1057,2365,1111],{"class":1110},[1057,2367,2267],{"class":1075},[1057,2369,2270],{"class":1079},[1057,2371,1111],{"class":1110},[1057,2373,2374],{"class":1079},"log)\n",[1024,2376,2377,2378,2383],{},"为了处理更复杂的情况并增加安全性，我们推荐并在 Nuxt 内部使用 ",[1040,2379,2382],{"href":2380,"rel":2381},"https:\u002F\u002Fgithub.com\u002Funjs\u002Fmlly",[1044],"mlly","，它可以保留具名导出。",[1048,2385,2387],{"className":1050,"code":2386,"language":1052,"meta":354,"style":354},"import { interopDefault } from 'mlly'\n\n\u002F\u002F 假设形状为 { default: { foo: 'bar' }, baz: 'qux' }\nimport myModule from 'my-module'\n\nconsole.log(interopDefault(myModule)) \u002F\u002F { foo: 'bar', baz: 'qux' }\n",[1054,2388,2389,2408,2412,2417,2433,2437],{"__ignoreMap":354},[1057,2390,2391,2393,2395,2398,2400,2402,2404,2406],{"class":1059,"line":1060},[1057,2392,1151],{"class":1150},[1057,2394,1177],{"class":1110},[1057,2396,2397],{"class":1079}," interopDefault",[1057,2399,1661],{"class":1110},[1057,2401,1664],{"class":1150},[1057,2403,1160],{"class":1083},[1057,2405,2382],{"class":1087},[1057,2407,1165],{"class":1083},[1057,2409,2410],{"class":1059,"line":1096},[1057,2411,1100],{"emptyLinePlaceholder":1099},[1057,2413,2414],{"class":1059,"line":1103},[1057,2415,2416],{"class":2079},"\u002F\u002F 假设形状为 { default: { foo: 'bar' }, baz: 'qux' }\n",[1057,2418,2419,2421,2424,2426,2428,2431],{"class":1059,"line":1272},[1057,2420,1151],{"class":1150},[1057,2422,2423],{"class":1079}," myModule ",[1057,2425,1157],{"class":1150},[1057,2427,1160],{"class":1083},[1057,2429,2430],{"class":1087},"my-module",[1057,2432,1165],{"class":1083},[1057,2434,2435],{"class":1059,"line":1291},[1057,2436,1100],{"emptyLinePlaceholder":1099},[1057,2438,2439,2441,2443,2445,2447,2450,2453],{"class":1059,"line":1561},[1057,2440,2136],{"class":1079},[1057,2442,1111],{"class":1110},[1057,2444,2141],{"class":1075},[1057,2446,1080],{"class":1079},[1057,2448,2449],{"class":1075},"interopDefault",[1057,2451,2452],{"class":1079},"(myModule)) ",[1057,2454,2455],{"class":2079},"\u002F\u002F { foo: 'bar', baz: 'qux' }\n",[1028,2457,2458],{"id":2458},"库作者指南",[1024,2460,2461],{},"好消息是，修复 ESM 兼容性问题相对简单。主要有两种选择：",[1406,2463,2464,2482],{},[1333,2465,2466,2472,2475,2479,2480,2471],{},[1193,2467,2468,2469,2471],{},"你可以将 ESM 文件重命名，使其以 ",[1054,2470,1352],{}," 结尾。",[2473,2474],"br",{},[2476,2477,2478],"em",{},"这是推荐且最简单的方法。"," 你可能需要解决与库依赖相关的一些问题，可能还有你的构建系统，但在大多数情况下，这应该能为你解决这个问题。为了最大的明确性，也建议把你的 CJS 文件重命名以 ",[1054,2481,1418],{},[1333,2483,2484,2487,2489,2490,1338,2492,2494],{},[1193,2485,2486],{},"你可以选择让你的整个库只支持 ESM。",[2473,2488],{},"这意味着在你的 ",[1054,2491,178],{},[1054,2493,1341],{},"，并确保你构建出的库使用 ESM 语法。不过，你可能会遇到依赖相关的问题——而且这种方法意味着你的库_只能_在 ESM 上下文中被使用。",[1032,2496,2497],{"id":2497},"迁移",[1024,2499,2500,2501,2503,2504,2506],{},"从 CJS 迁移到 ESM 的第一步，是更新任何 ",[1054,2502,1373],{}," 的用法，改为使用 ",[1054,2505,1151],{},"：",[2508,2509,2510,2561],"code-group",{},[1048,2511,2514],{"className":1905,"code":2512,"filename":2513,"language":1907,"meta":354,"style":354},"module.exports = function () { \u002F* ... *\u002F }\n\nexports.hello = 'world'\n","Before",[1054,2515,2516,2539,2543],{"__ignoreMap":354},[1057,2517,2518,2520,2522,2524,2526,2529,2532,2534,2537],{"class":1059,"line":1060},[1057,2519,1107],{"class":1106},[1057,2521,1111],{"class":1110},[1057,2523,1114],{"class":1106},[1057,2525,1072],{"class":1071},[1057,2527,2528],{"class":1063}," function",[1057,2530,2531],{"class":1110}," ()",[1057,2533,1177],{"class":1110},[1057,2535,2536],{"class":2079}," \u002F* ... *\u002F",[1057,2538,1182],{"class":1110},[1057,2540,2541],{"class":1059,"line":1096},[1057,2542,1100],{"emptyLinePlaceholder":1099},[1057,2544,2545,2547,2549,2552,2554,2556,2559],{"class":1059,"line":1103},[1057,2546,1114],{"class":1106},[1057,2548,1111],{"class":1110},[1057,2550,2551],{"class":1079},"hello ",[1057,2553,1122],{"class":1071},[1057,2555,1160],{"class":1083},[1057,2557,2558],{"class":1087},"world",[1057,2560,1165],{"class":1083},[1048,2562,2565],{"className":1905,"code":2563,"filename":2564,"language":1907,"meta":354,"style":354},"export default function () { \u002F* ... *\u002F }\n\nexport const hello = 'world'\n","After",[1054,2566,2567,2583,2587],{"__ignoreMap":354},[1057,2568,2569,2571,2573,2575,2577,2579,2581],{"class":1059,"line":1060},[1057,2570,1174],{"class":1150},[1057,2572,1780],{"class":1150},[1057,2574,2528],{"class":1063},[1057,2576,2531],{"class":1110},[1057,2578,1177],{"class":1110},[1057,2580,2536],{"class":2079},[1057,2582,1182],{"class":1110},[1057,2584,2585],{"class":1059,"line":1096},[1057,2586,1100],{"emptyLinePlaceholder":1099},[1057,2588,2589,2591,2594,2597,2599,2601,2603],{"class":1059,"line":1103},[1057,2590,1174],{"class":1150},[1057,2592,2593],{"class":1063}," const",[1057,2595,2596],{"class":1067}," hello",[1057,2598,1072],{"class":1071},[1057,2600,1160],{"class":1083},[1057,2602,2558],{"class":1087},[1057,2604,1165],{"class":1083},[2508,2606,2607,2634],{},[1048,2608,2610],{"className":1050,"code":2609,"filename":2513,"language":1052,"meta":354,"style":354},"const myLib = require('my-lib')\n",[1054,2611,2612],{"__ignoreMap":354},[1057,2613,2614,2616,2619,2621,2623,2625,2627,2630,2632],{"class":1059,"line":1060},[1057,2615,1064],{"class":1063},[1057,2617,2618],{"class":1067}," myLib",[1057,2620,1072],{"class":1071},[1057,2622,1076],{"class":1075},[1057,2624,1080],{"class":1079},[1057,2626,1084],{"class":1083},[1057,2628,2629],{"class":1087},"my-lib",[1057,2631,1084],{"class":1083},[1057,2633,1093],{"class":1079},[1048,2635,2637],{"className":1050,"code":2636,"filename":2564,"language":1052,"meta":354,"style":354},"import myLib from 'my-lib'\n\u002F\u002F 或\nconst dynamicMyLib = await import('my-lib').then(lib => lib.default || lib)\n",[1054,2638,2639,2654,2658],{"__ignoreMap":354},[1057,2640,2641,2643,2646,2648,2650,2652],{"class":1059,"line":1060},[1057,2642,1151],{"class":1150},[1057,2644,2645],{"class":1079}," myLib ",[1057,2647,1157],{"class":1150},[1057,2649,1160],{"class":1083},[1057,2651,2629],{"class":1087},[1057,2653,1165],{"class":1083},[1057,2655,2656],{"class":1059,"line":1096},[1057,2657,2080],{"class":2079},[1057,2659,2660,2662,2665,2667,2670,2673,2675,2677,2679,2681,2683,2685,2687,2689,2692,2694,2697,2699,2701,2703],{"class":1059,"line":1103},[1057,2661,1064],{"class":1063},[1057,2663,2664],{"class":1067}," dynamicMyLib",[1057,2666,1072],{"class":1071},[1057,2668,2669],{"class":1150}," await",[1057,2671,2672],{"class":1071}," import",[1057,2674,1080],{"class":1079},[1057,2676,1084],{"class":1083},[1057,2678,2629],{"class":1087},[1057,2680,1084],{"class":1083},[1057,2682,1475],{"class":1079},[1057,2684,1111],{"class":1110},[1057,2686,2267],{"class":1075},[1057,2688,1080],{"class":1079},[1057,2690,2691],{"class":2345},"lib",[1057,2693,2349],{"class":1063},[1057,2695,2696],{"class":1079}," lib",[1057,2698,1111],{"class":1110},[1057,2700,2357],{"class":1079},[1057,2702,2360],{"class":1071},[1057,2704,2705],{"class":1079}," lib)\n",[1024,2707,2708,2709,2155,2711,2155,2714,1312,2717,2720,2721,1312,2724,1201],{},"在 ESM 模块中，与 CJS 不同，",[1054,2710,1373],{},[1054,2712,2713],{},"require.resolve",[1054,2715,2716],{},"__filename",[1054,2718,2719],{},"__dirname"," 这些全局变量不可用，\n应该替换为 ",[1054,2722,2723],{},"import()",[1054,2725,2726],{},"import.meta.filename",[2508,2728,2729,2790],{},[1048,2730,2732],{"className":1050,"code":2731,"filename":2513,"language":1052,"meta":354,"style":354},"const { join } = require('node:path')\n\nconst newDir = join(__dirname, 'new-dir')\n",[1054,2733,2734,2760,2764],{"__ignoreMap":354},[1057,2735,2736,2738,2740,2743,2745,2747,2749,2751,2753,2756,2758],{"class":1059,"line":1060},[1057,2737,1064],{"class":1063},[1057,2739,1177],{"class":1110},[1057,2741,2742],{"class":1067}," join",[1057,2744,1661],{"class":1110},[1057,2746,1072],{"class":1071},[1057,2748,1076],{"class":1075},[1057,2750,1080],{"class":1079},[1057,2752,1084],{"class":1083},[1057,2754,2755],{"class":1087},"node:path",[1057,2757,1084],{"class":1083},[1057,2759,1093],{"class":1079},[1057,2761,2762],{"class":1059,"line":1096},[1057,2763,1100],{"emptyLinePlaceholder":1099},[1057,2765,2766,2768,2771,2773,2775,2778,2781,2783,2786,2788],{"class":1059,"line":1103},[1057,2767,1064],{"class":1063},[1057,2769,2770],{"class":1067}," newDir",[1057,2772,1072],{"class":1071},[1057,2774,2742],{"class":1075},[1057,2776,2777],{"class":1079},"(__dirname",[1057,2779,2780],{"class":1110},",",[1057,2782,1160],{"class":1083},[1057,2784,2785],{"class":1087},"new-dir",[1057,2787,1084],{"class":1083},[1057,2789,1093],{"class":1079},[1048,2791,2793],{"className":1050,"code":2792,"filename":2564,"language":1052,"meta":354,"style":354},"import { fileURLToPath } from 'node:url'\n\nconst newDir = fileURLToPath(new URL('.\u002Fnew-dir', import.meta.url))\n",[1054,2794,2795,2815,2819],{"__ignoreMap":354},[1057,2796,2797,2799,2801,2804,2806,2808,2810,2813],{"class":1059,"line":1060},[1057,2798,1151],{"class":1150},[1057,2800,1177],{"class":1110},[1057,2802,2803],{"class":1079}," fileURLToPath",[1057,2805,1661],{"class":1110},[1057,2807,1664],{"class":1150},[1057,2809,1160],{"class":1083},[1057,2811,2812],{"class":1087},"node:url",[1057,2814,1165],{"class":1083},[1057,2816,2817],{"class":1059,"line":1096},[1057,2818,1100],{"emptyLinePlaceholder":1099},[1057,2820,2821,2823,2825,2827,2829,2831,2834,2837,2839,2841,2844,2846,2848,2850,2852,2855,2857],{"class":1059,"line":1103},[1057,2822,1064],{"class":1063},[1057,2824,2770],{"class":1067},[1057,2826,1072],{"class":1071},[1057,2828,2803],{"class":1075},[1057,2830,1080],{"class":1079},[1057,2832,2833],{"class":1071},"new",[1057,2835,2836],{"class":1075}," URL",[1057,2838,1080],{"class":1079},[1057,2840,1084],{"class":1083},[1057,2842,2843],{"class":1087},".\u002Fnew-dir",[1057,2845,1084],{"class":1083},[1057,2847,2780],{"class":1110},[1057,2849,2672],{"class":1150},[1057,2851,1111],{"class":1110},[1057,2853,2854],{"class":1067},"meta",[1057,2856,1111],{"class":1110},[1057,2858,2859],{"class":1079},"url))\n",[2508,2861,2862,2894],{},[1048,2863,2865],{"className":1050,"code":2864,"filename":2513,"language":1052,"meta":354,"style":354},"const someFile = require.resolve('.\u002Flib\u002Ffoo.js')\n",[1054,2866,2867],{"__ignoreMap":354},[1057,2868,2869,2871,2874,2876,2878,2880,2883,2885,2887,2890,2892],{"class":1059,"line":1060},[1057,2870,1064],{"class":1063},[1057,2872,2873],{"class":1067}," someFile",[1057,2875,1072],{"class":1071},[1057,2877,1076],{"class":1079},[1057,2879,1111],{"class":1110},[1057,2881,2882],{"class":1075},"resolve",[1057,2884,1080],{"class":1079},[1057,2886,1084],{"class":1083},[1057,2888,2889],{"class":1087},".\u002Flib\u002Ffoo.js",[1057,2891,1084],{"class":1083},[1057,2893,1093],{"class":1079},[1048,2895,2897],{"className":1050,"code":2896,"filename":2564,"language":1052,"meta":354,"style":354},"import { resolvePath } from 'mlly'\n\nconst someFile = await resolvePath('my-lib', { url: import.meta.url })\n",[1054,2898,2899,2918,2922],{"__ignoreMap":354},[1057,2900,2901,2903,2905,2908,2910,2912,2914,2916],{"class":1059,"line":1060},[1057,2902,1151],{"class":1150},[1057,2904,1177],{"class":1110},[1057,2906,2907],{"class":1079}," resolvePath",[1057,2909,1661],{"class":1110},[1057,2911,1664],{"class":1150},[1057,2913,1160],{"class":1083},[1057,2915,2382],{"class":1087},[1057,2917,1165],{"class":1083},[1057,2919,2920],{"class":1059,"line":1096},[1057,2921,1100],{"emptyLinePlaceholder":1099},[1057,2923,2924,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2949,2951,2953,2955,2957,2959,2962,2964],{"class":1059,"line":1103},[1057,2925,1064],{"class":1063},[1057,2927,2873],{"class":1067},[1057,2929,1072],{"class":1071},[1057,2931,2669],{"class":1150},[1057,2933,2907],{"class":1075},[1057,2935,1080],{"class":1079},[1057,2937,1084],{"class":1083},[1057,2939,2629],{"class":1087},[1057,2941,1084],{"class":1083},[1057,2943,2780],{"class":1110},[1057,2945,1177],{"class":1110},[1057,2947,2948],{"class":1928}," url",[1057,2950,1238],{"class":1110},[1057,2952,2672],{"class":1150},[1057,2954,1111],{"class":1110},[1057,2956,2854],{"class":1067},[1057,2958,1111],{"class":1110},[1057,2960,2961],{"class":1079},"url ",[1057,2963,1965],{"class":1110},[1057,2965,1093],{"class":1079},[1032,2967,2968],{"id":2968},"最佳实践",[1330,2970,2971,2978,2981],{},[1333,2972,2973,2974,2977],{},"优先使用具名导出而非默认导出。这有助于减少 CJS 冲突。（参见",[1040,2975,2036],{"href":2976},"\u002Fdocs\u002Fguide\u002Fconcepts\u002Fesm#default-exports"," 一节）",[1333,2979,2980],{},"尽可能避免依赖 Node.js 内置模块以及 CommonJS 或仅限 Node.js 的依赖，使你的库无需 Nitro polyfill 即可在浏览器和边缘 Worker 中使用。",[1333,2982,2983,2984,2986,2987,2991],{},"使用新的带条件导出的 ",[1054,2985,1114],{}," 字段。（",[1040,2988,1045],{"href":2989,"rel":2990},"https:\u002F\u002Fnodejs.org\u002Fapi\u002Fpackages.html#conditional-exports",[1044],"）",[1048,2993,2995],{"className":1214,"code":2994,"language":1216,"meta":354,"style":354},"{\n  \"exports\": {\n    \".\": {\n      \"import\": \".\u002Fdist\u002Fmymodule.mjs\"\n    }\n  }\n}\n",[1054,2996,2997,3001,3013,3027,3045,3050,3055],{"__ignoreMap":354},[1057,2998,2999],{"class":1059,"line":1060},[1057,3000,1223],{"class":1110},[1057,3002,3003,3005,3007,3009,3011],{"class":1059,"line":1096},[1057,3004,1228],{"class":1106},[1057,3006,1114],{"class":1231},[1057,3008,1235],{"class":1106},[1057,3010,1238],{"class":1110},[1057,3012,1934],{"class":1110},[1057,3014,3015,3018,3021,3023,3025],{"class":1059,"line":1103},[1057,3016,3017],{"class":1106},"    \"",[1057,3019,1111],{"class":3020},"seQRr",[1057,3022,1235],{"class":1106},[1057,3024,1238],{"class":1110},[1057,3026,1934],{"class":1110},[1057,3028,3029,3032,3034,3036,3038,3040,3043],{"class":1059,"line":1272},[1057,3030,3031],{"class":1106},"      \"",[1057,3033,1151],{"class":2071},[1057,3035,1235],{"class":1106},[1057,3037,1238],{"class":1110},[1057,3039,1241],{"class":1083},[1057,3041,3042],{"class":1087},".\u002Fdist\u002Fmymodule.mjs",[1057,3044,1288],{"class":1083},[1057,3046,3047],{"class":1059,"line":1291},[1057,3048,3049],{"class":1110},"    }\n",[1057,3051,3052],{"class":1059,"line":1561},[1057,3053,3054],{"class":1110},"  }\n",[1057,3056,3057],{"class":1059,"line":1566},[1057,3058,1294],{"class":1110},[3060,3061,3062],"style",{},"html pre.shiki code .sV7Px, html code.shiki .sV7Px{--shiki-light:#9C3EDA;--shiki-default:#F97583;--shiki-dark:#C792EA}html pre.shiki code .sJTDI, html code.shiki .sJTDI{--shiki-light:#90A4AE;--shiki-default:#79B8FF;--shiki-dark:#BABED8}html pre.shiki code .sXPRQ, html code.shiki .sXPRQ{--shiki-light:#39ADB5;--shiki-default:#F97583;--shiki-dark:#89DDFF}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 .s0jeK, html code.shiki .s0jeK{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#89DDFF}html pre.shiki code .s-Aze, html code.shiki .s-Aze{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#C3E88D}html pre.shiki code .s0q4w, html code.shiki .s0q4w{--shiki-light:#39ADB5;--shiki-default:#79B8FF;--shiki-dark:#89DDFF}html pre.shiki code .sF54B, html code.shiki .sF54B{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#89DDFF}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 .sS9nB, html code.shiki .sS9nB{--shiki-light:#9C3EDA;--shiki-default:#79B8FF;--shiki-dark:#C792EA}html pre.shiki code .sJK67, html code.shiki .sJK67{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#FFCB6B}html pre.shiki code .scsZY, html code.shiki .scsZY{--shiki-light:#6182B8;--shiki-default:#79B8FF;--shiki-dark:#82AAFF}html pre.shiki code .sOtFm, html code.shiki .sOtFm{--shiki-light:#E53935;--shiki-default:#E1E4E8;--shiki-dark:#F07178}html pre.shiki code .sSD0A, html code.shiki .sSD0A{--shiki-light:#E53935;--shiki-default:#9ECBFF;--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 .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 .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 .seQRr, html code.shiki .seQRr{--shiki-light:#E2931D;--shiki-default:#79B8FF;--shiki-dark:#FFCB6B}",{"title":354,"searchDepth":1103,"depth":1103,"links":3064},[3065,3072,3077],{"id":1030,"depth":1096,"text":1030,"children":3066},[3067,3068,3069,3070,3071],{"id":1034,"depth":1103,"text":1035},{"id":1131,"depth":1103,"text":1132},{"id":1204,"depth":1103,"text":1205},{"id":1363,"depth":1103,"text":1364},{"id":1432,"depth":1103,"text":1433},{"id":1883,"depth":1096,"text":1884,"children":3073},[3074,3075,3076],{"id":1895,"depth":1103,"text":1895},{"id":1973,"depth":1103,"text":1973},{"id":2036,"depth":1103,"text":2036},{"id":2458,"depth":1096,"text":2458,"children":3078},[3079,3080],{"id":2497,"depth":1103,"text":2497},{"id":2968,"depth":1103,"text":2968},"md",{},"false",{"title":218,"description":219},"docs\u002F3.guide\u002F1.concepts\u002F7.esm","bQ0yc9r0ZYEr7LkiOSsOViOXqsC9lfS8TkuLjc-Y7E4",1785179847058]