当前位置:首页 > VUE

实现 vue ssr

2026-01-07 07:41:18VUE

Vue SSR 实现方法

Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法:

基础配置

安装必要依赖:

npm install vue vue-server-renderer express

创建基础服务器文件(server.js):

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

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

app.get('*', (req, res) => {
  const context = { url: req.url }
  const app = new Vue({ /* Vue 实例配置 */ })

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

app.listen(3000)

客户端激活

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

import { createApp } from './app'

const { app } = createApp()
app.$mount('#app')

服务端需返回包含客户端脚本的 HTML:

<!-- index.template.html -->
<div id="app">{{{ app }}}</div>
<script src="/dist/client-bundle.js"></script>

路由处理

使用 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: [/* 路由配置 */]
  })
}

服务端路由匹配:

router.onReady(() => {
  const matchedComponents = router.getMatchedComponents()
  if (!matchedComponents.length) return reject({ code: 404 })
  resolve(app)
})

数据预取

使用 vuex 进行服务端数据预取:

// store.js
export function createStore() {
  return new Vuex.Store({
    actions: {
      fetchData({ commit }) {
        return api.getData().then(data => commit('SET_DATA', data))
      }
    }
  })
}

组件内定义静态方法 asyncData

export default {
  asyncData({ store }) {
    return store.dispatch('fetchData')
  }
}

服务端渲染前调用:

const matchedComponents = router.getMatchedComponents()
Promise.all(
  matchedComponents.map(Component => {
    if (Component.asyncData) {
      return Component.asyncData(store)
    }
  })
).then(() => {
  renderer.renderToString(app, (err, html) => {/* ... */})
})

构建配置

Webpack 需分别配置客户端和服务端构建:

实现 vue ssr

// webpack.client.config.js
entry: './client-entry.js',
output: {
  path: path.resolve(__dirname, './dist'),
  filename: 'client-bundle.js'
}

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

生产优化

  • 使用 LRU 缓存组件渲染结果
  • 启用 bundleRendererrunInNewContext: false 选项提升性能
  • 通过 shouldPrefetch 控制资源预加载

注意事项

  • 避免在 beforeCreate/created 生命周期中使用浏览器特有 API
  • 第三方库可能需要特殊处理(如 document 相关操作)
  • 静态资源路径需使用绝对路径

通过以上步骤可实现完整的 Vue SSR 方案,需根据实际项目需求调整具体实现细节。

标签: vuessr
分享给朋友:

相关文章

lua 实现vue

lua 实现vue

在 Lua 中实现类似 Vue 的响应式框架需要模拟 Vue 的核心功能,包括数据绑定、模板渲染和依赖追踪。以下是实现的关键思路和代码示例: 响应式数据绑定 使用 Lua 的 __index 和 _…

实现vue message

实现vue message

实现 Vue 消息提示组件 创建 Message 组件 在 src/components 目录下创建 Message.vue 文件,内容如下: <template> <tran…

vue实现评价

vue实现评价

Vue实现评价功能 数据绑定与双向绑定 Vue的核心特性是数据绑定和双向绑定,通过v-model指令可以轻松实现表单输入与应用状态之间的双向绑定。在评价功能中,可以使用v-model绑定评论文本和评分…

vue实现门户

vue实现门户

Vue 实现门户网站的关键步骤 搭建基础框架 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理多页面路由。门户通常需要响应式布局,可引入 UI 库如 Element P…

vue怎样实现mvvm

vue怎样实现mvvm

Vue 实现 MVVM 的原理 Vue 的 MVVM(Model-View-ViewModel)模式通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 MVVM 的核心机制: 数…

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…