您正在浏览 Nuxt 2 文档。前往 Nuxt 3 文档, 或了解更多关于 Nuxt 2 长期支持

服务端渲染

服务端渲染(SSR)是一种应用程序功能,通过在服务器而非浏览器上渲染网页来显示内容。服务端将完全渲染的页面发送给客户端,客户端的 JavaScript 包接管并允许 Vue.js 应用进行水合


需要 Node.js 服务器环境

渲染网页需要 JavaScript 环境。

需要配置 Node.js 服务器来运行 Vue.js 应用程序。

扩展和控制服务器

可以使用 serverMiddleware 扩展服务器,使用 middleware 控制路由。

server-middleware/logger.js
export default function (req, res, next) {
  console.log(req.url)
  next()
}
nuxt.config.js
export default {
  serverMiddleware: ['~/server-middleware/logger']

}

服务器环境与浏览器环境

由于处于 Node.js 环境中,可以访问 reqres 等 Node.js 对象,但无法访问 windowdocument 等属于浏览器环境的对象。不过,使用 beforeMountmounted 等钩子可以使用 windowdocument

beforeMount () {
  window.alert('hello');
}
mounted () {
  window.alert('hello');
}

Nuxt 中的服务端渲染步骤

步骤 1:浏览器到服务器

浏览器发送第一个请求时,会到达 Node.js 内部服务器。Nuxt 生成 HTML 并将其与执行 asyncDatanuxtServerInitfetch 等函数的结果一起发送回浏览器,钩子函数也会同样执行。

步骤 2:服务器到浏览器

浏览器接收到服务器生成的 HTML 以及渲染的页面,内容显示出来,Vue.js 水合开始生效。此过程之后,页面变为可交互状态。

步骤 3:浏览器到浏览器

通过 <NuxtLink> 在页面间导航是在客户端完成的,因此除非硬刷新浏览器,否则不会向服务器发送请求。

注意事项

window 或 document 未定义

这是由服务端渲染引起的。如果需要指定仅在客户端导入资源,需要使用 process.client 变量。

例如,在 .vue 文件中:

if (process.client) {
  require('external_library')
}

iOS 和电话号码

某些版本的移动端 Safari 会自动将电话号码转换为链接,这会导致 SSR 内容与网站内容不匹配,从而引发 NodeMismatch 警告,可能导致应用在这些 Safari 版本中无法使用。

如果 Nuxt 页面中包含电话号码,有两个选项:

使用 meta 标签停止转换

<meta name="format-detection" content="telephone=no" />

将电话号码包装在链接中

<!-- 电话号码示例:+7 (982) 536-50-77 -->

<template>
  <a href="tel: +7 (982) 536-50-77">+7 (982) 536-50-77</a>
</template>
Edit this page on GitHub Updated at Tue, Apr 14, 2026