Vue / 闯关模式
Vue 生态全景与项目架构
理解 Vue Router、Pinia、Nuxt、请求封装、表单、组件库、测试和工程化如何组成稳定 Vue 项目。
一句话:Vue 生态更像一套官方主线清晰的工具箱,Vue Router、Pinia、Vite、组件库、测试工具和按需使用的 Nuxt,一起支撑不同类型的 Vue 项目。
第 11 篇 / 共 12 篇。
本篇学完你会:知道 Vue 生态每一类工具解决什么问题、用户管理后台该怎么选型、Vue 项目架构应该怎么分层。
1. 为什么要单独学 Vue 生态
Vue 核心解决:
组件
模板
响应式
Composition API但真实用户管理后台还需要:
路由
菜单
权限
Pinia 全局状态
接口请求
表单校验
组件库
构建部署
自动测试Vue 的生态特点是:官方主线更明显,上手路径更清楚。

2. Vue 生态总地图
| 层 | 解决什么 | 常见工具 |
|---|---|---|
| UI 核心 | 模板、响应式、组件 | Vue 3.5 |
| 路由 | URL 到页面 | Vue Router |
| 全局状态 | 当前用户、权限、菜单 | Pinia |
| 服务端框架 | SSR、SSG、全栈 Vue | Nuxt |
| 请求 | API、拦截器、错误处理 | fetch、axios、ofetch |
| 表单校验 | 输入、规则、错误 | vee-validate、Zod、组件库 Form |
| UI 组件库 | 表格、弹窗、表单控件 | Element Plus、Naive UI、Ant Design Vue |
| 样式 | 视觉和布局 | scoped CSS、CSS Modules、UnoCSS、Tailwind |
| 构建 | 开发服务、打包 | Vite |
| 测试 | 保证功能不坏 | Vitest、Vue Test Utils、Playwright |
Vue 的生态更像一条官方主线,但不是所有项目都要把这条线全部用上:
Vue -> Vue Router -> Pinia -> Vite -> Nuxt更准确地说:普通后台通常到 Vue + Vue Router + Pinia + Vite 就够了;需要 SSR、SSG、文件路由或全栈能力时,再考虑 Nuxt。
3. Vue 核心层
Vue 核心层包含:
SFC 单文件组件
template
script setup
ref / reactive
computed / watch
Composition API用户管理页面:
<script setup lang="ts">
const keyword = ref('');
const users = ref<User[]>([]);
</script>
<template>
<UserFilter v-model:keyword="keyword" />
<UserTable :users="users" />
</template>Vue 核心负责让数据和模板连起来。
4. 路由层:Vue Router
Vue Router 负责:
路径对应页面
嵌套路由
路由 meta
路由守卫
页面跳转用户管理页面:
{
path: '/admin/users',
component: () => import('@/features/users/pages/UserManagementPage.vue'),
meta: {
title: '用户管理',
permission: 'user:read'
}
}守卫:
router.beforeEach((to) => {
const authStore = useAuthStore();
const permission = to.meta.permission as string | undefined;
if (permission && !authStore.permissions.includes(permission)) {
return '/403';
}
});Vue Router 和权限天然适合结合 meta。
5. 状态管理层:Pinia
Pinia 是 Vue 官方推荐状态管理。
适合放:
当前登录用户
权限列表
菜单
主题
语言
跨页面共享状态不适合放:
搜索框临时输入
编辑弹窗草稿
某个组件自己的开关Pinia 示例:
export const useAuthStore = defineStore('auth', {
state: () => ({
user: null as CurrentUser | null,
permissions: [] as string[]
}),
actions: {
setUser(user: CurrentUser) {
this.user = user;
this.permissions = user.permissions;
}
}
});使用:
const authStore = useAuthStore();
const canCreate = computed(() => authStore.permissions.includes('user:create'));6. 服务端框架层:Nuxt
Nuxt 是 Vue 的全栈应用框架。它很强,但不是普通后台管理系统的必选项。
适合:
官网
内容站
SSR
SSG
SEO
全栈 Vue 应用内部后台通常可以:
Vue + Vite + Vue Router + Pinia需要 SEO、SSG、SSR 或服务端路由能力时再考虑:
NuxtNuxt 提供:
文件路由
布局
服务端渲染
自动导入
server routes
数据获取7. 请求和服务端数据层
Vue 没有强绑定某个请求库。
常见选择:
| 工具 | 适合 |
|---|---|
| fetch | 原生简单请求 |
| axios | 拦截器、兼容老项目 |
| ofetch | Nuxt / 现代 fetch 包装 |
| TanStack Query Vue | 请求缓存、刷新、重试 |
普通后台常见封装:
export async function fetchUsers(query: UserQuery) {
return request.get<PageResult<User>>('/users', { params: query });
}再放进 composable:
export function useUsers() {
const users = ref<User[]>([]);
const loading = ref(false);
async function loadUsers() {
loading.value = true;
users.value = await fetchUsers(query);
loading.value = false;
}
return { users, loading, loadUsers };
}8. 表单和校验层
Vue 表单常见方案:
| 方案 | 适合 |
|---|---|
| 组件库 Form | 后台管理系统,和 UI 组件绑定紧 |
| vee-validate | 复杂表单、组合式校验 |
| Zod | 类型和规则统一 |
| 自己写规则 | 简单表单 |
用户编辑表单:
<el-form :model="form" :rules="rules">
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" />
</el-form-item>
</el-form>大白话:
组件库 Form 管交互体验
Zod / rules 管数据规则9. UI 组件层:Element Plus / Naive UI / Ant Design Vue
Vue 后台最常见就是组件库。
| 组件库 | 特点 |
|---|---|
| Element Plus | 后台生态成熟,上手快 |
| Naive UI | TypeScript 友好,风格现代 |
| Ant Design Vue | Ant Design 风格,适合已有 Ant 体系 |
| Vant | 移动端组件 |
用户管理后台需要:
Table
Form
Dialog / Modal
Select
Pagination
Message
Dropdown如果是企业后台,Element Plus 或 Naive UI 都很实用。
10. 样式层:scoped CSS / CSS Modules / UnoCSS
Vue 自带很常用的局部样式:
<style scoped>
.user-table {
width: 100%;
}
</style>也可以用:
CSS Modules
Tailwind
UnoCSS
SassVue 项目常见组合:
组件库样式 + scoped CSS + UnoCSS/Tailwind不要每个页面都发明一套样式规则。
11. 构建和工程化层:Vite / pnpm / Turborepo
Vue 3 默认主线是 Vite。
工程化常见内容:
Vite
TypeScript
ESLint / Biome
Prettier
环境变量
构建检查
pnpm workspace
Turborepo
CI/CD多项目时:
apps/admin
apps/website
packages/ui
packages/request
packages/config这时 pnpm workspace 和 Turborepo 会很有用。
12. 测试层:Vitest / Vue Test Utils / Playwright
Vue 测试常见:
| 工具 | 看什么 |
|---|---|
| Vitest | 函数、composable、工具方法 |
| Vue Test Utils | Vue 组件行为 |
| Playwright | 浏览器里的完整流程 |
组件测试:
const wrapper = mount(UserTable, {
props: { users }
});
expect(wrapper.text()).toContain('小明');端到端测试:
await page.goto('/admin/users');
await page.getByPlaceholder('搜索用户名').fill('小明');
await expect(page.getByText('小明')).toBeVisible();13. 移动端和跨端:uni-app / NativeScript Vue
Vue 生态里跨端方向常见:
| 工具 | 适合 |
|---|---|
| uni-app | 小程序、H5、App,多端业务 |
| NativeScript Vue | 原生 App 方向 |
| Ionic Vue | 混合移动应用 |
如果你的目标是国内小程序和多端,uni-app 很常见。
如果只是 Web 后台,不需要急着学跨端。
14. 用户管理后台推荐架构
一个稳妥 Vue 后台架构:
src/
app/
router.ts
providers.ts
shared/
request/
utils/
ui/
stores/
auth.ts
features/
users/
api.ts
types.ts
composables/
use-users.ts
components/
UserFilter.vue
UserForm.vue
UserTable.vue
pages/
UserManagementPage.vue推荐组合:
| 层 | 推荐 |
|---|---|
| 构建 | Vite |
| 路由 | Vue Router |
| 全局状态 | Pinia |
| 请求 | axios/ofetch + composable |
| 表单 | 组件库 Form + rules/Zod |
| UI | Element Plus / Naive UI |
| 测试 | Vitest + Playwright |
15. 常见选型错误
错误一:什么都放 Pinia
Pinia 不是垃圾桶。表单草稿、弹窗开关,能放本地就放本地。
错误二:所有接口请求都写在页面里
页面会越来越长。建议:
api.ts 管请求
composable 管业务状态
page 管组装错误三:路由、菜单、权限各写一套
后台项目最好让路由 meta、菜单、权限码有统一来源,否则会越维护越乱。
错误四:组件库样式随便覆盖
组件库可以省时间,但乱覆盖样式会让升级困难。
16. 学习顺序
建议这样学 Vue 生态:
1. Vue 核心:template、ref/reactive、computed、watch、组件
2. Vue Router:页面、参数、守卫、meta
3. Pinia:用户、权限、菜单、主题
4. 请求封装:api.ts + composable
5. 表单和组件库:Element Plus / Naive UI
6. 工程化:Vite、TypeScript、测试、构建
7. 进阶:Nuxt、SSR、uni-app最后记住一句话:
Vue 生态不是只有 v-model 和组件库,真正的能力是把 Router、Pinia、请求、权限、工程化组织成稳定项目。