跳转至

Nuxt Vue全栈框架

一句话概述:Nuxt 是基于Vue.js的全栈框架,提供服务端渲染、自动路由、模块生态等功能,是Vue开发者的首选全栈方案。

核心知识点表

概念白话解释
Nuxt 3当前主力版本,基于Vue 3 + Vite + Nitro引擎
NitroNuxt的服务端引擎,支持部署到任何平台
Auto Import自动导入,组件和composables不需要手动import
File-based Routing文件即路由,pages/about.vue/about
ComposablesVue 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 3Next.js 16SvelteKit
基于Vue 3React 19Svelte 5
自动导入原生支持不支持不支持
状态管理useState/PiniauseState/ZustandStores
服务端引擎Nitro(跨平台)Node.jsNode.js/Adapter
模块生态200+官方模块npm生态npm生态

面试建议:如果面试Vue相关岗位,Nuxt是必知框架。重点讲:1)Nuxt 3的auto-import减少样板代码;2)Nitro引擎支持部署到任何平台(Vercel/Cloudflare/AWS);3)useFetch vs $fetch的区别。