当前位置:首页 > VUE

vue实现ssr

2026-02-10 07:56:31VUE

Vue 实现 SSR(服务端渲染)的方法

Vue 的服务端渲染(SSR)可以通过官方提供的 vue-server-renderer 库实现,以下是具体实现步骤和注意事项。

基本配置

安装必要的依赖包:

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 lang="en">
        <head><title>Vue SSR</title></head>
        <body>${html}</body>
      </html>
    `);
  });
});

server.listen(8080);

结合 Vue 单文件组件

为了支持单文件组件(.vue),需要使用 webpack 打包客户端和服务端代码。

安装额外依赖:

npm install webpack webpack-cli vue-loader vue-template-compiler @babel/core @babel/preset-env babel-loader css-loader -D

配置 webpack.server.config.js

const path = require('path');
const { VueLoaderPlugin } = require('vue-loader');

module.exports = {
  target: 'node',
  entry: './src/entry-server.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'server-bundle.js',
    libraryTarget: 'commonjs2'
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  },
  plugins: [new VueLoaderPlugin()]
};

客户端激活(Hydration)

客户端需要打包独立的入口文件以激活静态 HTML。创建 entry-client.js

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

const app = new Vue({
  render: h => h(App)
});

app.$mount('#app');

服务端数据预取

在服务端渲染时预取数据,可以通过 asyncData 方法实现。修改 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 });
      }

      Promise.all(
        matchedComponents.map(Component => {
          if (Component.asyncData) {
            return Component.asyncData({
              store,
              route: router.currentRoute
            });
          }
        })
      ).then(() => {
        context.state = store.state;
        resolve(app);
      }).catch(reject);
    }, reject);
  });
};

使用 Nuxt.js 简化流程

对于更复杂的项目,可以直接使用 Nuxt.js 框架,它内置了 Vue SSR 的最佳实践配置。

安装 Nuxt.js:

npx create-nuxt-app my-project

Nuxt.js 自动处理路由、状态管理和构建配置,只需在 pages 目录下创建组件即可实现 SSR。

vue实现ssr

注意事项

  • 避免在服务端渲染时使用浏览器特有的 API(如 windowdocument),需通过 process.client 判断环境。
  • 组件生命周期钩子中,beforeCreatecreated 会在服务端和客户端各执行一次,避免重复操作。
  • 静态资源路径需使用绝对路径或在构建时正确处理。

以上方法涵盖了从手动配置到使用框架的 Vue SSR 实现方式,可根据项目需求选择适合的方案。

标签: vuessr
分享给朋友:

相关文章

vue实现triger

vue实现triger

在Vue中实现触发器(trigger)功能通常涉及自定义事件或DOM事件触发。以下是几种常见场景的实现方法: 自定义事件触发 通过$emit方法触发父组件中监听的自定义事件: // 子组件 thi…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <template>…

vue实现vnc

vue实现vnc

Vue 实现 VNC 客户端 在 Vue 项目中实现 VNC 客户端功能,可以通过集成现有的 VNC 客户端库或组件完成。以下是具体实现方法: 安装依赖库 使用 noVNC 或其他 VNC 客户端…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue监听实现

vue监听实现

Vue 监听实现方法 在 Vue 中可以通过多种方式实现监听数据变化或事件触发,以下是常见的几种方法: 使用 watch 选项 watch 是 Vue 提供的核心功能之一,用于观察和响应 Vue 实…

vue 实现上传

vue 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…