当前位置:首页 > 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
分享给朋友:

相关文章

django vue实现

django vue实现

Django与Vue.js整合实现方案 Django作为后端框架与Vue.js作为前端框架的整合,可以通过以下方式实现: 分离式开发 前后端完全分离,Django仅提供API接口,Vue.js通过a…

vue实现监听

vue实现监听

监听数据变化 在Vue中,可以通过watch选项或$watch方法监听数据的变化。watch适用于组件选项内声明式监听,$watch适用于动态监听。 // 选项式API export default…

vue实现日历

vue实现日历

Vue 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成当…

vue实现Pop

vue实现Pop

Vue 实现 Popover 组件的方法 使用 Vue 内置指令 v-show/v-if 和事件监听 通过 Vue 的指令和事件绑定实现基础的 Popover 功能。定义一个布尔值控制 Popover…

vue分页实现

vue分页实现

实现Vue分页的几种方法 使用Element UI的分页组件 安装Element UI库后,可以直接使用其分页组件。以下是一个基本示例: <template> <div>…

vue实现rem适配

vue实现rem适配

Vue 项目中实现 REM 适配 REM(Root EM)是一种基于根元素(html)字体大小的相对单位,常用于移动端适配。以下是在 Vue 项目中实现 REM 适配的详细方法。 安装 postcs…