当前位置:首页 > 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的结合 在Vue中实现多线程通常通过Web Worker技术完成。Web Worker允许在后台线程中运行脚本,避免阻塞主线程,适合处理计算密集型任务。 使用Web Worker的…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文档…

vue实现按钮

vue实现按钮

Vue 实现按钮的方法 使用原生 HTML 按钮 在 Vue 模板中可以直接使用 HTML 的 <button> 元素,通过 v-on 或 @ 绑定点击事件。 <template&…

vue实现插件

vue实现插件

Vue 插件实现方法 Vue 插件通常用于为 Vue 应用添加全局功能或共享功能。以下是实现 Vue 插件的核心步骤: 插件基本结构 Vue 插件需要暴露一个 install 方法,该方法接收 Vu…

vue路由实现滑动

vue路由实现滑动

实现 Vue 路由滑动效果的方法 使用 Vue Router 结合 CSS 过渡动画 在 Vue Router 的路由视图组件 <router-view> 上添加过渡效果,结合 CSS 实…

vue实现组件跟随

vue实现组件跟随

实现组件跟随的常见方法 使用CSS定位 通过CSS的position: fixed或position: absolute属性实现组件跟随。需要结合JavaScript计算目标元素的位置。 <t…