Vue 的 SSR(Nuxt.js)原理和适用场景?
Nuxt 3 基本结构
pages/
index.vue → /
about.vue → /about
users/[id].vue → /users/:id
server/
api/ → API 路由
nuxt.config.ts → 配置
自动路由
<!-- pages/index.vue -->
<template>
<div>Home Page</div>
</template>
<!-- pages/users/[id].vue -->
<script setup>
const route = useRoute()
const { id } = route.params
</script>
数据获取
const { data: users } = await useFetch('/api/users')
const { data } = await useAsyncData('users', () => {
return $fetch('/api/users')
})
渲染模式
export default defineNuxtConfig({
ssr: true,
routeRules: {
'/': { prerender: true },
'/blog/**': { ssr: true },
'/admin/**': { ssr: false },
'/api/**': { cors: true }
}
})
Vue SSR 原理
import { createSSRApp } from 'vue'
import { renderToString } from 'vue/server-renderer'
export async function render(url) {
const app = createSSRApp(App)
const router = createRouter({ history: createMemoryHistory() })
app.use(router)
await router.push(url)
await router.isReady()
const html = await renderToString(app)
return html
}
Hydration
import { createSSRApp } from 'vue'
const app = createSSRApp(App)
app.use(router)
app.mount('#app')
Nuxt vs Next 对比
| 特性 |
Nuxt 3 |
Next 13+ |
| 框架 |
Vue 3 |
React 18 |
| 路由 |
文件系统 |
文件系统 |
| 数据获取 |
useFetch/useAsyncData |
server components |
| API 路由 |
server/api |
app/api |
| 渲染模式 |
混合 |
混合 |
| 开发体验 |
零配置 |
零配置 |
适用场景
- ✅ 内容网站(博客、电商、文档)
- ✅ 需要 SEO 的应用
- ✅ 首屏性能要求高
- ❌ 后台管理系统
- ❌ 需要复杂客户端交互的应用
同分类其他题目