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 的生态特点是:官方主线更明显,上手路径更清楚。

Vue 生态全景与项目架构图

2. Vue 生态总地图

解决什么常见工具
UI 核心模板、响应式、组件Vue 3.5
路由URL 到页面Vue Router
全局状态当前用户、权限、菜单Pinia
服务端框架SSR、SSG、全栈 VueNuxt
请求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 或服务端路由能力时再考虑:

Nuxt

Nuxt 提供:

文件路由
布局
服务端渲染
自动导入
server routes
数据获取

7. 请求和服务端数据层

Vue 没有强绑定某个请求库。

常见选择:

工具适合
fetch原生简单请求
axios拦截器、兼容老项目
ofetchNuxt / 现代 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 UITypeScript 友好,风格现代
Ant Design VueAnt 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
Sass

Vue 项目常见组合:

组件库样式 + 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 UtilsVue 组件行为
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
UIElement 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、请求、权限、工程化组织成稳定项目。

上一篇建议:大白话讲解——React 生态全景与项目架构.md

下一篇建议:大白话讲解——React vs Vue 生态架构横向对比.md