Nuxt Vue全栈框架
一句话概述:Nuxt 是基于Vue.js的全栈框架,提供服务端渲染、自动路由、模块生态等功能,是Vue开发者的首选全栈方案。
核心知识点表
| 概念 | 白话解释 |
|---|
| Nuxt 3 | 当前主力版本,基于Vue 3 + Vite + Nitro引擎 |
| Nitro | Nuxt的服务端引擎,支持部署到任何平台 |
| Auto Import | 自动导入,组件和composables不需要手动import |
| File-based Routing | 文件即路由,pages/about.vue → /about |
| Composables | Vue 3的组合式函数,可复用的逻辑单元 |
| Layers | 层,可以继承和共享Nuxt配置和代码 |
| Modules | 模块,Nuxt的插件生态 |
| useFetch | 数据获取组合函数,自带SSR支持和缓存 |
安装配置
# 创建Nuxt项目
npx nuxi init my-nuxt-app # 使用Nuxt CLI创建
cd my-nuxt-app
npm install # 安装依赖
npm run dev # 启动开发服务器 → http://localhost:3000
项目结构
my-nuxt-app/
├── app.vue # 应用入口
├── pages/ # 页面(文件即路由)
│ ├── index.vue # 首页 → /
│ └── about.vue # 关于 → /about
├── components/ # 组件(自动导入)
├── composables/ # 组合函数(自动导入)
├── server/ # 服务端API
│ └── api/
│ └── hello.ts # → /api/hello
├── layouts/ # 布局
├── middleware/ # 路由中间件
├── plugins/ # 插件
├── public/ # 静态资源
└── nuxt.config.ts # Nuxt配置
基本使用
页面和路由
<!-- pages/index.vue — 首页 -->
<template>
<div>
<h1>欢迎来到Nuxt</h1>
<NuxtLink to="/about">关于页面</NuxtLink> <!-- Nuxt路由链接 -->
</div>
</template>
<!-- pages/users/[id].vue — 动态路由 -->
<template>
<div>
<h1>用户 {{ route.params.id }}</h1>
</div>
</template>
<script setup>
const route = useRoute() // 获取路由信息(自动导入,不需要import)
</script>
数据获取
<!-- pages/posts.vue -->
<template>
<div>
<div v-if="status === 'pending'">加载中...</div>
<div v-else-if="error">错误: {{ error.message }}</div>
<ul v-else>
<li v-for="post in data" :key="post.id">{{ post.title }}</li>
</ul>
</div>
</template>
<script setup>
// useFetch: Nuxt内置的数据获取函数,自动处理SSR
const { data, status, error } = await useFetch('/api/posts')
// 会在服务端获取数据,客户端直接用结果,不重复请求
</script>
服务端API
// server/api/posts.get.ts(GET /api/posts)
export default defineEventHandler(async (event) => {
// 这段代码只在服务端运行
const posts = [
{ id: 1, title: '第一篇文章' },
{ id: 2, title: '第二篇文章' },
]
return posts // 自动序列化为JSON
})
// server/api/posts.post.ts(POST /api/posts)
export default defineEventHandler(async (event) => {
const body = await readBody(event) // 读取请求体
// 保存到数据库...
return { message: '创建成功', data: body }
})
组合函数(Composables)
// composables/useCounter.ts(自动导入,全局可用)
export const useCounter = () => {
const count = useState('counter', () => 0) // 跨组件共享状态
const increment = () => count.value++
const decrement = () => count.value--
return { count, increment, decrement }
}
高级用法
中间件(鉴权)
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
const user = useAuth() // 假设有一个鉴权composable
if (!user.value && to.path !== '/login') {
return navigateTo('/login') // 未登录重定向
}
})
SEO优化
<script setup>
// 页面级SEO
useHead({
title: '我的页面标题',
meta: [
{ name: 'description', content: '页面描述' },
{ property: 'og:title', content: '分享标题' },
],
})
// 动态SEO
useSeoMeta({
title: () => `${post.value?.title} - 我的博客`,
ogTitle: () => post.value?.title,
description: () => post.value?.excerpt,
})
</script>
常用模块
// nuxt.config.ts
export default defineNuxtConfig({
modules: [
'@nuxtjs/tailwindcss', // Tailwind CSS集成
'@pinia/nuxt', // Pinia状态管理
'@nuxt/image', // 图片优化
'@nuxtjs/i18n', // 国际化
'@vueuse/nuxt', // Vue工具集
],
})
常见报错与解决
| 报错信息 | 原因 | 解决方案 |
|---|
500 Internal Server Error | 服务端代码报错 | 查看终端错误日志 |
Auto-import not working | 文件不在约定目录 | 确保在components/composables/目录下 |
Hydration mismatch | 服务端和客户端内容不同 | 用<ClientOnly>包裹仅客户端组件 |
useFetch在onMounted里不生效 | useFetch应在setup顶层调用 | 移到setup顶层或用$fetch |
速查表
# CLI命令
npx nuxi init app # 创建项目
npm run dev # 开发模式
npm run build # 构建
npm run preview # 预览构建结果
npx nuxi add page about # 添加页面
npx nuxi add component Card # 添加组件
npx nuxi add composable useAuth # 添加composable
npx nuxi add middleware auth # 添加中间件
同类工具对比
| 特性 | Nuxt 3 | Next.js 16 | SvelteKit |
|---|
| 基于 | Vue 3 | React 19 | Svelte 5 |
| 自动导入 | 原生支持 | 不支持 | 不支持 |
| 状态管理 | useState/Pinia | useState/Zustand | Stores |
| 服务端引擎 | Nitro(跨平台) | Node.js | Node.js/Adapter |
| 模块生态 | 200+官方模块 | npm生态 | npm生态 |
面试建议:如果面试Vue相关岗位,Nuxt是必知框架。重点讲:1)Nuxt 3的auto-import减少样板代码;2)Nitro引擎支持部署到任何平台(Vercel/Cloudflare/AWS);3)useFetch vs $fetch的区别。