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在 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.jsVite 会处理客户端和服务端代码的热更新。
生产构建vite build && node server.jsVite 会生成客户端和服务端构建文件,服务端代码用于动态渲染。
7. 关键注意事项若需在 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)和构建流程。多页应用可通过扩展入口配置支持。完整示例可参考