vue3中SSR函数

414 阅读2分钟

vue3中SSR函数

在 Vue 3 中,SSR(Server-Side Rendering,服务端渲染) 是一种将 Vue 应用在服务器端渲染为 HTML 字符串,然后发送到客户端的技术。SSR 可以提升应用的性能(特别是首屏加载速度)和 SEO(搜索引擎优化)。

以下是 Vue 3 中 SSR 的详细解析和实现方法。

  1. SSR 的优势
  • 更快的首屏加载:服务器直接返回渲染好的 HTML,减少客户端的渲染时间。

  • 更好的 SEO:搜索引擎可以抓取服务器渲染的 HTML 内容。

  • 更好的用户体验:用户可以看到更快的页面加载和交互。

  1. Vue 3 SSR 的核心概念

(1) createSSRApp

Vue 3 提供了 createSSRApp 函数,用于创建支持 SSR 的 Vue 应用实例。

(2) renderToString

renderToString 函数用于将 Vue 应用渲染为 HTML 字符串。

(3) 客户端激活(Hydration)

在客户端,Vue 会将服务器渲染的 HTML 激活为可交互的 Vue 应用。

  1. 实现 Vue 3 SSR 的步骤

(1) 安装依赖

npm install vue@next
npm install express
npm install @vue/server-renderer

(2) 创建 Vue 应用

// src/App.vue
<template>
  <div id="app">
    <h1>{{ message }}</h1>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const message = ref('Hello, Vue 3 SSR!');
</script>
// src/entry-client.js
import { createSSRApp } from 'vue';
import App from './App.vue';

const app = createSSRApp(App);
app.mount('#app');
// src/entry-server.js
import { createSSRApp } from 'vue';
import App from './App.vue';

export function createApp() {
  const app = createSSRApp(App);
  return { app };
}

(3) 服务器端渲染

使用 Express 创建一个服务器,并在服务器端渲染 Vue 应用。

// server.js
import express from 'express';
import { renderToString } from '@vue/server-renderer';
import { createApp } from './src/entry-server.js';

const server = express();

server.get('*', async (req, res) => {
  const { app } = createApp();

  // 将 Vue 应用渲染为 HTML 字符串
  const html = await renderToString(app);

  // 返回完整的 HTML 页面
  res.send(`
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Vue 3 SSR</title>
      </head>
      <body>
        <div id="app">${html}</div>
        <script src="/dist/client.js"></script>
      </body>
    </html>
  `);
});

server.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

(4) 客户端激活

在客户端,使用 entry-client.js 激活服务器渲染的 HTML。

// src/entry-client.js
import { createSSRApp } from 'vue';
import App from './App.vue';

const app = createSSRApp(App);
app.mount('#app');

(5) 构建脚本

使用构建工具(如 Webpack 或 Vite)分别构建客户端和服务器端代码。

Webpack 配置

// webpack.client.config.js
const path = require('path');

module.exports = {
  entry: './src/entry-client.js',
  output: {
    filename: 'client.js',
    path: path.resolve(__dirname, 'dist'),
  },
  // 其他配置...
};

// webpack.server.config.js
const path = require('path');

module.exports = {
  entry: './src/entry-server.js',
  target: 'node',
  output: {
    filename: 'server.js',
    path: path.resolve(__dirname, 'dist'),
    libraryTarget: 'commonjs2',
  },
  // 其他配置...
};

运行构建命令:

npx webpack --config webpack.client.config.js
npx webpack --config webpack.server.config.js
  1. SSR 的注意事项

生命周期钩子:在 SSR 中,mountedbeforeMount 钩子不会在服务器端执行。

数据预取:需要在服务器端预取数据,并在客户端激活时保持数据一致。

状态管理:使用 Vuex 或 Pinia 时,需要确保服务器端和客户端的状态一致。

总结

Vue 3 的 SSR 功能通过 createSSRApprenderToString 实现,可以显著提升应用的性能和 SEO。通过合理的配置和构建,可以在服务器端渲染 Vue 应用,并在客户端激活为可交互的应用。SSR 是开发高性能、SEO 友好的 Vue 应用的重要技术。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github