当前位置:首页 > VUE

vue实现ssr渲染

2026-01-19 19:38:44VUE

Vue SSR 实现方法

Vue.js 的服务器端渲染(SSR)通过将 Vue 应用在服务器端生成 HTML 字符串,再发送到客户端激活,可提升首屏加载速度和 SEO 友好性。

基础配置

安装必要依赖:

npm install vue vue-server-renderer express

创建服务器入口文件(server.js):

const express = require('express')
const { createRenderer } = require('vue-server-renderer')
const server = express()

const renderer = createRenderer({
  template: require('fs').readFileSync('./index.template.html', 'utf-8')
})

server.get('*', (req, res) => {
  const app = new Vue({
    data: { url: req.url },
    template: `<div>访问的URL是:{{ url }}</div>`
  })

  renderer.renderToString(app, (err, html) => {
    if (err) {
      res.status(500).end('Internal Server Error')
      return
    }
    res.end(html)
  })
})

server.listen(8080)

客户端激活

创建客户端入口文件(client.js):

import Vue from 'vue'
import App from './App.vue'

new Vue({
  el: '#app',
  render: h => h(App)
})

需要配置 webpack 分别打包客户端和服务端代码:

// webpack.client.config.js
module.exports = {
  entry: './client.js',
  output: {
    filename: 'client-bundle.js'
  }
}

// webpack.server.config.js
module.exports = {
  target: 'node',
  entry: './server.js',
  output: {
    filename: 'server-bundle.js',
    libraryTarget: 'commonjs2'
  }
}

路由处理

使用 vue-router 时需注意:

vue实现ssr渲染

// router.js
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export function createRouter() {
  return new Router({
    mode: 'history',
    routes: [...]
  })
}

// 在服务器端需要匹配路由
import { createRouter } from './router'
const router = createRouter()
router.push(req.url)

数据预取

在组件中添加 serverPrefetch 钩子:

export default {
  async serverPrefetch() {
    await this.fetchData()
  },
  methods: {
    fetchData() {
      return api.get('/data')
    }
  }
}

服务器端需处理数据预取:

const matchedComponents = router.getMatchedComponents()
await Promise.all(
  matchedComponents.map(Component => {
    if (Component.serverPrefetch) {
      return Component.serverPrefetch()
    }
  })
)

状态管理

使用 Vuex 时需注意状态同步:

vue实现ssr渲染

// store.js
export function createStore() {
  return new Vuex.Store({...})
}

// 服务器端需防止状态污染
const store = createStore()
const app = new Vue({
  router,
  store,
  render: h => h(App)
})

生产环境优化

建议使用官方推荐的 Nuxt.js 框架,它封装了 Vue SSR 的最佳实践:

npm install -g create-nuxt-app
create-nuxt-app my-project

Nuxt.js 自动处理以下问题:

  • 自动配置 webpack
  • 内置路由系统
  • 异步数据获取
  • 静态文件服务
  • 代码分割

常见问题解决

客户端激活失败时检查:

  • 确保服务器输出与客户端挂载的 DOM 结构完全一致
  • 避免在模板中使用客户端特有的 API(如 window)
  • 检查 hydration 不匹配警告

性能优化建议:

  • 使用 micro caching 缓存渲染结果
  • 实施组件级缓存
  • 避免在服务器渲染期间产生副作用
  • 使用 keep-alive 缓存组件

标签: vuessr
分享给朋友:

相关文章

vue实现视频开场

vue实现视频开场

使用 Vue 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依…

vue实现条件判断

vue实现条件判断

Vue 条件判断实现方法 Vue 提供了多种方式实现条件判断,可以根据不同场景选择合适的方式。 v-if / v-else-if / v-else 这是 Vue 中最常用的条件渲染指令,根据表达式…

vue 页签实现

vue 页签实现

Vue 页签实现方法 在 Vue 中实现页签功能通常涉及动态组件、路由或状态管理。以下是几种常见的实现方式: 使用动态组件 通过 Vue 的 <component> 动态组件结合 v-…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPa…

vue实现安全免登录

vue实现安全免登录

Vue 实现安全免登录的方案 免登录功能通常通过持久化认证状态(如 Token)实现,但需兼顾安全性。以下是基于 Vue 的常见实现方案: 基于 Token 的免登录 登录成功后存储 Toke…

vue实现生成二维码

vue实现生成二维码

使用qrcode.vue库生成二维码 安装qrcode.vue库: npm install qrcode.vue --save 在Vue组件中使用: <template> <…