本文基于 Nuxt 3.11.2(2026 年 5 月最新稳定版),全面覆盖 Nuxt 3 核心特性、应用场景与实战示例。
一、Nuxt 3 核心概念与优势
1.1 什么是 Nuxt 3?
Nuxt 3 是基于Vue 3 、Vite 和Nitro引擎的全栈框架,提供服务端渲染 (SSR)、静态站点生成 (SSG)、客户端渲染 (CSR) 等多种渲染模式,同时内置路由、状态管理、API 服务等功能,大幅提升开发效率Nuxt。
1.2 核心优势对比
| 特性 | Nuxt 3 | 传统 Vue 3 | 优势说明 |
|---|---|---|---|
| 渲染模式 | 支持 SSR/SSG/CSR/ISR/Edge | 仅 CSR | 灵活适配不同场景,兼顾 SEO 与性能 |
| 路由系统 | 文件系统路由,自动生成 | 需手动配置 vue-router | 零配置,开发效率提升 50%+ |
| 自动导入 | 组件、Composables、Vue API 自动导入 | 需手动 import | 减少样板代码,代码更简洁Nuxt |
| TypeScript | 原生支持,类型安全 | 需额外配置 | 开发体验更优,减少运行时错误 |
| 构建工具 | Vite + Nitro | 需手动配置 Vite | 启动速度提升 10 倍 +,打包体积更小 |
| 全栈能力 | 内置 API 服务、中间件 | 需额外集成 Node.js | 前后端一体化,减少跨域问题 |
二、环境搭建与项目初始化
2.1 快速创建 Nuxt 3 项目
perl
# 使用nuxi创建项目(推荐)
npx nuxi@latest init my-nuxt3-app
cd my-nuxt3-app
npm install
# 启动开发服务器
npm run dev
2.2 TypeScript 配置(nuxt.config.ts)
php
// nuxt.config.ts
export default defineNuxtConfig({
typescript: {
strict: true, // 启用严格类型检查
typeCheck: true, // 构建时进行类型检查
shim: false // 禁用Vue类型垫片,使用原生类型
},
devtools: { enabled: true } // 启用Nuxt开发者工具
})
2.3 目录结构解析
csharp
my-nuxt3-app/
├── app.vue # 应用入口组件
├── nuxt.config.ts # 项目配置文件
├── package.json # 依赖管理
├── tsconfig.json # TypeScript配置
├── pages/ # 页面组件(自动生成路由)
├── components/ # 组件(自动导入)
├── composables/ # 可复用组合式函数(自动导入)
├── server/ # 服务器端代码(API、中间件)
├── public/ # 静态资源
└── assets/ # 待编译资源(CSS、图片等)
三、核心特性详解与实战示例
3.1 文件系统路由(零配置路由)
基础路由示例
bash
pages/
├── index.vue → / # 首页
├── about.vue → /about # 关于页
├── blog/
│ ├── index.vue → /blog # 博客列表页
│ └── [id].vue → /blog/:id # 博客详情页(动态路由)
└── users/
└── [id]/
└── settings.vue → /users/:id/settings
动态路由与参数获取
xml
<!-- pages/blog/[id].vue -->
<template>
<div>
<h1>博客文章 #{{ postId }}</h1>
<p>{{ post?.content }}</p>
</div>
</template>
<script setup lang="ts">
import type { RouteParams } from 'vue-router'
// 获取路由参数
const route = useRoute()
const postId = route.params.id as string
// 类型安全的路由参数
interface BlogParams extends RouteParams {
id: string
}
const typedParams = route.params as BlogParams
</script>
路由元信息(Page Meta)
xml
<script setup lang="ts">
definePageMeta({
title: '博客详情页', // 页面标题
layout: 'blog', // 指定布局组件
middleware: 'auth' // 应用路由中间件
})
</script>
3.2 数据获取与状态管理
3.2.1 useFetch(通用数据获取)
xml
<template>
<div>
<h1>博客列表</h1>
<div v-if="pending">加载中...</div>
<div v-else-if="error">错误:{{ error.message }}</div>
<ul v-else>
<li v-for="post in data" :key="post.id">
<NuxtLink :to="`/blog/${post.id}`">{{ post.title }}</NuxtLink>
</li>
</ul>
</div>
</template>
<script setup lang="ts">
interface Post {
id: number
title: string
content: string
}
// 类型安全的数据获取
const { data, pending, error, refresh } = await useFetch<Post[]>('/api/posts', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
})
</script>
3.2.2 useAsyncData(更灵活的数据获取)
xml
<script setup lang="ts">
const { data, error } = await useAsyncData('posts', async () => {
const res = await $fetch('/api/posts')
return res as Post[]
}, {
watch: [], // 监听依赖变化自动刷新
initialCache: false, // 禁用初始缓存
staleTime: 60000 // 数据保鲜时间(毫秒)
})
</script>
3.2.3 Pinia 状态管理集成
bash
# 安装Pinia
npm install @pinia/nuxt pinia
typescript
// stores/user.ts
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
id: 0,
name: '',
email: ''
}),
getters: {
isLoggedIn: (state) => state.id !== 0
},
actions: {
async fetchUser(id: number) {
const user = await $fetch(`/api/users/${id}`)
this.$patch(user)
}
}
})
在组件中使用:
xml
<script setup lang="ts">
import { useUserStore } from '~/stores/user'
const userStore = useUserStore()
// 调用action获取用户数据
await userStore.fetchUser(1)
</script>
3.3 组件与 Composables 自动导入
3.3.1 组件自动导入
xml
components/
├── Button.vue → <Button />
├── blog/
│ └── PostCard.vue → <BlogPostCard />
└── ui/
├── Input.vue → <UiInput />
└── Modal.vue → <UiModal />
使用示例:
xml
<template>
<div>
<BlogPostCard :post="post" />
<UiButton @click="openModal">打开模态框</UiButton>
<UiModal v-model:open="isModalOpen">
<p>这是自动导入的模态框组件</p>
</UiModal>
</div>
</template>
3.3.2 Composables 自动导入
javascript
// composables/useCounter.ts
export function useCounter(initialValue = 0) {
const count = ref(initialValue)
const increment = () => count.value++
const decrement = () => count.value--
return { count, increment, decrement }
}
在组件中使用(无需 import):
xml
<script setup lang="ts">
const { count, increment } = useCounter(10)
</script>
3.4 服务器端开发(API 与中间件)
3.4.1 服务器 API 路由
csharp
// server/api/posts/index.get.ts
export default defineEventHandler(async (event) => {
// 从数据库获取数据
const posts = await prisma.post.findMany()
return posts
})
// server/api/posts/[id].get.ts
export default defineEventHandler(async (event) => {
const id = getRouterParam(event, 'id')
const post = await prisma.post.findUnique({
where: { id: Number(id) }
})
if (!post) {
setResponseStatus(event, 404)
return { error: 'Post not found' }
}
return post
})
3.4.2 服务器中间件
scss
// server/middleware/auth.ts
export default defineEventHandler((event) => {
const authHeader = getHeader(event, 'authorization')
if (!authHeader) {
setResponseStatus(event, 401)
return { error: 'Unauthorized' }
}
// 验证token逻辑
const token = authHeader.split(' ')[1]
const isValid = verifyToken(token)
if (!isValid) {
setResponseStatus(event, 403)
return { error: 'Forbidden' }
}
})
3.4.3 服务器工具函数
javascript
// server/utils/db.ts
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
export default prisma
3.5 渲染模式与性能优化
3.5.1 渲染模式配置
php
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// 首页使用SSG预渲染
'/': { prerender: true },
// 博客详情页使用ISR(增量静态再生)
'/blog/**': { swr: 3600 }, // 缓存1小时
// 管理后台使用纯客户端渲染
'/admin/**': { ssr: false },
// API路由配置
'/api/**': { cors: true, cache: { maxAge: 60 } }
}
})
3.5.2 静态站点生成(SSG)
arduino
# 生成静态站点
npm run generate
# 预览生成结果
npm run preview
3.5.3 服务端渲染(SSR)优化
arduino
<script setup lang="ts">
// 关键CSS预加载
definePageMeta({
preload: [
{ rel: 'stylesheet', href: '/css/main.css' }
]
})
// 仅在服务端执行
if (process.server) {
// 服务端特定逻辑
console.log('This runs only on server')
}
// 仅在客户端执行
if (process.client) {
// 客户端特定逻辑
console.log('This runs only on client')
}
</script>
四、Nuxt 3 全场景应用指南
4.1 企业级网站(SEO 优先)
核心需求 :SEO 友好、首屏加载快、内容更新频繁推荐方案:SSR + ISR 混合模式
php
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// 核心页面使用SSR
'/': { ssr: true },
'/products/**': { ssr: true },
// 博客内容使用ISR(每小时更新)
'/blog/**': { swr: 3600 },
// 静态页面预渲染
'/about': { prerender: true },
'/contact': { prerender: true }
}
})
数据获取示例:
xml
<!-- pages/products/[id].vue -->
<script setup lang="ts">
const route = useRoute()
const { data: product } = await useAsyncData(`product-${route.params.id}`, () => {
return $fetch(`/api/products/${route.params.id}`)
}, {
// 服务端预取数据,提升首屏性能
server: true,
// 客户端缓存数据,减少重复请求
client: true
})
</script>
4.2 电商平台(高性能 + 动态内容)
核心需求 :商品展示、购物车、用户中心、订单管理推荐方案:SSR(商品页)+ CSR(用户中心)+ API 服务
php
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
// 商品页使用SSR,SEO优先
'/products/**': { ssr: true },
// 首页使用SSG+ISR,兼顾性能与更新
'/': { prerender: true, swr: 300 }, // 每5分钟更新
// 用户中心使用CSR,丰富交互
'/account/**': { ssr: false },
// 购物车API配置缓存
'/api/cart/**': { cache: { maxAge: 60 } }
}
})
购物车状态管理示例:
typescript
// stores/cart.ts
import { defineStore } from 'pinia'
export const useCartStore = defineStore('cart', {
state: () => ({
items: [] as CartItem[],
total: 0
}),
actions: {
async addToCart(productId: number, quantity: number) {
// 调用API添加商品到购物车
const response = await $fetch('/api/cart/add', {
method: 'POST',
body: { productId, quantity }
})
this.items = response.items
this.total = response.total
}
}
})
4.3 全栈应用(前后端一体化)
核心需求 :用户认证、数据管理、实时交互推荐方案:Nuxt 3 全栈模式(Nitro 服务器 + API + 数据库)
csharp
// server/api/auth/login.post.ts
export default defineEventHandler(async (event) => {
const { email, password } = await readBody(event)
// 验证用户
const user = await prisma.user.findUnique({
where: { email }
})
if (!user || !await verifyPassword(password, user.password)) {
setResponseStatus(event, 401)
return { error: 'Invalid credentials' }
}
// 生成JWT令牌
const token = signToken({ userId: user.id })
// 设置Cookie
setCookie(event, 'token', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 60*60*24*7 // 7天
})
return { user: { id: user.id, name: user.name, email: user.email } }
})
用户认证中间件示例:
vbnet
// server/middleware/auth.ts
export default defineEventHandler(async (event) => {
const token = getCookie(event, 'token')
if (!token) {
setResponseStatus(event, 401)
return { error: 'Unauthorized' }
}
try {
const decoded = verifyToken(token)
event.context.userId = decoded.userId
} catch (error) {
setResponseStatus(event, 403)
return { error: 'Invalid token' }
}
})
4.4 静态博客 / 文档站(内容为王)
核心需求 :静态部署、快速加载、内容稳定推荐方案:SSG(静态站点生成)+ 内容管理系统
arduino
# 生成静态站点
npm run generate
内容管理集成示例(使用 Contentlayer):
bash
npm install contentlayer @contentlayer/nuxt
php
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@contentlayer/nuxt'],
contentlayer: {
// 配置内容目录
contentDirPath: 'content',
// 定义内容类型
documentTypes: ['Post']
}
})
less
// contentlayer.config.ts
import { defineDocumentType, makeSource } from '@contentlayer/source-files'
export const Post = defineDocumentType(() => ({
name: 'Post',
filePathPattern: `**/*.md`,
fields: {
title: { type: 'string', required: true },
date: { type: 'date', required: true },
tags: { type: 'list', of: { type: 'string' } }
},
computedFields: {
slug: {
type: 'string',
resolve: (post) => post._raw.flattenedPath
}
}
}))
export default makeSource({ contentDirPath: 'content', documentTypes: [Post] })
4.5 边缘计算应用(低延迟 + 全球部署)
核心需求 :全球低延迟、高可用性、动态内容推荐方案:Nuxt 3 + Nitro + 边缘部署(Vercel Edge Functions/Cloudflare Workers)
php
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
preset: 'vercel-edge' // 或 'cloudflare-pages'
}
})
边缘函数示例:
javascript
// server/api/edge.ts
export default defineEventHandler((event) => {
// 边缘位置检测
const edgeRegion = event.context.cloudflare?.region || 'unknown'
return {
message: 'Hello from the edge!',
region: edgeRegion,
timestamp: Date.now()
}
})
五、最佳实践与性能优化
5.1 性能优化清单
| 优化项 | 实现方法 | 效果 |
|---|---|---|
| 代码分割 | 路由级自动分割,组件异步导入 | 减少首屏 JS 体积,提升加载速度 |
| 图片优化 | 使用<NuxtImg>组件,自动处理格式、尺寸 |
减少图片体积,提升 LCP 指标 |
| 缓存策略 | 合理使用 ISR、SWR、HTTP 缓存 | 减少服务器负载,提升响应速度 |
| 关键 CSS | 内联首屏 CSS,延迟加载非关键 CSS | 提升 FCP 和 LCP 指标 |
| 预加载 | 使用definePageMeta预加载关键资源 |
减少资源加载延迟 |
| 懒加载 | 组件与图片懒加载 | 减少初始加载资源数量 |
5.2 TypeScript 最佳实践
- 接口定义:为 API 响应、组件 props 等定义清晰的接口
typescript
// types/post.ts
export interface Post {
id: number
title: string
content: string
createdAt: string
author: {
id: number
name: string
}
}
- 组件类型安全:
typescript
<script setup lang="ts">
interface Props {
post: Post
isFeatured?: boolean
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'click', id: number): void
}>()
</script>
- 路由类型增强:
typescript
// types/router.d.ts
import 'vue-router'
declare module 'vue-router' {
interface RouteMeta {
title?: string
requiresAuth?: boolean
}
}
5.3 部署与 CI/CD
5.3.1 部署选项对比
| 部署方式 | 适用场景 | 部署命令 | 推荐平台 |
|---|---|---|---|
| SSR 部署 | 动态内容、用户交互多 | npm run build |
Vercel、Render、AWS EC2 |
| 静态部署 | 内容稳定、SEO 优先 | npm run generate |
Netlify、Vercel、GitHub Pages |
| 边缘部署 | 全球低延迟、高可用性 | npm run build |
Vercel Edge、Cloudflare Pages |
5.3.2 GitHub Actions 配置示例
yaml
# .github/workflows/deploy.yml
name: Deploy Nuxt 3 App
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm install
- run: npm run generate
- uses: netlify/actions/cli@master
with:
args: deploy --dir=dist --prod
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
六、常见问题与解决方案
6.1 跨域问题
php
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
devProxy: {
'/api': {
target: 'https://api.example.com',
changeOrigin: true
}
}
}
})
6.2 开发环境与生产环境差异
ini
// 环境变量配置(.env文件)
NUXT_API_BASE_URL=http://localhost:3000/api
NUXT_PUBLIC_BASE_URL=http://localhost:3000
// 生产环境(.env.production)
NUXT_API_BASE_URL=https://api.example.com
NUXT_PUBLIC_BASE_URL=https://example.com
在代码中使用:
ini
const apiBaseUrl = useRuntimeConfig().apiBaseUrl
const publicBaseUrl = useRuntimeConfig().public.baseUrl
6.3 调试技巧
- 启用 Nuxt 开发者工具:
php
// nuxt.config.ts
export default defineNuxtConfig({
devtools: { enabled: true }
})
- 服务器端调试:
arduino
# 启动调试模式
npm run dev -- --inspect
- 性能分析:
arduino
# 生成性能报告
npm run build --analyze
七、总结与未来展望
Nuxt 3 作为 Vue 3 生态的全栈框架,凭借其文件系统路由 、自动导入 、多种渲染模式 和全栈能力,大幅提升了 Vue 开发者的生产力。结合 TypeScript 的类型安全,Nuxt 3 已成为构建现代 Web 应用的首选框架之一Nuxt。
未来,Nuxt 4 将进一步提升性能,引入更多全栈特性,如内置数据库支持、实时通信等,让开发者能够更专注于业务逻辑,而非基础设施建设。