Nuxt 全栈框架
纯Vue.js项目的问题
- SEO 问题:SPA 页面内容由 JS 动态生成,搜索引擎引擎难以抓取,导致搜索引擎排名低。
- 首加载体验:首次次加载需下载完整 JS 包,首屏白屏时间长。
- 路由配置繁琐:需手动维护 vue-router 的路由表,文件增减时容易漏配。
- 服务端能力缺失:纯前端 Vue 难以直接操作数据库、处理敏感逻辑(如用户认证)。
什么是Nuxt
Nuxt.js 是一个基于 Vue.js 的全栈框架,用于构建服务端渲染(SSR)和静态网站生成(SSG)的应用程序。它提供了一套完整的开发工具和最佳实践,使得开发者能够更高效地构建高性能的 Web 应用。Nuxt.js 的核心理念是 “约定优于配置”,通过约定的目录结构和配置,简化了开发流程。
“约定优于配置” 是一种软件设计原则,强调通过预定义的约定来简化配置过程。Nuxt.js 采用这种理念,通过约定的目录结构和文件命名,减少了开发者需要手动配置的内容。例如,页面组件放在 pages
目录下,路由会自动生成,无需手动配置路由文件。这种方式不仅提高了开发效率,还降低了出错的可能性。
Nuxt.js项目架构图
┌─────────────────────────────────────────────────────────────────────┐
│ 客户端(浏览器) │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │
│ │ 页面组件 │ │ 公共组件 │ │ 客户端交互逻辑 │ │
│ │ (pages/*.vue) │ │ (components/*) │ │ (composables/*.ts) │ │
│ └────────┬────────┘ └────────┬────────┘ └──────────┬────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 客户端框架核心(Vue 3 + Nuxt 运行时) │ │
│ │ - 路由管理(自动路由 + 动态路由) │ │
│ │ - 水合过程(Hydration):激活服务端渲染的 DOM 交互 │ │
│ │ - 状态管理(Pinia / useState) │ │
│ │ - 数据请求(useFetch / useAsyncData) │ │
│ └────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ 服务端(Node.js) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 服务端入口(Nitro 引擎) │ │
│ │ - 处理请求路由分发(客户端页面 / 服务端 API) │ │
│ │ - 渲染模式控制(SSR / SSG / CSR / 混合渲染) │ │
│ │ - 中间件执行(服务端中间件 + 路由中间件) │ │
│ └────────┬──────────────────────────────┬────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────────────┐ │
│ │ 服务端页面渲染 │ │ 服务端 API / 逻辑 │ │
│ │ (SSR / SSG 核心) │ │ (server/ 目录) │ │
│ │ - 服务端解析 Vue 组件 │ │ ┌─────────────────────┐ │ │
│ │ - 生成完整 HTML 输出 │ │ │ API 路由 │ │ │
│ │ - 预获取页面数据 │ │ │ (server/api/*.js) │ │ │
│ └─────────────────────┘ │ ├─────────────────────┤ │ │
│ │ │ 服务端中间件 │ │ │
│ │ │ (server/middleware)│ │ │
│ │ ├─────────────────────┤ │ │
│ │ │ 数据库交互 │ │ │
│ │ │ (Prisma / 其他ORM)│ │ │
│ │ └─────────────────────┘ │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────┐ │
│ │ 静态资源处理 │ │ 配置文件 │ │ 工具函数 │ │
│ │ (public/ / assets/) │ │ (nuxt.config.ts) │ │ (utils/*) │ │
│ └─────────────────────┘ └─────────────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
目录结构
your-nuxt-project/ # 项目根目录
├── .nuxt/ # Nuxt 开发时自动生成的临时文件(构建缓存、编译产物,无需手动修改)
├── .output/ # 生产构建输出目录(SSR/混合渲染模式,包含服务端代码和客户端静态资源)
├── assets/ # 客户端静态资源(需编译/处理)
│ ├── css/ # 全局 CSS/SCSS 样式(如 main.scss、variables.scss)
│ ├── images/ # 图片资源(如 logo.png,构建时会被优化)
│ └── fonts/ # 字体文件(如 custom-font.ttf)
├── components/ # 公共 Vue 组件(自动导入,无需手动 import)
│ ├── common/ # 通用基础组件(如 Button.vue、Input.vue)
│ ├── layout/ # 布局相关组件(如 Header.vue、Footer.vue)
│ └── [业务模块]/ # 按业务划分的组件(如 product/ProductCard.vue)
├── composables/ # 可复用的组合式函数(自动导入,前后端通用)
│ ├── useUser.ts # 用户状态相关逻辑(如登录、权限判断)
│ ├── useRequest.ts # 封装请求逻辑(如二次封装 useFetch)
│ └── useToast.ts # 全局提示组件逻辑
├── content/ # Nuxt Content 模块目录(用于管理 Markdown/JSON 等内容文件,需安装 @nuxt/content)
│ ├── blog/ # 博客文章(如 2024-01-01-first-post.md)
│ └── docs/ # 文档内容(如 installation.md)
├── layouts/ # 页面布局组件(控制页面整体结构,默认使用 default.vue)
│ ├── default.vue # 默认布局(包含 <NuxtPage /> 渲染页面内容)
│ ├── auth.vue # 登录/注册页面布局(无 Header/Footer)
│ └── admin.vue # 后台管理页面布局(侧边栏+主体)
├── middleware/ # 路由中间件(控制页面跳转权限,分全局/页面/组级别)
│ ├── auth.global.ts # 全局中间件(所有页面跳转前执行,需加 .global 后缀)
│ └── admin.ts # 页面级中间件(仅指定页面使用,如 admin 相关页面)
├── node_modules/ # 项目依赖包(npm/yarn/pnpm 安装,无需手动修改)
├── pages/ # 页面组件目录(文件即路由,自动生成 vue-router 路由表)
│ ├── index.vue # 首页(对应路由 /)
│ ├── about.vue # 关于页(对应路由 /about)
│ ├── blog/ # 博客模块页面
│ │ ├── index.vue # 博客列表页(对应路由 /blog)
│ │ └── [slug].vue # 博客详情页(动态路由,对应 /blog/xxx)
│ ├── admin/ # 后台管理页面
│ │ ├── index.vue # 后台首页(/admin)
│ │ └── products/ # 商品管理页面
│ │ ├── index.vue # 商品列表(/admin/products)
│ │ └── [id].vue # 商品编辑页(/admin/products/123)
│ └── api/ # 客户端 API 路由(仅 Nuxt 2,Nuxt 3 移至 server/api)
├── public/ # 静态资源根目录(无需编译,直接复制到输出目录)
│ ├── favicon.ico # 网站图标
│ ├── robots.txt # 搜索引擎爬虫规则
│ └── images/ # 无需优化的图片(如二维码、图标)
├── server/ # Nuxt 3 服务端目录(存放服务端逻辑,仅在服务端运行)
│ ├── api/ # 服务端 API 路由(文件即接口,对应 /api/xxx)
│ │ ├── user.ts # 用户相关接口(/api/user,支持 GET/POST)
│ │ └── products/ # 商品接口(/api/products)
│ ├── middleware/ # 服务端中间件(所有服务端请求前执行,如权限校验、日志)
│ │ └── auth.ts # 服务端权限中间件(验证 Token 等)
│ ├── routes/ # 服务端自定义路由(补充 API 路由,支持更复杂的路由规则)
│ └── utils/ # 服务端工具函数(如数据库连接、敏感数据加密)
├── stores/ # Pinia 状态管理目录(Nuxt 3 官方推荐,替代 Vuex)
│ ├── user.ts # 用户状态 store(useUserStore)
│ └── cart.ts # 购物车状态 store(useCartStore)
├── types/ # TypeScript 类型定义目录(全局类型、接口声明)
│ ├── user.ts # 用户相关类型(如 User、LoginParams)
│ └── product.ts # 商品相关类型(如 Product、ProductListRes)
├── utils/ # 通用工具函数(前后端通用,如格式化时间、数据验证)
│ ├── format.ts # 格式化工具(如 formatDate、formatPrice)
│ └── validate.ts # 验证工具(如 validateEmail、validatePhone)
├── .env # 环境变量文件(本地开发用,不提交到 Git)
├── .env.production # 生产环境变量文件(构建时生效)
├── .eslintrc.js # ESLint 配置文件(代码规范检查)
├── .gitignore # Git 忽略文件配置(如 node_modules、.nuxt、.env)
├── nuxt.config.ts # Nuxt 项目核心配置文件(渲染模式、模块、路由等)
├── package.json # 项目依赖配置(脚本、依赖包版本)
├── pnpm-lock.yaml # 依赖锁文件(pnpm 专用,确保依赖版本一致)
├── README.md # 项目说明文档(安装、运行、部署步骤)
└── tsconfig.json # TypeScript 配置文件(类型检查、编译选项)
Nuxt 核心价值
Nuxt 提供多种渲染模式,不同场景需求:
服务端渲染(SSR):
- 每次请求时,服务端动态生成 HTML 并返回,SEO 友好、首屏加载快。
静态站点生成(SSG):
- 构建时预先生成所有页面的静态 HTML,部署后直接返回,极致加载速度。
混合渲染(Nuxt 3 新增):
- 同一项目中,部分页面用 SSR(如用户中心),部分用 SSG(如首页),按需选择最优模式。
客户端渲染(CSR):
- 兼容传统 SPA 模式,适合纯交互型应用,像后台管理系统。
文件即路由
- pages/ 目录下的 Vue 文件自动生成路由(如 pages/user.vue → 路由 /user);
- api/ 目录下的文件自动成为 API 接口(如 api/user.js → 接口 /api/user)。
- routes/ 目录下的文件自动成为路由(如 routes/user.js → 路由 /user)。
工程化增强
自动导入:组件(components 目录)、工具函数(composables 目录)无需 import 即可直接使用。
代码分割:自动按页面分割 JS 包,减少首次加载体积。
CSS 支持:内置 SCSS、PostCSS,支持全局样式(assets/css)和组件样式隔离(scoped)。
TypeScript 友好:默认支持 TS,类型提示完善。