当前位置:首页 > VUE

实现 vue ssr

2026-03-27 08:12:02VUE

Vue SSR 实现方法

Vue SSR(Server-Side Rendering)允许在服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是实现 Vue SSR 的核心步骤:

基础配置

安装必要依赖:

npm install vue vue-server-renderer express -S

创建服务器入口文件(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(html)
  })
})

server.listen(8080)

项目结构优化

典型 SSR 项目结构:

src/
├── components/
├── App.vue
├── app.js      # 通用入口
├── entry-client.js # 客户端入口
└── entry-server.js # 服务器入口

创建通用应用实例(app.js):

import Vue from 'vue'
import App from './App.vue'

export function createApp() {
  const app = new Vue({
    render: h => h(App)
  })
  return { app }
}

客户端激活

客户端入口(entry-client.js):

import { createApp } from './app'

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

服务器入口(entry-server.js):

import { createApp } from './app'

export default context => {
  const { app } = createApp()
  return app
}

Webpack 配置

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

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

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

数据预取

在组件中添加 asyncData 方法:

export default {
  asyncData({ store, route }) {
    return store.dispatch('fetchData', route.params.id)
  }
}

服务器端数据预取:

// 在 entry-server.js 中
Promise.all(matchedComponents.map(Component => {
  if (Component.asyncData) {
    return Component.asyncData({
      store,
      route: router.currentRoute
    })
  }
})).then(() => {
  // 渲染完成后将状态注入到 HTML
  context.state = store.state
  resolve(app)
})

生产部署

使用 vue-server-renderer 的 bundle renderer:

实现 vue ssr

const { createBundleRenderer } = require('vue-server-renderer')
const renderer = createBundleRenderer(serverBundle, {
  template,
  clientManifest
})

注意事项

  • 避免在 beforeCreatecreated 生命周期中使用浏览器特有 API
  • 使用 v-if 而不是 v-show 进行条件渲染
  • 路由模式应使用 history 模式
  • 所有自定义指令在 SSR 环境下需要特殊处理

通过以上步骤可以实现基本的 Vue SSR 应用。对于更复杂的场景,建议使用 Nuxt.js 等现成框架简化开发流程。

标签: vuessr
分享给朋友:

相关文章

vue实现单点

vue实现单点

Vue 实现单点登录(SSO)方案 单点登录(SSO)允许用户在多个相关但独立的系统中使用同一组凭证登录。以下是基于 Vue 的实现方案: 基于 OAuth2/OpenID Connect 的实现…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue nexttick实现

vue nexttick实现

Vue 中 nextTick 的实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它的核心实现依赖于 JavaScript 的事件循环机制。…

vue实现日历

vue实现日历

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

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…

vue实现甘特图

vue实现甘特图

使用 Vue 实现甘特图 基于开源库(如 vue-ganttastic) 安装依赖库: npm install vue-ganttastic 示例代码: <template> &l…