YAOTU INSIGHTS

Nuxt Server 实战指南:Nitro 驱动的服务端端点、通用部署与混合渲染

Nuxt Server 实战指南:Nitro 驱动的服务端端点、通用部署与混合渲染
Nuxt Server 实战指南Nitro 驱动的服务端端点、通用部署与混合渲染【免费下载链接】nuxtthe full-stack Vue framework项目地址: https://gitcode.com/GitHub_Trending/nu/nuxt本篇围绕 Nuxt 的 Server 能力展开介绍 Nuxt 服务端如何由 Nitro 驱动、如何用server/目录定义 API 端点与中间件、如何通过 Nitro 预设实现通用部署以及借助routeRules实现混合渲染。读完你将掌握在单个 Nuxt 代码库中完成数据获取、API 构建、静态内容生成如 sitemap、RSS所需的完整服务端方案并能对照packages/nitro-server的源码理解其底层装配过程。由 Nitro 驱动的服务端Nuxt 的服务端由 Nitro 提供。Nitro 最初为 Nuxt 而创建如今已加入 UnJS 生态并对其他框架开放也可以独立使用。官方文档将其概括为三点核心能力完全掌控应用的服务端部分在任意云厂商上通用部署许多目标零配置混合渲染Hybrid Rendering。Nitro 内部使用 h3一个面向高性能与可移植性设计的极简 H(TTP) 框架。在 Nuxt 仓库中这套集成由独立的nuxt/nitro-server包承载见 packages/nitro-server/package.json其入口 bundle 函数 负责把 Nuxt 配置翻译成完整的 Nitro 配置。从源码结构看装配过程包括以defu(nuxt.options.nitro, ...)为基底合并默认配置即用户在nuxt.config.ts中写的nitro键直接作为 Nitro 配置的最高优先级来源见 index.ts 中的 nitroConfig 定义设置renderer.handler指向 SSR 渲染器 runtime/handlers/renderer将各层server/目录注册为scanDirs由 Nitro 自动扫描生成路由见 index.ts#L220通过createNitro(nitroConfig, ...)初始化 Nitro 实例并触发nitro:config、nitro:init等钩子供模块扩展见 index.ts#L726 与 index.ts#L796-L799。Server 端点与中间件你可以轻松地管理 Nuxt 应用中仅在服务端运行的部分——从 API 端点到中间件。仓库自带的 playground 中有一个最简示例 playground/server/api/test.tsexport default eventHandler((_event) { return Hello! })端点与中间件的通用写法是import { defineEventHandler } from nitro/h3 export default defineEventHandler(async (event) { // ... Do whatever you want here })handler 可以直接返回text、json、html甚至stream也可以返回 JSON 数据、Promise或Response对象详见 server 目录文档。server/目录的约定结构如下-| server/ ---| api/ -----| hello.ts # /api/hello ---| routes/ -----| bonjour.ts # /bonjour ---| middleware/ -----| log.ts # log all requestsserver/api/文件路由自动带/api前缀如server/api/hello.ts对应/api/helloserver/routes/不带前缀的自定义服务端路由如server/routes/hello.ts对应/helloserver/middleware/在每一请求先于任何路由执行的中间件用于加/查请求头、记录日志或扩展event.context。中间件不应返回内容或提前响应请求只做检查、扩展上下文或抛错export default defineEventHandler((event) { console.log(New request: getRequestURL(event)) })server/plugins/Nitro 插件用于扩展 Nitro 运行时行为并挂接生命周期事件import { definePlugin } from nitro export default definePlugin((nitroApp) { console.log(Nitro plugin, nitroApp) })server/utils/自定义服务端工具函数可被自动导入例如包装原始 handler 统一做前置操作与错误处理完整示例见 server 目录文档。server/types/仅在服务端上下文自动导入的类型声明与shared/types/的区别在于它不会暴露给 Vue 应用。热更新与自动导入服务端代码开箱即用地支持热模块替换HMR与自动导入与应用端体验一致。这一能力的来源可以从源码确认bundle函数在构造 Nitro 配置时会把server/types与各层shared/types、shared/utils目录收集进imports.dirs见 index.ts#L78-L90而当开启experimental.nitroAutoImports时还会注入两组导入预设见 imports.tsh3 预设动态解析nitro/h3的模块导出把其中全部小写函数名如defineEventHandler、getRequestURL、getQuery、readBody等注入为自动导入——这解释了为什么 playground 的端点可以像上面那样不写 import 直接使用eventHandlerNitro 运行时预设v2ImportsPreset自动导入useNitroApp、getRouteRules、useRuntimeConfig、defineCachedHandler别名cachedEventHandler、useStorage、defineTask/runTask等。另外server/目录可使用#server别名从任意深度导入目录内文件例如import { formatUser } from #server/utils/formatUser该别名仅限服务端使用客户端代码中导入会报错。前端调用服务端 API服务端端点定义后可在页面与组件中通过useFetch/$fetch通用调用script setup langts const { data } await useFetch(/api/hello) /script template pre{{ data }}/pre /template注意不要在服务端路由或工具中导入 Vue 应用代码组件、composables 或其他仅应用侧的工具也不要在应用中导入服务端专属代码。Nitro 构建时通过 Impound 插件注册了导入保护模式来拦截这类混用见 index.ts#L636-L659这也是 server 目录文档 中强调不能混用 Vue 与 Nitro 代码的底层原因。通用部署Nitro 让 Nuxt 应用可以部署到任何环境——从裸金属服务器到边缘网络启动时间仅需毫秒级。官方提供了 15 种以上的 preset用于针对不同的云厂商与服务端构建应用其中包括Cloudflare WorkersNetlify FunctionsVercelDeno、Bun 等其他运行时preset 对应的正是 Nitro 的target选项在 Nuxt 中可通过nuxt.options.nitro.preset传递并会反映到构建输出的目标标识上见 setServerBuild 中的 target 映射。完整部署流程可参考 部署指南。混合渲染Hybrid RenderingNitro 提供了强大的routeRules功能允许你为应用的每个路由定义一组规则自定义其渲染方式以及其他行为export default defineNuxtConfig({ routeRules: { // Generated at build time for SEO purpose /: { prerender: true }, // Cached for 1 hour /api/*: { cache: { maxAge: 60 * 60 } }, // Redirection to avoid 404 /old-page: { redirect: { to: /new-page, status: 302 }, }, // ... }, })三类典型规则的含义规则作用prerender: true构建时预渲染该路由用于 SEOcache: { maxAge }缓存响应单位为秒上例为缓存 1 小时redirect返回 HTTP 重定向可指定目标与状态码如 302避免 404除 Nitro 通用规则外还有一些Nuxt 专属的 route rule 用于改变页面渲染为 HTML 时的行为例如ssr、appMiddleware、noScripts其中appMiddleware、redirect和prerender还会同时影响客户端行为。全部可用规则见 渲染模式文档中的混合渲染章节。从源码层面可以印证routeRules的工作机制Nitro 侧默认规则在 index.ts#L284-L289 写死/**默认{ ssr: true }开启 SSR 流式时追加streaming: true/__nuxt_error默认{ cache: false }用户配置通过defu与之合并用户值优先在experimental.payloadExtraction开启时Nuxt 会监听nitro:init在构建前把带isr/cache的规则同步派生一条对应的/_payload.json规则使 payload 与页面共享同一缓存策略见 index.ts#L441-L462在 dev 模式下prerender.routes会被自动转换为routeRules的prerender: true见 index.ts#L429-L440。Nitro 同时承担应用的服务端渲染SSR构建与预渲染prerender工作routeRules因此是统一这个路由怎么生成、怎么缓存、怎么响应的入口。Nitro 配置与进阶在nuxt.config.ts中可通过nitro键直接设置 Nitro 配置export default defineNuxtConfig({ nitro: {}, // 完整的 Nitro 配置项 })需要警惕这是一个高级选项。自定义配置可能影响生产部署因为 Nitro 在 Nuxt 的 semver-minor 版本升级中其配置接口可能变化。相关配置项如routeRules、publicAssets、nitro.storage等的类型可在 packages/schema/src/config/nitro.ts 与 packages/schema/src/types/nitro.ts 中查阅。进阶能力方面官方文档给出了若干方向均有对应源码或测试佐证嵌套 Router用h3的createRouteruseBase在单个端点内挂子路由发送流通过 h3 的sendStream返回流式响应如fs.createReadStream重定向sendRedirect(event, /path, 302)Server Storage通过nitro.storage配置 Redis 等跨平台存储挂载点在端点中用useStorage(redis)读写后台任务event.waitUntil在响应发出后继续等待异步任务完成遗留中间件fromNodeMiddleware包装传统 Node 中间件文档建议尽量避免。这些用法与更多端点技巧路由参数、HTTP 方法匹配、catch-all、请求体、查询参数、错误处理、运行时配置、Cookie、转发请求头等完整收录在 server 目录结构文档 的 Recipes 与 Advanced Usage 章节可作为服务端开发的日常查阅手册。小结Nuxt 的服务端能力以 Nitro 为引擎server/目录约定式地承载 API 端点、路由、中间件与插件配合 h3 的自动导入与热更新获得和应用端一致的开发体验部署层通过 15 个 preset 覆盖从 Node 服务器到边缘网络的目标环境渲染层通过routeRules按路由粒度组合预渲染、缓存与重定向实现混合渲染。若需深入底层packages/nitro-server/src/index.ts中的bundle函数是理解Nuxt 配置如何变成 Nitro 应用的最直接入口。【免费下载链接】nuxtthe full-stack Vue framework项目地址: https://gitcode.com/GitHub_Trending/nu/nuxt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考