vue3 createSSRApp() 函数(实战指南)

Vue 3 createSSRApp() 函数是什么

createSSRApp() 是 Vue 3 中用于服务端渲染(SSR)的一个核心函数。与 createApp() 用于客户端渲染不同,createSSRApp() 是专门为 Vue 3 与 SSR 框架(如 Vite + vue 3 + vue-router + Node.js)配合使用设计的,它能在服务端生成 HTML 字符串,并将其发送给客户端,从而提高首屏加载速度和 SEO 效能。

为什么需要 createSSRApp() 函数

在单页应用(SPA)中,页面内容通常由 JavaScript 动态加载,搜索引擎爬虫可能无法正确抓取页面内容,导致 SEO 不佳。服务端渲染可以解决这个问题,而 createSSRApp() 是 Vue 3 实现 SSR 的关键入口。

它与 createApp() 的主要区别在于:

  • createSSRApp() 会创建一个用于 SSR 的应用实例
  • 该实例支持服务端与客户端的同步,包括组件状态、生命周期等
  • 通常用于 Node.js 环境中,配合 renderToString() 使用

createSSRApp() 的基本用法

import { createSSRApp } from 'vue'
import App from './App.vue'

export function createApp() {
  const app = createSSRApp(App)
  return app
}

这段代码展示了 createSSRApp() 最基础的使用方式。它创建了一个 Vue 3 应用实例,该实例专为 SSR 设计,可以被 Node.js 环境下的 SSR 渲染器识别并处理。

  • createSSRApp(App):传入根组件 App.vue,创建 SSR 应用
  • return app:将应用实例返回,便于后续挂载插件或中间件

与 SSR 框架的结合使用

在使用 SSR 框架如 Vite + vue 3 + vue-router 时,createSSRApp() 通常与 renderToString() 配合使用。以下是典型的服务端渲染流程:

import { createSSRApp } from 'vue'
import App from './App.vue'
import { renderToString } from 'vue/server-renderer'

export async function render(url) {
  const app = createSSRApp(App)
  const html = await renderToString(app) // 将应用渲染成 HTML 字符串
  return html
}
  • renderToString(app):将 createSSRApp() 创建的实例渲染成 HTML 字符串
  • export async function render:暴露一个异步函数,方便服务器调用

这种方式能让服务端根据请求的 URL 动态生成 HTML,并发送给浏览器,实现真正的 SSR。

createSSRApp() 与插件、状态管理的集成

createSSRApp() 也可以像 createApp() 一样支持 Vue 插件和状态管理的集成。例如,你可以将 Vue Router 与 Pinia 插件注入到 SSR 应用中:

import { createSSRApp } from 'vue'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'

export function createApp() {
  const app = createSSRApp(App)
  const pinia = createPinia()
  app.use(pinia)
  app.use(router)
  return { app, router, pinia }
}
  • app.use(pinia):注册 Pinia 状态管理库
  • app.use(router):注册 Vue Router
  • 返回对象:在 SSR 服务器中,可能需要访问这些对象进行进一步处理(如填充状态)

createSSRApp() 常见问题

  • Q1:createSSRApp 和 createApp 有什么区别?
    A:createSSRApp() 是为服务端渲染设计的,而 createApp() 用于客户端。createSSRApp() 生成的实例能在服务端被 renderToString() 渲染。

  • Q2:createSSRApp() 必须和 renderToString() 一起使用吗?
    A:是的,因为 createSSRApp() 是服务端专用的创建函数,没有渲染函数它无法生成 HTML。

  • Q3:如何处理 SSR 中的异步数据?
    A:可以使用 async setup()onBeforeRender() 钩子来处理 SSR 中的异步逻辑,确保数据在渲染前已加载。

  • Q4:createSSRApp() 能否在浏览器中运行?
    A:不能。createSSRApp() 创建的应用实例仅用于服务端,客户端仍需使用 createApp()

总结

createSSRApp() 是 Vue 3 实现服务端渲染的核心函数,配合 renderToString() 使用可提升首屏性能和 SEO 效果,适合构建高性能的 SSR 应用。