12 AI 协同前端工程化实战:项目改造与扩充联调
AI 协同前端工程化实战:项目改造与扩充联调
关联:索引
问题探究:
-
为什么“能跑”不等于“可交付”,AI 生成代码最常见的工程风险是什么
-
AI 在前端工程化全流程能做哪些事,哪些事必须由人工把关
-
如何把“AI 产出”变成“团队规范产出”:Skills 约束如何让目录、命名、类型、边界持续一致
-
如何用“轻量自查 + 门禁回归”替代长审计:改造不回退、扩充可联调、结果可交付
-
项目初始化:脚手架选型、目录结构、别名与 tsconfig
-
依赖与工具:lint/format、commit 规范、gitignore、环境变量模板
-
组件相关(第 11 讲已实操):页面骨架、表格/表单/弹窗组合、状态枚举与类型定义
-
质量检查:代码规范、复杂度、重复度、潜在 bug(空值、边界、异步)
-
重构与统一:命名、抽取公共逻辑、拆分职责、类型收敛
-
AI 擅长“模板与穷举”,不擅长“业务真实约束与隐性规则”(口径需要人工定)
-
AI 容易生成“能跑但不可测”的代码(副作用耦合、难注入、难替换)
-
AI 容易把项目带向“风格漂移”(命名不一致、目录混乱、重复工具链)
本段按“先规范输入(任务卡/约束/计划),再写提示词生成补丁”的顺序组织,避免先写代码后补规则导致返工。
在企业里,规范写在 Wiki 往往“看过就忘”,引入 AI 后更容易“生成时跑偏”。Trae 的 Skills 可以把规范做成可复用的“约束层”,在 AI 生成/改造代码时持续对齐,帮助把规范从“写在文档里”变成“写进生成过程里”。
- code-standards(工程/类型/目录约束):让 AI 不敢写 any、不敢乱放文件、不敢编造脚本
- vue3-file-template(Vue3 文件结构模板):让 AI 生成的
.vue文件块顺序一致、可读性一致
Skill 示例 1:code-standards(本课程版,结构示例)
---
name: code-standards
description: 前端工程规范约束(本课程版)
globs:
- "**/*.ts"
- "**/*.vue"
---
# Instructions
## TypeScript 门禁
- 禁止使用 any;必要时用 unknown + 类型守卫
- 禁止到处使用类型断言(as);若必须断言,只能在边界层集中处理并说明原因
- 领域类型集中在 src/types/*,不允许在 views/components 重复定义口径
## 目录职责(必须遵守)
- src/views:页面编排
- src/components:可复用组件
- src/services:数据获取/请求/模拟数据
- src/utils:纯函数工具(映射、格式化、判定)
- src/types:领域类型与口径
## 生成与改造约束
- 不引入新依赖
- 必须按“文件路径 + 完整代码”交付,不给片段与省略号
- 只改任务卡允许的文件边界;不得偷偷加新功能
Skill 示例 2:vue3-file-template(本课程版,结构示例)
---
name: vue3-file-template
description: Vue3 SFC 结构约束(本课程版)
globs:
- "src/views/**/*.vue"
- "src/components/**/*.vue"
---
# Instructions
生成或改造 Vue3 单文件组件时,必须按以下区块顺序组织代码:
1) import 区
2) 类型区(type/interface)
3) 响应式状态(ref/reactive)
4) 纯逻辑函数(优先抽到 utils/composables)
5) 事件处理/业务方法
6) 生命周期(onMounted 等)
7) style(如有)
页面文件(src/views)优先“变薄”,把映射/判定/过滤分页等纯逻辑抽到 src/utils 或 src/composables。
- 在开始写提示词前,先启用对应 Skills(建议至少启用:code-standards + vue3-file-template)
- 写任务卡时,在【工程约束】里写清“本任务启用的 Skills 名称”
- 给 AI 的提示词第一段写明:“以已启用的 Skills 约束为准;若与任务卡冲突,以任务卡为准”
- 自查/互审阶段把“是否遵守 Skills”作为检查项(例如:是否出现 any、是否目录漂移、是否重复定义类型)
本讲不依赖任何特定指令体系,核心是把“输入写清 + 约束固定 + 输出可覆盖 + 过程可回归”这四件事做稳。Skills 的作用是把团队工程约束变成“生成时就会生效”的约束层,减少风格漂移与返工。
- 再列实施步骤(5–9 步即可):每步写清“改哪些文件 + 为什么改 + 怎么验证”
- 最后写提示词:明确“已启用 Skills 名称 + 文件级交付 + 只改允许文件边界 + 不引入依赖”
目标:把 09_element_plus_demo/src/views/DeviceListView.vue 做“规范化改造”,不改变 UI 结构与交互结果。
工程约束(以已启用 Skills 为准):
1) 已启用 Skills:code-standards、vue3-file-template
2) 不引入新依赖;不使用 any;领域类型以 src/types/device.ts 为唯一口径
3) 目录职责:types / utils / services / composables / views 分层明确,views 尽量变薄
唯一事实输入:
- 我会提供 src/views/DeviceListView.vue 与 src/types/device.ts 的完整内容(以及需要参考的现有文件)
交付要求(强制):
1) 输出“文件路径 + 完整代码”,可直接复制覆盖运行
2) 每个文件附“为何改/如何验证”
3) 最后输出 6 条自查清单,并对应到验收标准与回归点
本讲的“规范化”不是重写页面,而是让已有代码更像团队可维护代码:目录职责清晰、口径集中复用、页面变薄、纯逻辑可测试、交付可回归。
建议的规范化改造落点(从现状出发):
- 目录职责落地:把“映射/判定/过滤分页/格式化”等纯逻辑移出
src/views/*,按职责放到src/utils/*/src/composables/*/src/services/*,view 只做编排与接线。 - 口径唯一事实:
health/alarmLevel等领域口径只来自src/types/device.ts;禁止在页面内重复定义或改口径。 - 离线规则统一:离线判定
now - heartbeatAt > 180000抽成独立函数(支持注入 now),并要求“状态 Tag 与高风险操作禁用”同时联动。 - Element Plus 表单规范:表单 model/rules 明确类型(
FormRules<T>);弹窗关闭后清空校验状态;保存成功后关闭弹窗并刷新列表。 - 样式与可读性:减少模板内联 style,统一抽成 class +
<style scoped>;表格/卡片/按钮间距统一、语义一致。 - TypeScript 收敛:
reactive/ref给出明确类型;映射函数写明返回类型(例如 Tag type 的联合类型),避免隐式 any 与“推断漂移”。
- 视图文件变薄:筛选/分页/映射/离线判定不再堆在 view 内部
- 类型门禁通过:不出现 any,不到处
as,领域口径统一复用 - 交互不回退:筛选/重置回到第 1 页;分页与筛选条件联动正确
- 离线联动正确:离线 Tag 正确展示;启停/告警确认等高风险操作置灰不可点(可选提示原因)
- 弹窗闭环完整:新增/编辑共用弹窗;校验生效;关闭清空校验;保存关闭并刷新
- 文件级交付可覆盖:按路径输出全量文件,复制覆盖后可
npm run dev、/dashboard与/device-list可访问
0.3 小组多人协作:把规范式开发跑成“可合入流程”
- 开发者:按任务卡与实施步骤实施改造,对文件级交付与回归验证负责
- 质量负责人:盯 Skills 约束与门禁回归(禁止 any/目录漂移、回归点复测、
npm run build),对“可合入”负责
协作交付物(每组最后必须交齐):
-
改造步骤清单(写清步骤与验证方式)
-
文件级改造补丁(文件路径 + 完整代码)
-
门禁结果(至少:
npm run build是否通过 + 回归点复测记录) -
口径负责人先产出任务卡,并把“唯一事实输入”冻结:
src/views/DeviceListView.vue+src/types/device.ts(允许另附src/views/DashboardView.vue作为参照,但不允许让 AI 臆测不存在的文件) -
开发者拆分实施步骤,并把“文件所有权”写进步骤清单:
- 开发者优先改
src/views/DeviceListView.vue(只做变薄与接线) - 新增的纯逻辑文件(utils/services/composables)由开发者创建并维护
- 质量负责人做轻量互审:对照 Skills 与回归点,指出 3 个可执行改进(例如 any/目录漂移/重复映射/函数过长),并写清“如何验证”
- 合入前门禁:执行
npm run build,并按回归点逐条复测(筛选归 1、分页保留条件、离线禁用不回退等),不通过则回到对应步骤修复
【任务名称】(一句话)
【目标】你要交付的可验收结果是什么?
【范围】包含/不包含什么(防止越界加功能)
【页面/文件边界】允许改哪些文件?新增哪些文件?(文件路径级)
【业务规则】口径、禁用条件、边界行为(空态/异常/离线)
【数据契约】入参/出参、分页字段、空值策略、mock 规则
【工程约束】不允许 any;目录职责;命名规则;错误处理要求
【验收标准】用 5 条以内的可点击/可复现验收点描述
【回归点】改动后必须不回退的旧功能点
“文件级交付”提示词的 5 条强制条款(规范输出):
-
输出必须是“文件路径 + 完整代码”,不得给片段与省略号
-
不编造不存在的依赖与脚本命令;若需要运行命令,用“若存在则运行”表述
-
每个新增/修改文件都要说明“为何改”“如何验证”
-
最后输出 6 条自查清单(类型门禁/目录门禁/交互回归/构建门禁必须覆盖)
-
必须要求输出“文件路径 + 完整代码”,不要片段
-
必须指定技术栈与版本范围(Vue3/Vite/TS、Element Plus 是否使用)
-
必须写清工程约束:目录结构、命名、类型、是否允许 any
-
若已启用 Trae Skills:提示词中声明“以 Skills 约束为准”,减少重复粘贴规范全文
-
必须要求输出“变更说明 + 验证方式”,否则不算交付
2. 规范包补齐(示例提示词:把第 11 讲页面变成“可交付代码”)
我已经有第 11 讲产出的 `09_element_plus_demo` 项目(Vue3 + Vite + TS + Element Plus),其中关键文件为:
- src/views/DeviceListView.vue
- src/views/DashboardView.vue
- src/types/device.ts
现在要把其中一个页面改造成“团队可交付代码”。
请你按下面规则输出“文件路径 + 完整代码”(只输出需要新增/修改的文件),用于在现有项目中直接粘贴覆盖:
【已启用 Skills(必须遵守)】
- code-standards:约束 TypeScript/目录职责/文件级交付(适用范围:**/*.ts、**/*.vue)
- vue3-file-template:约束 Vue SFC 结构与 views 变薄(适用范围:src/views/**/*.vue、src/components/**/*.vue)
- 若你输出的文件路径不在上述 globs 覆盖范围内,也必须手动遵守同等约束(避免风格漂移)
【改造目标】
1) 让页面代码更可维护:目录分层清晰,职责拆分,避免在 view 里堆映射/过滤/格式化
2) 让核心逻辑更可测试:把纯逻辑抽成纯函数(输入→输出),避免依赖 UI/全局状态
3) 不改变 UI 结构与交互结果:筛选/分页/弹窗/操作栏行为不回退(沿用第 11 讲验收点)
【允许新增/调整的文件建议】(按实际情况选择)
- src/utils/mappers.ts:状态文案与 Tag 映射(集中管理)
- src/utils/offline.ts:离线判定与状态归一(纯函数)
- src/services/device.ts:listDevices/queryDevices(可先 mock)
- src/composables/useDeviceList.ts:把“查询条件 + 分页 + 列表刷新”抽出(避免 view 过大)
- src/types/device.ts:若已存在则沿用,只做最小必要补齐(不重复定义)
【强制约束】
- 不使用 any,不使用到处 as
- 不编造不存在的依赖与脚本命令
- 每个文件末尾附“为何改/如何验证”
- 最后附 6 条自查清单(必须包含:类型无 any、改造前后交互不回退、离线禁用逻辑不回退)
3. 自查清单(闭环 A:改造不回退)
- 是否每个文件都给了“完整内容”,没有缺失 import/导出
- 是否出现 any、unknown 滥用或类型断言过多
- view 是否变薄:映射/离线判定/过滤分页等是否已抽离
- 抽离逻辑是否“可独立运行”(纯函数、无 UI 依赖)
- 改造后是否能启动且控制台无明显报错
- 教师抽 1 组展示:指出 1 处“会导致不可交付/不可复查”的缺口并现场修正。
-
目录职责落地:映射/离线判定/过滤分页/格式化下沉到
utils或composables -
类型口径唯一:
health/alarmLevel与设备字段仅以src/types/device.ts为准 -
交付可覆盖:输出文件必须可直接复制覆盖运行(完整 import/导出)
-
类型门禁:无 any;少断言;联合类型集中复用
-
目录门禁:views 只编排;纯逻辑可独立运行、可注入 now/依赖
-
交互门禁:筛选/重置回到第 1 页;分页联动正确;离线联动正确;弹窗校验清理不回退
-
构建门禁:按项目 scripts 执行
npm run build(若存在 lint/test,同样执行)
项目工坊主题:绿色食品智能分拣系统综合实战:结构 + 路由 + 状态 + 主界面整合联调(以 09_element_plus_demo 为基础),并在 Skills 约束下完成规范统一与问题修复。
A. 选择改造对象(示例:设备列表页面)
示例提示词:
下面是第 11 讲 `09_element_plus_demo` 项目里的页面文件内容(以及 `src/types/device.ts` 的类型定义)。请你把它当作唯一事实来源:
1) 先给出“改造方案”:拆分哪些职责到 services/utils/composables,为什么(对齐 Skills 与目录职责)
2) 再输出改造后的“文件路径 + 完整代码”(只输出有变更的文件,可直接复制覆盖运行)
3) 最后输出 6 条自查清单(覆盖类型门禁、目录门禁、交互回归点)
约束:
- 不改变页面 UI 结构与交互结果(沿用第 11 讲验收点)
- 不引入新 UI 组件库
- 不使用 any;类型以现有 src/types/* 为准(若需补齐,最小化修改)
B. 扩充任务(从 demo 到分拣系统:结构 + 路由 + 状态 + 主界面)
扩充的目标不是“加很多页面”,而是在 Skills 约束下,把新增模块做成可扩展的工程结构,并能与现有 /dashboard、/device-list 联调跑通。
- 新增 1 个业务页面:分拣任务(Sorting Tasks)或告警中心(Alarm Center)
- 新增 1 个 Pinia 模块:维护列表查询条件、分页、加载态(把可复用逻辑从 view 中抽走)
- 新增 1 个 services 层:先用 mock 数据,后续可替换为真实接口
- 打通主界面:侧边栏菜单新增入口;路由可达;主区域正常渲染
建议的文件边界(按实际情况增减):
-
路由:
src/router/routes.static.ts(新增路由并保持未知路由重定向策略不变) -
页面:
src/views/*View.vue(新增页面只做编排,避免把列表逻辑写满 view) -
状态:
src/stores/*(Pinia store,聚合查询条件/分页/刷新) -
数据:
src/services/*(mock/请求封装) -
口径:
src/types/*(新增领域类型时集中放置,禁止在 view 内重复定义) -
菜单可点击进入新增页面,刷新后路由仍可达
-
新增页面的“查询条件 + 分页 + 列表刷新”可联动(最少跑通一次闭环)
-
不引入新依赖;不出现 any;新增文件遵守已启用 Skills
C. 人工优化与规范统一(当堂必须做)
- 统一类型入口:沿用第 11 讲的
src/types/device.ts(或现有src/types/*),避免重复定义与口径漂移 - 抽离映射与格式化:Tag 文案与颜色映射集中在
utils/mappers.ts - 抽离服务层:请求/模拟数据集中在
services,组件只负责调用与渲染 - 控制组件体积:页面组件控制在可读范围,复杂逻辑拆函数/拆模块
加练任务(进度较快的小组可选)
- 为
utils/mappers.ts与utils/offline.ts的纯函数补一份“用例表”(输入→输出→原因),至少覆盖 3 个边界用例(未知状态/空值/离线阈值边界)。 - 若项目已配置 lint/typecheck/test:执行并修到通过,记录 1 条“门禁失败→修复→再验证”的过程说明。