vue实现ssr
Vue SSR 实现方法
Vue.js 的服务端渲染(SSR)可以通过官方提供的 vue-server-renderer 库实现。以下是核心实现步骤:
基础项目结构
需要区分客户端和服务端入口文件:
entry-client.js:客户端入口,挂载 Vue 实例到 DOMentry-server.js:服务端入口,返回渲染的 HTML 字符串- 通用 App 组件:
App.vue需为通用代码
服务端配置
安装必要依赖:
npm install vue-server-renderer express
服务端示例代码(Node.js):
const express = require('express')
const { createBundleRenderer } = require('vue-server-renderer')
const server = express()
// 读取生成的服务器 bundle 文件
const renderer = createBundleRenderer(serverBundle, {
template: fs.readFileSync('./index.template.html', 'utf-8')
})
server.get('*', (req, res) => {
const context = { url: req.url }
renderer.renderToString(context, (err, html) => {
if (err) { /* 错误处理 */ }
res.end(html)
})
})
客户端激活
客户端需要特殊处理以复用 SSR 输出的 DOM:
import { createApp } from './app'
const app = createApp()
// 在挂载前判断是否已服务端渲染
if (window.__INITIAL_STATE__) {
app.$store.replaceState(window.__INITIAL_STATE__)
}
app.$mount('#app')
构建配置
需要分别生成客户端和服务端构建包:
// webpack.server.config.js
module.exports = {
target: 'node',
entry: './entry-server.js',
output: {
libraryTarget: 'commonjs2'
}
}
// webpack.client.config.js
module.exports = {
entry: './entry-client.js'
}
数据预取
在路由组件中定义 asyncData 方法:
export default {
asyncData({ store }) {
return store.dispatch('fetchData')
}
}
服务端渲染时通过匹配路由调用预取方法:

const matchedComponents = router.getMatchedComponents()
await Promise.all(
matchedComponents.map(Component => {
if (Component.asyncData) {
return Component.asyncData(store)
}
})
)
常见问题解决
- 客户端激活警告:确保客户端和服务端生成的 DOM 结构完全一致
- 内存泄漏:避免在服务端使用全局变量或单例模式
- 第三方库兼容:检查库是否支持 SSR 环境
进阶优化
- 使用
lru-cache实现页面级缓存 - 流式渲染(Streaming)提升首屏性能
- 通过
vue-meta管理头部标签
官方提供了完整的 SSR 指南和示例项目,可作为进一步参考。






