vue3中SSR函数
在 Vue 3 中,SSR(Server-Side Rendering,服务端渲染) 是一种将 Vue 应用在服务器端渲染为 HTML 字符串,然后发送到客户端的技术。SSR 可以提升应用的性能(特别是首屏加载速度)和 SEO(搜索引擎优化)。
以下是 Vue 3 中 SSR 的详细解析和实现方法。
- SSR 的优势
-
更快的首屏加载:服务器直接返回渲染好的 HTML,减少客户端的渲染时间。
-
更好的 SEO:搜索引擎可以抓取服务器渲染的 HTML 内容。
-
更好的用户体验:用户可以看到更快的页面加载和交互。
- Vue 3 SSR 的核心概念
(1) createSSRApp
Vue 3 提供了 createSSRApp 函数,用于创建支持 SSR 的 Vue 应用实例。
(2) renderToString
renderToString 函数用于将 Vue 应用渲染为 HTML 字符串。
(3) 客户端激活(Hydration)
在客户端,Vue 会将服务器渲染的 HTML 激活为可交互的 Vue 应用。
- 实现 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
- SSR 的注意事项
生命周期钩子:在 SSR 中,mounted 和 beforeMount 钩子不会在服务器端执行。
数据预取:需要在服务器端预取数据,并在客户端激活时保持数据一致。
状态管理:使用 Vuex 或 Pinia 时,需要确保服务器端和客户端的状态一致。
总结
Vue 3 的 SSR 功能通过 createSSRApp 和 renderToString 实现,可以显著提升应用的性能和 SEO。通过合理的配置和构建,可以在服务器端渲染 Vue 应用,并在客户端激活为可交互的应用。SSR 是开发高性能、SEO 友好的 Vue 应用的重要技术。
更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github