预览
npx nuxt preview
在本地预览生产构建,验证构建结果是否正确。
为什么要预览而不是直接用 nuxt dev?
nuxt dev 使用开发模式(HMR、源码映射、详细错误提示),行为与生产环境有差异。nuxt preview 使用生产构建,行为更接近线上环境,能提前发现问题。
bash
npx nuxt build
npx nuxt preview默认在 http://localhost:3000 启动 Nitro 生产服务器。
常用选项
bash
# 指定端口
npx nuxt preview --port 8080
# 指定主机(允许外部访问,如手机测试)
npx nuxt preview --host 0.0.0.0
# 指定环境变量文件
npx nuxt preview --dotenv .env.production手动运行
也可以直接运行构建输出:
bash
node .output/server/index.mjs环境变量
bash
# 设置端口
PORT=8080 node .output/server/index.mjs
# 设置主机
HOST=0.0.0.0 node .output/server/index.mjs
# 组合使用
PORT=8080 HOST=0.0.0.0 node .output/server/index.mjsINFO
️ 环境变量修改后需要重启服务 不会像 nuxt dev 那样自动重载
Nitro 预览预设
预览时默认使用 Node.js 预设。如果你的目标部署平台不同,可以在构建时指定:
bash
# 构建 Cloudflare Worker 版本并预览
NITRO_PRESET=cloudflare npx nuxt build
npx nuxt preview
# 构建 Deno 版本并预览
NITRO_PRESET=deno npx nuxt build
npx nuxt preview| 预设 | 预览命令 |
|---|---|
| node (默认) | node .output/server/index.mjs |
| bun | bun run .output/server/index.mjs |
| deno | deno run -A .output/server/index.mjs |
| cloudflare | npx wrangler dev .output/server/index.mjs |
验证清单
这是预览最重要的部分
很多问题只在生产构建中出现(如 Tree-shaking 移除了"看起来没用"的代码),开发时完全正常。
| 检查项 | 说明 | 如何验证 |
|---|---|---|
| 页面渲染 | SSR 页面是否正确输出 | 访问各页面,查看 HTML 源码(Ctrl+U) |
| Hydration 不匹配 | 服务端和客户端渲染结果不一致 | 打开浏览器控制台,查看是否有 hydration 警告 |
| API 路由 | 服务端 API 是否正常响应 | 用 Postman 或 curl 测试 API |
| 静态资源 | 图片、CSS、JS 是否正常加载 | 检查 Network 面板,确认无 404 |
| 环境变量 | Runtime Config 值是否正确 | 在页面中临时显示配置值验证 |
| 404 页面 | 不存在的路由是否显示错误页面 | 访问一个不存在的路径 |
| 重定向 | 路由重定向和中间件是否生效 | 测试重定向逻辑 |
| 性能 | 首屏加载速度 | 用 Lighthouse 检查 |
Hydration 不匹配排查
什么是 Hydration 不匹配?
SSR 时服务端生成 HTML,客户端加载后 Vue 会尝试"接管"这些 HTML(Hydration)。如果客户端重新渲染的结果与服务端 HTML 不一致,就会报 Hydration 错误。
常见原因:
- 使用了
Date.now()或Math.random()(服务端和客户端结果不同) - 依赖浏览器 API(
window.innerWidth)在 SSR 时不可用 - 第三方库在 SSR/CSR 中渲染不同
解决方案:
- 使用
<ClientOnly>包裹仅客户端的内容 - 使用
onMounted延迟初始化依赖浏览器 API 的逻辑 - 使用
<NuxtTime>组件渲染时间(自动处理 SSR/CSR 差异)
性能验证
bash
# 使用 lighthouse 检查性能
npx lighthouse http://localhost:3000 --output html --output-path ./report.html
# 检查构建产物大小
ls -lh .output/public/_nuxt/
du -sh .output/性能指标参考
| 指标 | 目标值 | 说明 |
|---|---|---|
| FCP(首次内容绘制) | < 1.8s | 用户首次看到内容的时间 |
| LCP(最大内容绘制) | < 2.5s | 主要内容完全加载的时间 |
| CLS(累积布局偏移) | < 0.1 | 页面加载时内容位移量 |
| TTI(可交互时间) | < 3.8s | 页面可以交互的时间 |
TIP
如果 Lighthouse 分数不理想 检查:图片是否优化(<NuxtImg>)、JS 包是否过大(manualChunks)、是否有不必要的客户端渲染
注意事项
- 先 build 再 preview:
nuxt preview需要.output/目录,未构建会报错 - 不支持 HMR:预览是生产模式,修改代码后需要重新
nuxt build - 环境变量:使用
.env或系统环境变量,开发时的.env可能与生产不同 - 仅用于本地测试:生产部署不要使用
nuxt preview,应使用专业服务器(PM2、Docker 等) - 静态生成用
nuxt generate:如果项目是纯静态站点(SSG),应使用nuxt generate生成后用静态服务器预览
常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 端口 3000 被占用 | 其他服务使用了该端口 | 使用 --port 8080 指定端口 |
| 环境变量不生效 | .env 文件路径不对 | 使用 --dotenv 指定正确的环境文件 |
| Hydration 警告 | SSR/CSR 渲染结果不一致 | 用 <ClientOnly> 包裹仅客户端内容 |
| 静态资源 404 | 构建不完整或路径错误 | 重新 nuxt build,检查 baseURL 配置 |
| API 返回 500 | 服务端代码在生产环境表现不同 | 检查 pm2 logs 或终端错误输出 |