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 应用。