当前位置:首页 > 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 需分别配置客户端和服务端构建:

// 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 方案,需根据实际项目需求调整具体实现细节。

实现 vue ssr

标签: vuessr
分享给朋友:

相关文章

vue 实现全选

vue 实现全选

Vue 实现全选功能 在 Vue 中实现全选功能通常需要结合复选框的状态管理,以下是几种常见的实现方式: 使用 v-model 绑定数组 通过 v-model 绑定一个数组来管理选中的项,全选时将…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition…

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 t…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue实现分类

vue实现分类

Vue实现分类功能的方法 使用v-for和计算属性 通过计算属性对数据进行分类处理,结合v-for渲染分类后的列表。示例代码: <template> <div>…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transi…