Nuxt.js 详解(三):迁移踩坑与最佳实践
Nuxt.js 详解三迁移踩坑与最佳实践这是 Nuxt 系列的最后一篇。前两篇讲了 Nuxt 是什么、怎么用。这篇讲实际项目里你会踩的坑——SSR 兼容性、数据水合、性能优化、部署问题以及怎么避开它们。一、SSR 兼容性问题最高频踩坑问题是什么Nuxt 开启 SSR 后组件会在服务端先执行一次再到客户端执行一次。服务端环境里没有window、document、localStorage、sessionStorage这些浏览器对象。只要你的代码在服务端碰到了这些对象直接报错ReferenceError: window is not defined ReferenceError: document is not defined错误写法script setup // ❌ setup 顶层直接用 windowSSR 阶段会炸 const width window.innerWidth const token localStorage.getItem(token) /script正确写法一用 onMountedonMounted只在客户端执行服务端不跑script setup const width ref(0) onMounted(() { width.value window.innerWidth }) /script正确写法二用 process.client 判断if(process.client){// 这段代码只在客户端执行consttokenlocalStorage.getItem(token)}Nuxt 3 也支持import.meta.clientif(import.meta.client){consttokenlocalStorage.getItem(token)}正确写法三用 包裹有些组件只能在客户端跑比如用到 canvas、地图 SDK用ClientOnly包起来template ClientOnly MapComponent / template #fallback div地图加载中.../div /template /ClientOnly /template#fallback是服务端渲染时的占位内容避免白屏。二、第三方库 SSR 兼容处理问题很多第三方库图表库、编辑器、地图默认依赖浏览器环境在 SSR 阶段会报错。方案一动态导入 ssr:falsescript setup const MonacoEditor defineAsyncComponent(() import(guolao/vue-monaco-editor) ) /script template ClientOnly MonacoEditor / /ClientOnly /template方案二nuxt.config 配置// nuxt.config.tsexportdefaultdefineNuxtConfig({build:{transpile:[vue-monaco-editor]// 让 Nuxt 处理这个库的 SSR},vite:{ssr:{noExternal:[some-ssr-unfriendly-lib]// 不走外部化打包进 SSR bundle}}})方案三用插件按需加载// plugins/echarts.client.ts// 文件名带 .client 后缀只在客户端加载import{use}fromecharts/coreimport{CanvasRenderer}fromecharts/renderersimport{BarChart}fromecharts/chartsuse([CanvasRenderer,BarChart])exportdefaultdefineNuxtPlugin((){// 初始化逻辑})三、数据水合Hydration问题问题是什么SSR 时服务端渲染了一份 HTML客户端拿到后会把这份 HTML 和 JS 状态对齐hydration。如果服务端和客户端渲染出来的内容不一致就会报 hydration mismatch 警告甚至页面错乱。常见触发场景时间不一致服务端渲染 12:00:00客户端水合时已经 12:00:01。!-- ❌ 会出问题 -- template div{{ new Date().toLocaleTimeString() }}/div /template随机数不一致!-- ❌ 服务端和客户端随机数不同 -- template div验证码{{ Math.random() }}/div /template解决方案把不确定的内容放到onMounted里生成script setup const timeStr ref() onMounted(() { timeStr.value new Date().toLocaleTimeString() }) /script template div{{ timeStr || --:--:-- }}/div /template四、useFetch vs useAsyncData 怎么选这是新手最容易困惑的点。特性useFetchuseAsyncData定位封装好的 HTTP 请求工具通用数据获取数据来源$fetchHTTP任意异步操作参数URL optionskey handler适用调接口组合多数据源、非 HTTP 数据简单记法调接口用 useFetch其他场景用 useAsyncData。常见错误不用 useFetch 直接 $fetch!-- ❌ 这样不会做 SSR 预取还会在客户端重复请求 -- script setup const data await $fetch(/api/users) /script正确用 useFetch 包一层script setup const { data } await useFetch(/api/users) // SSR 阶段预取客户端复用不重复请求 /script避免重复请求给 key多个组件用同一份数据时给相同的 keyNuxt 会复用缓存而不是重复请求// 组件 Aconst{data}awaituseFetch(/api/config,{key:app-config})// 组件 Bconst{data}awaituseFetch(/api/config,{key:app-config})// 只请求一次第二个复用第一个的结果五、状态管理最佳实践SSR 下 Pinia 状态共享SSR 模式下每次请求是独立的不能在模块顶层创建全局单例否则状态会串到其他用户。错误写法// ❌ 模块顶层创建单例多用户共享会串数据conststorecreatePinia()正确在setup里调用useXxxStore()Nuxt 会保证每次请求独立。跨请求状态用 useStateNuxt 内置useState专门处理 SSR 下的共享状态自动处理服务端到客户端的序列化// composables/useCart.tsexportconstuseCart(){returnuseState(cart,()({items:[],total:0,}))}不要用普通的全局变量存状态——SSR 下会串用户数据。六、SEO 优化进阶基础设置script setup useSeoMeta({ title: 商品详情, ogTitle: 商品详情, description: 商品描述, ogDescription: 商品描述, }) /script动态 SEO数据驱动的 SEO等数据回来再设置script setup const { data: product } await useFetch(/api/products/${route.params.id}) useSeoMeta({ title: () ${product.value?.name} - 我的商城, description: () product.value?.description, }) /script站点全局默认值// nuxt.config.tsexportdefaultdefineNuxtConfig({app:{head:{titleTemplate:%s - 我的商城,meta:[{name:viewport,content:widthdevice-width, initial-scale1},{name:description,content:我的商城默认描述},],}}})sitemap 和 robotsnpx nuxi moduleinstallsitemap// nuxt.config.tsexportdefaultdefineNuxtConfig({modules:[nuxtjs/sitemap],site:{url:https://example.com,},sitemap:{sources:[/api/__sitemap__/urls],}})自动生成/sitemap.xml和/robots.txt。七、图片优化安装 NuxtImagenpx nuxi moduleinstallimage使用template NuxtImg src/images/product.jpg width400 height300 formatwebp loadinglazy alt商品图 / /template效果自动生成多种尺寸的响应式图片自动转 WebP 格式体积小 30%-50%懒加载默认开启生成 srcset 适配不同屏幕八、性能优化路由级缓存routeRules// nuxt.config.tsexportdefaultdefineNuxtConfig({routeRules:{/:{prerender:true},// 构建时预渲染/blog/**:{swr:3600},// 1小时增量缓存/api/heavy/**:{swr:600},// 重计算接口缓存 10 分钟/admin/**:{ssr:false},// 后台不走 SSR}})prerender构建时生成静态 HTML运行时零开销swrstale-while-revalidate返回缓存的同时后台刷新兼顾速度和新鲜度ssr: false不走服务端渲染省服务器资源组件懒加载不立即需要的组件用懒加载script setup // 只在需要时才加载编辑器组件 const Editor defineAsyncComponent(() import(~/components/Editor.vue)) /script template ClientOnly Editor v-ifshowEditor / /ClientOnly /template数据预取script setup definePageMeta({ // 进入这个页面时预取 /api/users不用等组件加载 async middleware() { await useFetch(/api/users) } }) /script九、部署注意事项Node 部署环境变量构建后的产物需要运行时读取环境变量。构建时写死的值不会生效要用运行时配置// nuxt.config.tsexportdefaultdefineNuxtConfig({runtimeConfig:{public:{apiBase:process.env.NUXT_PUBLIC_API_BASE||http://localhost:3000}}})启动时传入NUXT_PUBLIC_API_BASEhttps://prod-api.example.comnode.output/server/index.mjs静态站点部署注意SSG 模式下动态路由的页面要告诉 Nuxt 去预渲染哪些// nuxt.config.tsexportdefaultdefineNuxtConfig({nitro:{prerender:{crawlLinks:true,// 自动爬取页面里的链接routes:[/sitemap.xml],}}})或者用routeRules指定routeRules:{/blog/**:{prerender:true}}反向代理配置用 Nginx 反代 Nuxt 应用server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }十、常见报错排查1.window is not defined原因SSR 阶段用了浏览器 API。解决用process.client判断或放onMounted里。2.Hydration text mismatch原因服务端和客户端渲染内容不一致时间、随机数、依赖客户端状态的数据。解决把不确定内容放onMounted或用ClientOnly包裹。3.useFetch 重复请求原因没有 SSR 预取或 key 重复。解决确保useFetch在setup顶层 await 调用不要包在函数里。4. 第三方库报Cannot read properties of undefined原因库依赖浏览器环境。解决用ClientOnly包裹或配vite.ssr.noExternal。5. 部署后 502 / 端口不对原因Nitro 默认 3000 端口被占用或没配对。解决PORT8080 node .output/server/index.mjs指定端口。6. 静态生成后动态路由 404原因SSG 模式下动态路由没有被预渲染。解决配置nitro.prerender.crawlLinks或手动指定 routes。十一、结语三篇文章走完了 Nuxt 的完整认知链路是什么Vue 之上的全栈框架解决 SSR、SEO、路由工程化、前后端一体怎么用约定式路由、自动导入、useFetch、Pinia、server/api、部署踩什么坑SSR 兼容性、hydration、第三方库、性能、部署核心心法一条凡是涉及浏览器 API 的代码先想服务端阶段会不会执行到这里。这一条想通了Nuxt 大半的坑都不会踩。本系列共三篇第一篇Vue 开发者为什么要关注 Nuxt第二篇从零搭建一个 Nuxt 项目第三篇迁移踩坑与最佳实践本文

相关新闻

XUnity.AutoTranslator终极指南:为Unity游戏开启多语言自动翻译

XUnity.AutoTranslator终极指南:为Unity游戏开启多语言自动翻译

XUnity.AutoTranslator终极指南:为Unity游戏开启多语言自动翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过了精彩的Unity游戏体验?是否在游玩日…

2026/7/31 8:04:50阅读更多 →
豆瓣电影信息API参数详解:从请求到响应字段的完整指南

豆瓣电影信息API参数详解:从请求到响应字段的完整指南

适用场景 豆瓣电影信息 API 为开发者提供通过豆瓣电影 ID 或完整 URL 获取电影详情的接口。常见使用场景包括: 个人电影收藏/评分网站,需要展示影片的评分、导演、演员等基础信息。电影推荐系统,根据用户喜好获取电影元数据用于内容过滤。自…

2026/7/31 8:04:50阅读更多 →
Claude 5 上下文工程新规则完全指南:删掉 80% 系统提示词,性能不降反升(2026 最新)

Claude 5 上下文工程新规则完全指南:删掉 80% 系统提示词,性能不降反升(2026 最新)

TL;DRAnthropic 技术团队在 Claude Opus 5 和 Fable 5 上做了一个惊人的实验:删除了 Claude Code 超过 80% 的系统提示词,编码评估结果没有任何可衡量的下降。核心发现是——Claude 5 代模型不再需要旧模型那么多 guardrails,过度约束反而让模…

2026/7/31 8:02:50阅读更多 →
Ai公文写作工具软件有哪些?材料星与几款热门工具实操对比

Ai公文写作工具软件有哪些?材料星与几款热门工具实操对比

我做公文润色时,通常先选择“少改一点”的路线:事实、结构和正式分寸先保住,只处理重复、拗口和衔接不顺的地方。材料星、几款热门工具都能提供改写,但我会用同一篇会议纪要做实操,重点观察谁更容易控制修改边界。我把…

2026/7/31 12:56:37阅读更多 →
CoreCycler完整指南:如何实现单核稳定性测试与超频优化

CoreCycler完整指南:如何实现单核稳定性测试与超频优化

CoreCycler完整指南:如何实现单核稳定性测试与超频优化 【免费下载链接】CoreCycler Script to test single core stability, e.g. for PBO & Curve Optimizer on AMD Ryzen or overclocking/undervolting on Intel processors 项目地址: https://gitcode.com…

2026/7/31 12:56:37阅读更多 →
大模型微调技术LoRA与QLoRA在内容审核中的应用

大模型微调技术LoRA与QLoRA在内容审核中的应用

1. 项目概述:大模型微调技术在内容审核中的关键作用内容审核领域正面临前所未有的挑战。随着用户生成内容(UGC)的爆炸式增长,传统规则引擎和简单分类模型已经难以应对日益复杂的审核需求。我在实际工作中发现,基于大语言模型(LLM)的智能审核系…

2026/7/31 12:56:37阅读更多 →
ComfyUI-VideoHelperSuite:3步打造专业级AI视频工作流的完整指南

ComfyUI-VideoHelperSuite:3步打造专业级AI视频工作流的完整指南

ComfyUI-VideoHelperSuite:3步打造专业级AI视频工作流的完整指南 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite ComfyUI-VideoHelperSuite是一款专为…

2026/7/31 12:56:37阅读更多 →
AI如何用3分钟完成8小时的PPT制作

AI如何用3分钟完成8小时的PPT制作

1. 项目概述:AI如何重塑PPT制作体验 作为一名经历过无数个深夜赶PPT的职场老兵,第一次接触paperzz AI PPT工具时的震撼感至今难忘。凌晨两点,当我把一份杂乱的市场数据拖进这个系统,3分钟后拿到一份排版专业、动画流畅的演示文稿时…

2026/7/31 12:56:37阅读更多 →
从零拆解 AI 办公智能体:千问办公与 WorkBuddy 背后的技术架构对比

从零拆解 AI 办公智能体:千问办公与 WorkBuddy 背后的技术架构对比

最近阿里千问办公(QwenWork)正式上线,加上此前已经活跃的 WorkBuddy,国内「AI 办公智能体」赛道一下子热闹起来。但对工程师来说,比「哪个更好用」更重要的是——这类产品到底是怎么搭出来的? 本文从工程视角,把 AI 办公智能体的核心架构拆成 5 层,并用这两款产品作为…

2026/7/31 12:54:36阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →