当前位置:首页 > 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 实现服务端数据预取:

vue实现ssr渲染

// 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 缓存页面:

vue实现ssr渲染

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/'
}

异步组件处理:

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

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

标签: vuessr
分享给朋友:

相关文章

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template>…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们…