当前位置:首页 > 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 时需注意:

// 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 时需注意状态同步:

// 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 不匹配警告

性能优化建议:

vue实现ssr渲染

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

标签: vuessr
分享给朋友:

相关文章

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue 实现挂载

vue 实现挂载

Vue 实现挂载的基本方法 在 Vue 中,挂载是将 Vue 实例与 DOM 元素关联的过程。通过挂载,Vue 可以管理 DOM 并实现数据绑定和响应式更新。 创建 Vue 实例并挂载 const…

vue实现公告

vue实现公告

Vue 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> &l…

jquery实现vue

jquery实现vue

jQuery 和 Vue.js 是两种不同理念的前端工具,jQuery 以 DOM 操作和事件驱动为核心,而 Vue.js 是数据驱动的现代化框架。如果想用 jQuery 实现类似 Vue 的功能(如…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json):…