Fantastic-admin 框架开发指南:从 AGENTS.md 读懂 Vue 3 后台管理系统的工程全貌
Fantastic-admin 框架开发指南:从 AGENTS.md 读懂 Vue 3 后台管理系统的工程全貌
导读:本文以仓库根目录
AGENTS.md为骨架,逐条展开 Fantastic-admin 这一基于 Vue 3 的后台管理框架的工程事实——包括其技术栈选型、pnpm monorepo 目录布局、核心 CLI 命令的工作机制,以及面向 AI 编程场景的协作规范与代码约束。读者可通过本文快速建立对该仓库的整体认知,并掌握在多应用 monorepo 中安全开发、构建与协作的完整方法论。
一、项目定位:面向 AI 编程的后台管理框架
AGENTS.md 开篇即给出项目一句话定位:Fantastic-admin 是一个基于 Vue 3 的后台管理框架。结合仓库目录与 README.md 的项目描述可以确认,它的定位是面向 AI 编程场景的管理系统框架,同时兼容 PC 与移动端。
这一"面向 AI 编程"的定位并非空泛口号,而是体现在仓库结构中——根目录下存在一个完整的 skills/ 目录(如 fa-crud-page-generator、fa-route-generator、fa-form-builder、fa-feedback 等技能包),它们以 SKILL.md + references 的形式为 AI Agent 提供可复用的开发方法论,AGENTS.md 本身也正是为 AI 协作方阅读的入口文档。
二、技术栈全景:Vue 3 + TypeScript + Vite 的现代组合
AGENTS.md 列出的技术栈与仓库真实依赖完全对应,可逐一在 package.json 与 pnpm-workspace.yaml 的 catalog 中得到印证:
| 技术领域 | 选型 | 仓库证据 |
|---|---|---|
| 框架 | Vue 3.6(vue: ^3.5.43,catalog 声明)+ TypeScript + Vite 8(vite: ^8.3.1) |
pnpm-workspace.yaml |
| UI 组件 | Element Plus(默认,可替换)+ Reka UI(reka-ui: ^2.10.5)+ UnoCSS 原子化 CSS |
pnpm-workspace.yaml |
| 状态管理 | Pinia + pinia-plugin-persistedstate | pnpm-workspace.yaml |
| 路由 | Vue Router 5(vue-router: ^5.3.1) |
pnpm-workspace.yaml |
| 包管理器 | pnpm(强制) | package.json packageManager: pnpm@12.6.0 |
| HTTP | Axios | pnpm-workspace.yaml |
| Mock | vite-plugin-fake-server | pnpm-workspace.yaml |
值得注意的两个细节:
-
"UI 可替换"是字面意义上的架构能力:
apps/下并排存在core(Element Plus 默认)、core-ant-design-vue、core-antdv-next、core-arco-design-vue、core-element-plus、core-naive-ui、core-tdesign、core-vexip-ui共 8 个应用,它们共享同一套src/目录结构(api / assets / components / composables / layouts / router / slots / store / types / ui / utils / views),通过 pnpm-workspace.yaml 的 catalog 机制(element-plus、ant-design-vue、naive-ui、arco-design-vue、tdesign、vexip-ui等独立 catalog 分组)按应用维度锁定不同 UI 库版本。这证明"替换 UI 库"不是文档空谈,而是 monorepo 内实际可切换的工程事实。 -
Node.js 版本有硬性门槛:
AGENTS.md要求以根目录package.json为准。实测 package.json 的engines字段为node: ^22.22.2 || ^24.15.0 || >=26.0.0,且packageManager: pnpm@12.6.0会通过preinstall钩子(npx only-allow pnpm)强制包管理器约束。
三、目录结构:pnpm monorepo 的两级分层
AGENTS.md 给出了精简的目录树,其核心分层思想是 apps(应用层)与 packages(共享子包层)分离。结合仓库真实布局,可将其扩充为如下更完整的视图:
apps/
└── core/ # 默认应用(Element Plus)
└── src/
├── api/ # API 请求模块(modules/ 下按业务拆分)
├── assets/ # 静态资源(icons、images、styles)
├── components/ # 全局业务组件(AppAccountButton、AppAuth 等)
├── composables/ # 组合式函数
├── hotkeys/ # 快捷键注册
├── iconify/ # 图标集(离线/在线模式)
├── layouts/ # 布局组件(含 26 个子组件)
├── router/ # 路由配置(modules、guards、extensions)
├── slots/ # 插槽组件
├── store/ # Pinia store(modules/ 下 6 个模块)
├── types/ # TS 类型(auto-imports.d.ts、env.d.ts 等)
├── ui/ # 框架内建 UI 组件(provider + shadcn 风格组件)
├── utils/ # 工具函数(dayjs、storage、ua 等)
└── views/ # 页面视图
packages/
├── components/ # 框架内建组件库(Fa* 系列,跨应用共享)
├── composables/ # 组合式函数子包(pagination 等)
├── copyright/ # 版权信息工具子包
├── hotkeys/ # 快捷键子包
├── iconify-tools/ # 图标下载/安装工具
├── settings/ # 框架设置子包(默认值、类型、合并工具)
├── themes/ # 主题配置子包(light/dark CSS 变量)
└── types/ # 全局类型定义
scripts/
└── cli.ts # 工程 CLI 入口
AGENTS.md 中提到的"框架内建 UI 组件库"在 packages/components/src/index.ts 中有完整清单:FaAlert、FaAvatar、FaButton、FaTable、FaForm、FaModal、FaDrawer、FaToast、FaPagination 等,全部以 Fa 前缀命名并通过 Fa* 导出,同时配套 packages/components/resolver.ts 提供组件解析能力,配合 unplugin-vue-components 实现按需自动导入。
四、常用命令:CLI 背后的真实执行链路
AGENTS.md 给出三条核心命令,但它们在仓库中的实现远比字面更精巧——三条命令并非直接在根目录执行,而是经由 scripts/cli.ts 这一交互式 CLI 分发:
pnpm dev # 启动开发服务器
pnpm build # 构建
pnpm lint # 运行全量 lint(tsc + eslint + stylelint)
在 package.json 中,三者对应:
{
"dev": "tsx scripts/cli.ts --mode=dev",
"build": "tsx scripts/cli.ts --mode=build",
"serve": "tsx scripts/cli.ts --mode=serve",
"lint": "run-s lint:tsc lint:eslint lint:stylelint",
"lint:tsc": "pnpm --filter './apps/*' -r run lint",
"lint:eslint": "eslint . --cache --fix",
"lint:stylelint": "stylelint \"{apps,packages}/**/*.{css,scss,vue}\" --cache --fix"
}
4.1 dev / build / serve 的交互式分发机制
阅读 scripts/cli.ts 源码可知其完整流程:
- 三种模式(
dev/build/serve)由--mode参数决定,通过parseModeArg解析(支持--mode=dev、-m dev等写法),--help或-h可查看用法; - CLI 会扫描
apps/下所有含package.json的子目录(getWorkspaceEntries),并按模式过滤出含匹配脚本(dev*、build*、serve*)的应用; - dev / serve 为单选模式(
selectionMode: 'single'),build 为多选模式(selectionMode: 'multiple'),应用较多时会通过@clack/prompts弹出交互式选择; - 最终通过
spawn('pnpm', <a href="https://link.gitcode.com/i/2509749c8237ef31adc782bd2964417c" target="_blank">'--filter', packageName, 'run', script], ...)执行对应子包脚本,例如选中core应用后实际执行的是pnpm --filter @fantastic-admin/core run dev,即 [apps/core/package.json 中的vite。
因此 pnpm dev 的真实含义是"选择目标应用后,在其目录下运行 Vite 开发服务器";pnpm build 则是"多选若干应用后,各自执行 vue-tsc -b && vite build 类型检查与构建"。
4.2 lint 三阶段流水线
pnpm lint 通过 npm-run-all2 的 run-s(串行)依次执行:
lint:tsc:pnpm --filter './apps/*' -r run lint——对每个应用递归执行其自身lint脚本(在 apps/core/package.json 中即vue-tsc -b全量类型检查);lint:eslint:eslint . --cache --fix——根级 ESLint(基于@antfu/eslint-config,见 eslint.config.js)带缓存并自动修复;lint:stylelint:stylelint "{apps,packages}/**/*.{css,scss,vue}" --cache --fix——对样式文件与 Vue 文件中的样式进行规范校验。
这正是 AGENTS.md 所说"运行全量 lint(tsc + eslint + stylelint)"的实现全貌。
4.3 提交前的自动化保障
AGENTS.md 提到"代码提交前会自动运行 lint-staged"。仓库 package.json 通过 simple-git-hooks 配置了 pre-commit 钩子为 pnpm lint-staged,即仅对暂存文件执行 lint 修复,避免全量校验拖慢提交速度。同时 commit 脚本(git cz)搭配 cz-git 提供规范化的提交信息模板。
五、开发规范:AI 协作的硬约束
AGENTS.md 的开发规范部分是 AI 参与者(以及人类开发者)在仓库内改代码时必须遵守的契约,逐条对应到仓库真实实现:
5.1 SFC 与样式约定
<script setup lang="ts">语法:仓库所有视图与组件均采用此写法,例如 apps/core/src/main.ts 作为入口采用 Composition API 组织,组件层从 packages/components/src/basic/ 到 apps/core/src/views/ 均遵循 SFC +lang="ts"。- 样式优先 UnoCSS 原子类,复杂样式用 SCSS:根目录 uno.config.ts 配置了 UnoCSS(含
unocss-preset-animations等预设),应用入口 apps/core/src/main.ts 显式import 'virtual:uno.css';SCSS 由sass-embedded提供(catalog 声明),并在 stylelint.config.js 中通过stylelint-config-standard-scss进行校验。 - 组件命名 PascalCase 且文件名与组件名一致:从
apps/core/src/components/下的AppAccountButton、AppAccountForm、AppAuth等目录命名即可验证。
5.2 模块归属约定
- API 模块:放
apps/<app>/src/api/modules/,按业务拆分。仓库中 apps/core/src/api/modules/ 与 apps/core/src/api/fake_modules/ 并存,后者是 fake-server 的 mock 数据所在; - Store 模块:放
apps/<app>/src/store/modules/,使用 Pinia composition API 风格。仓库 apps/core/src/store/modules/ 下有 6 个模块,apps/core/src/store/index.ts 统一组装,并接入pinia-plugin-persistedstate实现状态持久化; - 路由配置:在
apps/<app>/src/router/,meta 属性可借助fa-route-generatorskill 生成——这与根目录 skills/fa-route-generator/(含 route-meta.md 参考文档)一一对应。
5.3 内建组件优先原则
AGENTS.md 强调"优先使用框架内建组件而非第三方组件或自定义实现"。内建组件集中在 packages/components/src/index.ts 的 Fa* 系列,覆盖表单(FaForm/FaInput/FaSelect/FaRadioGroup/FaCheckbox)、反馈(FaAlert/FaToast/FaModal/FaDrawer/FaTooltip/FaPopover)、数据展示(FaTable/FaTag/FaBadge/FaDescriptions/FaTrend)、导航与布局(FaTabs/FaPageHeader/FaPageMain/FaDivider)、上传(FaFileUpload/FaImageUpload)等场景,并通过 packages/components/resolver.ts 提供按需解析。
六、设置与主题:跨应用共享的子包机制
AGENTS.md 目录树提到的 packages/settings(框架设置)与 packages/themes(主题配置)是理解整个框架可配置性的关键:
6.1 settings 子包
packages/settings/src/index.ts 对外导出 settingsDefault、merge、setSettings、setSettingsLegacy、diffTwoObj 等核心 API。其类型定义在 packages/settings/src/types.ts 中按主题域拆分:
AppSettings:应用级配置,含路由模式(routeMode: 'hash' | 'html5',默认hash)、路由数据来源(routeBaseOn: 'frontend' | 'backend',默认frontend)、动态标题(dynamicTitle)、哀悼模式(rip)、移动端访问开关(mobile)、主页(home)、版权(copyright)、账号(account)等;MenuSettings、TabbarSettings、ToolbarSettings、PageSettings、ThemeSettings:分别对应侧边栏/头部菜单、标签栏、工具栏、页面级与主题级配置,且MenuMode('side' | 'head' | 'single')、TopbarMode('static' | 'fixed' | 'sticky')、MainMenuClickMode('switch' | 'jump' | 'smart')等联合类型全部以带 JSDoc@default注释的形式在源码中显式声明。
这与根目录 skills/fa-framework-settings/references/ 下的 7 份配置参考文档(app-settings.md、menu-settings.md、tabbar-settings.md、theme-settings.md 等)形成呼应——AI 可通过技能参考快速定位每个配置域的完整选项。
6.2 themes 子包
packages/themes/index.ts 导出 lightTheme 与 darkTheme 两组 CSS 变量对象,采用 shadcn 风格的 oklch 颜色令牌(如 --background、--foreground、--primary、--accent)叠加框架自定义的 --g-* 布局变量(主区域、头部、主导航、次导航、标签栏、工具栏的背景/前景色),从而支持运行时主题切换。@fantastic-admin/themes 以 workspace:* 形式被根包引用(见 package.json devDependencies)。
七、Mock 数据:vite-plugin-fake-server 的落地方式
AGENTS.md 明确 Mock 数据使用 vite-plugin-fake-server,且文件要放在 apps/<app>/src/api/modules/ 对应模块旁。仓库证据链完整:
- 依赖声明:
vite-plugin-fake-server: ^2.2.4在 pnpm-workspace.yaml catalog 中,且被 apps/core/package.json 等应用的 devDependencies 引用; - 目录落地:每个应用同时存在 apps/core/src/api/modules/(真实请求封装)与 apps/core/src/api/fake_modules/(mock 数据与拦截);
- 入口集成:apps/core/src/api/index.ts 负责统一导出与 Axios 实例配置,与
apps/<app>/src/api/modules/的拆分约定一致。
八、AI 协作注意事项与反馈闭环
AGENTS.md 最后两节是 AI 编程场景特有的协作规则,值得完整保留:
- 内建组件禁改:任何情况下都不要直接修改内建组件,确定修改前必须先与用户确认——这保护了
packages/components/跨应用共享的稳定性; - Node 版本以根目录 package.json 为准:即上文提及的
engines约束; - 反复修改检测(fa-feedback):使用任何
fa-*系列技能时,如果用户对同一功能点要求修改 3 次及以上仍未达到预期(如连续说"不对""再改改""还是不行"),必须触发 skills/fa-feedback/SKILL.md 技能,询问用户是否将问题反馈给框架作者。这是仓库为 AI 协作设计的"止损机制",避免低效循环。
九、从文档到实践:快速上手路径
综合 AGENTS.md 与仓库结构,一个完整的上手路径如下:
- 环境准备:安装 Node.js(
^22.22.2 || ^24.15.0 || >=26.0.0)与 pnpm(12.6.0),仓库preinstall钩子会校验包管理器; - 安装依赖:在仓库根目录执行
pnpm install(workspace 自动识别apps/*与packages/*,catalog 统一锁定依赖版本); - 启动开发:
pnpm dev,在弹出的应用列表中选择目标应用(如core),CLI 会自动执行pnpm --filter @fantastic-admin/core run dev启动 Vite; - 日常开发:遵循
src/目录约定新增 API 模块、Store 模块与路由配置;优先使用Fa*内建组件;样式优先 UnoCSS 原子类; - 质量检查:提交前由
simple-git-hooks触发lint-staged自动修复;全量校验使用pnpm lint; - 构建发布:
pnpm build多选应用执行vue-tsc -b && vite build,产物供pnpm serve(http-server ./dist -o)预览。
结语
AGENTS.md 虽然篇幅简短,却精确刻画了 Fantastic-admin 仓库的工程骨架:Vue 3 + TypeScript + Vite 8 的技术底座、pnpm monorepo 的 apps/packages 两级架构、以 scripts/cli.ts 为核心的交互式命令分发、以及面向 AI 协作的严格代码契约与反馈机制。理解这份文档,就掌握了在这个多应用、多 UI 库并存的中后台框架中安全探索与高效开发的完整地图——其余细节,均可顺着本文给出的源码路径继续深入。