当前位置:首页 > VUE

vue实现ssr渲染

2026-02-20 11:45:28VUE

Vue SSR 基础实现

Vue SSR(Server-Side Rendering)通过服务端生成完整的 HTML 字符串,提升首屏加载速度和 SEO 友好性。核心依赖 vue-server-renderer 和 Node.js 服务器。

安装必要依赖:

npm install vue vue-server-renderer express

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

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer()

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(`
      <!DOCTYPE html>
      <html>
        <head><title>Vue SSR</title></head>
        <body>${html}</body>
      </html>
    `)
  })
})

server.listen(8080)

项目结构优化

典型 SSR 项目结构应分离客户端和服务端代码:

src/
├── entry-client.js # 客户端入口
├── entry-server.js # 服务端入口
├── App.vue         # 根组件
└── router.js       # 路由配置

服务端入口示例(entry-server.js):

import { createApp } from './app'

export default context => {
  return new Promise((resolve, reject) => {
    const { app, router } = createApp()
    router.push(context.url)
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()
      if (!matchedComponents.length) {
        return reject({ code: 404 })
      }
      resolve(app)
    }, reject)
  })
}

数据预取与状态同步

使用 vuex 实现服务端数据预取:

// store.js
export function createStore() {
  return new Vuex.Store({
    state: { items: [] },
    actions: {
      fetchItems({ commit }) {
        return apiCall().then(items => commit('setItems', items))
      }
    }
  })
}

// 组件内定义serverPrefetch
export default {
  serverPrefetch() {
    return this.$store.dispatch('fetchItems')
  }
}

客户端混合时同步状态:

// entry-client.js
if (window.__INITIAL_STATE__) {
  store.replaceState(window.__INITIAL_STATE__)
}

构建配置

需要分别生成服务端和客户端构建包:

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

// webpack.client.config.js
module.exports = {
  entry: { app: './src/entry-client.js' }
}

生产环境优化

使用 LRU 缓存页面:

const microCache = LRU({
  max: 100,
  maxAge: 1000 * 60 // 1分钟缓存
})

server.get('*', (req, res) => {
  const hit = microCache.get(req.url)
  if (hit) return res.end(hit)

  // ...渲染逻辑
  microCache.set(req.url, html)
})

启用 bundleRenderer 提升性能:

const { createBundleRenderer } = require('vue-server-renderer')
const renderer = createBundleRenderer(serverBundle, {
  runInNewContext: false,
  template: fs.readFileSync('./index.template.html', 'utf-8')
})

常见问题解决

处理客户端激活警告: 确保客户端构建包含 vue-template-compiler,版本与服务端 Vue 一致。

静态资源路径问题: 使用 publicPath 配置:

// webpack.client.config.js
output: {
  publicPath: '/dist/'
}

异步组件处理:

vue实现ssr渲染

// router.js
components: () => import('./Foo.vue').then(c => c.default || c)

以上实现方案可根据项目需求进行扩展,建议结合官方文档和实际场景调整配置参数。

标签: vuessr
分享给朋友:

相关文章

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue拼图实现

vue拼图实现

实现 Vue 拼图游戏的方法 使用 Vue 组件和动态数据绑定 创建一个 Vue 组件来管理拼图的状态和逻辑。通过 v-for 动态渲染拼图块,利用 v-bind 绑定样式和位置。拼图块的数据可以存储…

vue实现mvvm

vue实现mvvm

Vue 实现 MVVM 模式 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 是其典型实现之一。MVVM 的核心是通过数据绑定和响应式系统实现视图与数据的自动同步。…

vue实现openoffice

vue实现openoffice

Vue 中集成 OpenOffice 的实现方法 在 Vue 项目中集成 OpenOffice 通常需要通过后端服务或现有库实现文档的预览和编辑功能。以下是几种常见的实现方式: 使用 OnlyOff…