vue3+vite 怎么实现服务端渲染

vue3+vite 怎么实现服务端渲染
最新回答
寄烟念七晴

2022-05-11 12:20:17

在 Vue3 + Vite 中实现服务端渲染(SSR)需要结合 Vite 的构建能力和 Vue 的服务端渲染支持。以下是实现步骤:

1. 安装必要依赖

确保已安装 Vue3 和 Vite,并添加 SSR 相关依赖:

npm install @vue/server-renderer @vitejs/plugin-vue2. 配置 Vite 支持 SSR

修改 vite.config.js,启用 SSR 构建:

import { defineConfig } from 'vite';import vue from '@vitejs/plugin-vue';export default defineConfig({ plugins: [vue()], ssr: { // 可选:配置 SSR 特定选项 noExternal: ['vue'], // 确保 Vue 被打包到 SSR 构建中 }, build: { rollupOptions: { input: { client: resolve(__dirname, 'src/entry-client.js'), // 客户端入口 server: resolve(__dirname, 'src/entry-server.js'), // 服务端入口 }, }, },});3. 创建 SSR 入口文件镇枣客户端入余磨口 (src/entry-client.js)import { createApp } from './main';const app = createApp();app.mount('#app');服务端入口 (src/entry-server.js)import { createApp } from './main';import { renderToString } from '@vue/server-renderer';export async function render(url) { const app = createApp(); const ctx = {}; const html = await renderToString(app, ctx); return { html, ctx };}通用入口 (src/main.js)import { createSSRApp } from 'vue';import App from './App.vue';export function createApp() { const app = createSSRApp(App); return app;}4. 创建服务端框架

使用御毁拆 Node.js(如 Express)处理 SSR 请求:

// server.jsimport express from 'express';import { createServer } from 'vite';import { render } from './src/entry-server';const app = express();async function setupServer() { const vite = await createServer({ root: process.cwd(), server: { middlewareMode: 'ssr' } }); app.use(vite.middlewares); app.get('*', async (req, res) => { try { const { html } = await render(req.url); res.set('Content-Type', 'text/html').end(html); } catch (e) { vite.ssrFixStacktrace(e); console.error(e); res.status(500).end('Internal Server Error'); } }); app.listen(3000, () => console.log('Server running at
http://localhost:3000'
));}setupServer();5. 修改 HTML 模板

在 index.html 中添加占位符,供服务端注入内容:

<!DOCTYPE html><html> <head> <title>Vue3 SSR</title> </head> <body> <div id="app"><!--ssr-outlet--></div> <script type="module" src="/src/entry-client.js"></script> </body></html>6. 构建与运行开发模式node server.js

Vite 会处理客户端和服务端代码的热更新。

生产构建vite build && node server.js

Vite 会生成客户端和服务端构建文件,服务端代码用于动态渲染。

7. 关键注意事项
  • 客户端激活:确保客户端入口 (entry-client.js) 与服务端渲染的 HTML 结构一致,避免 hydration 不匹配。
  • 状态管理:若使用 Pinia/Vuex,需在服务端和客户端同步状态(通过 ctx 传递)。
  • 路由支持:若使用 Vue Router,需在 createApp 中配置路由,并在服务端根据 URL 匹配路由。
8. 多页应用与 SSR 结合

若需在 SSR 中实现多页应用(MPA),需为每个页面配置独立的入口和路由:

// vite.config.jsbuild: { rollupOptions: { input: { home: resolve(__dirname, 'src/home/entry-client.js'), about: resolve(__dirname, 'src/about/entry-client.js'), }, },}

服务端需根据请求路径动态选择渲染逻辑。

总结

Vue3 + Vite 的 SSR 实现需配置双入口(客户端/服务端)、服务端框架(如 Express)和构建流程。多页应用可通过扩展入口配置支持。完整示例可参考

Vite SSR 官方文档