ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI辅助Web开发:用工程化与质量审查把应用从70分做到90分

AI辅助Web开发:用工程化与质量审查把应用从70分做到90分 1. 为什么 AI 写出来的 Web 应用总感觉“差一口气”先说个我最近的亲身体会。团队里有位同事用 AI 一口气生成了一套后台管理系统的界面表格、弹窗、表单校验一应俱全当时我们都觉得“这速度也太爽了”。结果放到测试环境一跑三天内陆续暴露了二十多个问题大量接口只在成功回调里处理了数据、失败分支直接报错白屏、日期组件在 Safari 下无法正常打开、分页逻辑有两页数据会重复显示。最要命的是整套代码几乎没有任何分层业务逻辑全部堆在组件里后期想改一个权限判断需要顺着五个文件一路追下去。这不是工具不行而是很多人对“用 AI 打造高品质 Web 应用”这件事的理解出了偏差。AI 的本质是概率模型它生成的不是对需求的理解而是对输入文本的“最可能续写”。这意味着如果你不把高品质的标准、约束条件、边界情况塞进上下文里它就会默认采用训练数据里最常见但也最平庸的写法。换句话说AI 能帮你把应用从 0 做到 70 分但从 70 分到 90 分的过程拼的是你在工程化、审查、验证上投入的判断力。那“高品质”到底该怎么定义我自己的标准有六个维度功能正确性所有分支、异常、边界都能得到合理处理而不是只走通 happy path。性能体验首屏加载时间、交互响应速度、列表渲染帧率都在合理范围内。可维护性代码分层清晰、命名规范、依赖关系单向换一个人接手能在半天内读懂。可扩展性新增一个模块或字段时不需要改动大量既有代码。安全健壮性用户输入被正确处理不存在明显的注入、越权、敏感信息泄露风险。工程化程度有类型检查、代码规范、自动化测试和部署流程不依赖“人肉验证”。这篇文章就是围绕这六个维度展开的。我会把 AI 辅助 Web 开发的全流程拆开讲从需求分析、架构设计、编码实现、测试验证直到部署上线每一步怎么和 AI 协作才能得到高质量结果以及我自己踩过的那些坑。2. 先立规矩再动手如何给 AI 注入工程约束很多人用 AI 写代码的方式是在对话框里输入一句“帮我写一个用户登录页面”然后复制粘贴。这种用法不是不行但生成出来的代码大概率是“玩具级”的——能跑但经不起任何推敲。高品质输出的前提是高品质的输入。这里的输入不仅仅是提示词而是你为这个项目建立的“上下文环境”。2.1 项目背景文档是 AI 协作的基石我给每个重要项目都会准备一份docs/ai-context.md文件里面包含五类信息# 项目背景 - 业务方向面向中小商户的会员管理系统 - 目标用户非技术背景的店铺经营者需要极简交互 # 技术栈与版本 - 框架React 18.3.1Vite 构建不使用 Next.js - 语言TypeScript 5.x开启 strict 模式 - UI 组件库Ant Design 5.x自定义主题色 #2F54EB - 状态管理Zustand不引入 Redux - 请求库axios统一请求/响应拦截器 - 后端接口RESTful 风格baseURL 为 /api/v1 # 代码风格和约束 - 组件使用函数式写法 React Hooks - 禁用 any所有 API 响应必须定义 interface - 不考虑 IE但需兼容 Chrome/Safari/Edge 近两个大版本 - 文件命名组件使用 PascalCase工具函数使用 camelCase # 目录结构说明 src/ api/ # 接口封装 components/ # 公共组件 pages/ # 页面级组件 store/ # 全局状态 utils/ # 工具函数 types/ # 全局类型定义 # 已知约束 - 项目是嵌入式 WebView 内核需兼容 WebKit 的某些非标行为 - 音频返回格式固定为 base64不可切换为 blob写这段文档的过程本身就是一次需求澄清。你不需要用 AI 来替代思考而是用 AI 来执行你已经想清楚的方案。当你把这份文档粘贴到对话里再去提问AI 输出的代码会立刻变得“有规矩”很多。2.2 把你的提示词从“功能描述”升级为“验收标准”我推荐一个三段式的提示方法身份设定 输入材料 明确约束与验收点。举个例子。大多数人会这样提问帮我写一个搜索框支持防抖。更好的写法是你是这个项目的资深前端工程师。以下是我们的项目背景和技术规范[粘贴 ai-context.md 内容]。现在需要实现一个用户搜索框需求要点如下输入关键字后 300ms 防抖搜索用户列表接口为 GET /api/users/search?keywordxxx返回 { code, data, message } 结构在请求期间显示 loading 状态禁止重复提交若返回的 data 为空数组展示“暂无匹配用户”若接口异常网络错误或 code ! 200在页面上给出错误提示并提供重试按钮组件需要支持清空关键字后自动恢复初始列表这段代码拆分为自定义 hook useUserSearch 和组件 UserSearchBox。请先在你的回答里列出你理解的需求拆解和可能遗漏的边界再输出代码。看到区别了吗后者不给 AI“自由发挥”的空间而是把边界情况全部显式化。实测下来用这种方式产出的代码返工率可以降低一半以上。2.3 让 AI 先提问再回答如果你自己的需求也还没完全想清楚有个很有用的技巧在提示词末尾加上一句话——“先不要写代码针对我的需求提出你认为是关键问题的多个问题逐个回答我之后再动手。”这一点特别适合那些只有模糊想法的场景。比如客户说“做一个数据看板”你让 AI 先问数据从哪里来实时性要求多高大屏还是桌面端需要导出功能吗不同角色看到的数据范围一样吗等你回答完这些问题其实需求文档就已经基本成形了。这时候再让 AI 生成代码准确率会高非常多。3. 从需求到落地AI 在 Web 应用各环节的真实用法把 AI 只当“代码生成器”是最浪费的用法。它更像是团队里的一个全能实习生——你要给它明确的任务、验收标准还要在产出后进行检查和修正。下面按一个 Web 应用的完整生命周期说说我在每个环节实际怎么用它。3.1 需求分析阶段用 AI 做假设检验和遗漏补全把原始需求贴给 AI让它列出“你可能没有考虑到的问题清单”。比如一个会员积分系统AI 可能会问积分结算周期是实时还是定时订单退款后积分是否回撤积分有效期多久不同等级倍率是否支持配置这些问题不一定每个都有用但它们能帮你提前暴露需求盲区。有个很实用的做法让 AI 按照“功能需求 / 非功能需求 / 边界与异常 / 交互细节”四个方面整理成表格然后你逐条回复最终形成的文档就是产品经理和开发之间的沟通基础。3.2 技术选型阶段让 AI 做方案对比矩阵技术选型不是让 AI 直接告诉你“用 Vue 还是 React”这么简单。更有效的用法是让它按照你设定的权重维度做对比我们团队熟悉 React项目需要兼顾移动端 H5 和管理后台预计半年后会有多语言需求。请从学习成本、生态成熟度、性能、包体积、维护成本五个维度对比 React Ant Design、Vue 3 Element Plus、Svelte Skeleton 三套方案每项打分并说明理由。AI 的打分未必权威但它能快速组织出一个结构化的分析框架帮你注意到自己可能忽略的因素。我通常让它产出对比表后自己再去核实最关键的两三个维度。3.3 架构设计阶段让 AI 扮演架构评审员架构能力是 AI 的短板但也是它的长板——你不需要它凭空设计出优雅的架构而是让它对你已有的设计挑毛病。我的习惯是在画好模块关系图、定好目录结构后把相关描述发给 AI这是项目的技术方案React Zustand React Query组件间通过 props 通信全局状态只存用户信息和主题配置。接口请求全部放在 api/ 层页面组件只负责组合。请从职责单一、可测试性、横向扩展三个角度指出这个方案可能存在的问题。有一次 AI 指出了我设计中的数据流混乱隐患两个页面都直接修改了全局 store 中的订单列表字段导致状态来源不唯一。我顺着这条线索重构后后续新增功能时明显省力。这就是一个好的“架构评审员”带来的价值。3.4 编码阶段从“整页生成”变成“模块生成”控制 AI 生成代码的粒度是质量提升的关键。我推荐的原则是一次只让它生成一个模块或一个自定义 hook不要让它一口气输出整个页面。原因很简单。页面级代码涉及多个域布局、数据请求、状态管理、组件通信、样式、异常反馈。AI 同时处理这么多关注点时特别容易顾此失彼。比如你可能遇到它把 loading 状态做成组件内部变量导致父子组件状态不同步或者在样式里写死了width: 100vw结果在小屏设备上横向溢出。模块级生成时每个模块的职责边界清晰你审查起来效率也高。生成完需求描述中的useUserSearch再生成UserSearchBox然后再组装到页面上。虽然对话次数变多了但总时间反而更短——因为几乎不用返工。3.5 测试阶段让 AI 生成“刁钻用例”让 AI 补全单元测试是一个高频高价值的用法。但这里同样要设置约束只让它写测试不叫能力能让它写出有价值的测试才叫能力。针对 utils/formatPrice 函数请生成单元测试用例。要求覆盖正数、负数、0、超大数值、浮点精度、非数字输入、NaN、Infinity、字符串类型的数字、只有两个小数位但不需要补零的情况。这个函数处理的就是货币格式化。AI 生成的用例里会包括1000000.009这类边界值而这些恰恰是手工写测试时容易漏掉的点。测试用例生成后你需要做的不是全盘接收而是逐条确认每个用例背后的断言是否符合真实业务预期。AI 经常在断言上犯“自证清白”的毛病——它写的测试怎么跑都会过因为断言逻辑被放宽了。3.6 文档与协作让 AI 生成 README、接口说明和变更记录代码写完了文档经常被忽略。这部分恰恰是 AI 最擅长的地方。让它根据代码生成README.md包括本地启动方式、环境变量说明、部署步骤和常见问题顺手让它生成一份提交记录模板和代码规范文档团队协作时的摩擦会少很多。4. AI 代码的质量防线审查、验证与体系化重构接入了 AI 辅助开发之后你代码库里的代码会以更快的速度累积。如果不建立质量防线AI 帮你节省的时间会在“填坑”上加倍花回去。4.1 三层防线Lint 类型检查 人工 Review我自己的项目强制开启以下检查链路任何人包括 AI提交的代码都必须通过第一层静态检查。TypeScript 开启strict: trueESLint 使用eslint-config-alloy强制要求没有any、没有未使用变量、没有隐式 any 函数参数。Prettier 负责格式统一。这一层的价值是消灭低级问题省出大量审查时间。第二层自动化测试。关键业务函数和 hooks 必须有单元测试核心交互链路必须有端到端测试Playwright。CI 上跑vitest和playwright test任何用例失败都禁止合并。第三层人工 Code Review。AI 生成的代码必须由人来看一遍。重点看那些机器不容易发现的问题业务逻辑是否符合真实场景状态设计是否合理有没有过度设计接口命名是否符合团队惯例。4.2 专门盯防 AI 代码的“常见病”和 AI 协作时间长了你会发现在它输出的代码里有几类问题高频率出现问题表现形式对策类型宽松大量使用any、as any强制断言提示词中明确“所有响应需定义 interface禁止 any”过度的防御式编程每个函数入口都try...catch吞掉真实错误要求“异常必须向上抛由调用方决定处理策略”组件耦合数据请求写在组件内部无法复用要求“拆分为自定义 hook 纯 UI 组件”重复代码多处相同的逻辑散落在不同组件要求“提取公共函数禁止复制粘贴式实现”样式硬编码颜色、间距、字号全部写死要求“使用设计 token从 theme 中引用变量”以“过度防御”为例AI 特别喜欢在函数里包一层 try/catch 然后把错误console.log掉。这在 demo 里看起来“健壮”上线之后却成了调试地狱——错误被吞了页面毫无反馈用户一脸懵。所以我的提示词里通常会写明错误处理需要区分“预期异常”和“未知异常”预期异常要给用户明确提示未知异常要上报监控平台并显示兜底页面。4.3 一个真实的重构案例把 AI 的一坨代码变成可维护结构前阵子让 AI 写了一个“批量导入会员”的对话框组件。AI 一次性吐出了 500 行代码功能都跑通了但所有逻辑全塞在一个组件里文件解析、格式校验、进度管理、表格展示、接口分批提交、错误日志六件事挤在一起函数长度超过 80 行的有三处。我没有直接改它而是把组件拆成四层解析层parseExcel(file): PromiseMemberRow[]校验层validateRows(rows): ValidationResult提交层submitInBatches(validRows, batchSize): PromiseSubmitSummary展示层MemberImportModal仅负责用户交互和状态流转给 AI 的指令是“现有代码可以简化成 4 个模块请按上面的职责边界重写并给每个模块补充单元测试。”再生成出来的代码每一层都可以独立测试和复用。整个过程四十分钟完成比手动重构快得多而且结果比全手写更规整。这就是 AI 协作的正确姿势不要让它负责架构只让它负责在明确边界内执行然后由人去做集成、权衡和调整。5. 按项目需求选型四类 AI 辅助开发工作台的优劣对比工具选型是很多人卡住的第一步。市面上的 AI 辅助开发方案按集成深度可以分成四类。我根据实际项目情况做了一张对比表供你参考方案典型工具优点局限适合场景对话式 Web 端ChatGPT、Claude、Kimi 等上限高能处理超大上下文可粘贴整段需求/代码需要手动复制粘贴操作成本高不适合高频小改动架构方案讨论、代码审查、复杂问题分析IDE 插件自动补全式Cursor、Copilot、通义灵码与编辑器深度集成补全速度快使用成本低对“整个文件”和“跨文件重构”的理解有限容易产生“看起来对但其实跑不通”的代码日常编码、样板代码、单元测试、代码生成本地模型部署Llama、Qwen 的本地版本数据不出内网隐私安全能力上限弱于云服务硬件投入高有数据合规要求的企业项目API 接入自建 AgentOpenAI API、DeepSeek API可自定义工作流批量处理和 CI/CD 打通开发成本高需要持续的 prompt 管理和维护团队级 AI 工作流、自动化任务、批量代码迁移我的日常组合是架构和疑难杂症用对话式 Web 工具上下文大可以贴完整项目文档编码和测试用 IDE 插件补全响应快批量任务用脚本调用 API 自建小工具比如批量给旧代码补类型定义。另外如果你的团队规模在三个人以上值得做一个公共的.cursorrules文件或AGENTS.md把项目的技术栈、编码规范、禁止事项写清楚。这样无论谁用 IDE 插件写代码AI 的行为都会收敛到团队共识之内。6. 实测高频踩坑清单这些坑我替你踩过了从实际项目出发我在使用 AI 开发 Web 应用时积累了一些真金白银的踩坑经验挑几个最典型的展开说说。6.1 AI 生成的代码中“依赖幻觉”问题AI 经常推荐一些并不存在、或者早已被弃用的 npm 包尤其是冷门功能。有一次我让它实现“浏览器端读取身份证信息”它推荐了一个名称听起来很靠谱实际上不存在的库导致 CI 直接失败。对策是用任何 AI 推荐的第三方库之前先去 npm 官网或 GitHub 查一下 star 数量、最近更新时间、维护状况。尤其是它给出的安装命令里带--save-exact或 lock 文件时务必核实版本。6.2 数据处理时对“空值”的处理位置不对AI 经常把if (!data) return []这样的空值兜底放在组件的最顶层导致整个组件白屏或显示异常而不是在数据加载层统一处理。一个更合理的做法是在 API 层封装一个unwrapResponse函数统一处理code ! 200、data null、data undefined的分支组件层面只管渲染已经规范化后的数据。命令 AI 时可以直接写——“所有从 API 层返回的数据必须经过 normalize组件内禁止对空值做防御式判断。”6.3 AI 对浏览器兼容性的理解往往基于“理想环境”AI 默认你用的是最新版 Chrome所以它生成的代码可能用了很新的 API比如Array.prototype.toSorted、structuredClone、:has()选择器。如果你的用户还在用老版本浏览器或内置 WebView这就麻烦了。我的处理方式是在项目背景文档里明确写好兼容目标再在 lint 配置里加browserslist让构建工具在编译阶段就给出兼容性警告。6.4 “自动修复”越修越坏AI 修 bug 的常见策略是“猜”。你告诉它“这里报错了”它会沿着错误栈去“猜”一个可能的修复方案。有时它会把正确代码改成逻辑错误的代码表面看起来没报错了实际上行为完全变了。因此我的经验是每次让 AI 修改代码之前先写一个失败的单测用例让它以“让测试由红变绿”为目标去修复而不是直接改代码后让你自行验证。这样至少能保证它没有治标不治本。6.5 状态管理被 ChatGPT 默认带偏成“全家桶”AI 的默认行为是理想化的“企业级”写法动不动就给你引入 Redux Toolkit、React Router、axios、Ant Design、TailwindCSS 一整串依赖。对小项目来说这是灾难。有一次它建议为只有两个字段的全局设置引入 Redux我拒绝后手动改成 localStorage Context包体积直接降了 80KB。所以提示词里最好写上“优先使用语言和框架原生能力避免引入额外的状态管理库只有当 props 传递层级超过三层时才考虑 Context 或轻量状态库。”7. 一套能直接抄走的 AI 辅助 Web 开发工作流最后分享一套我个人目前在用的工作流适用对象是 2~6 人的小团队做企业级 Web 应用的日常开发。它不是教条而是一个经过多轮迭代后比较顺手的状态。需求阶段把原始需求贴给 AI让它按“功能 / 非功能 / 边界 / 交互”四象限列问题清单。人工逐条确认或修改形成需求文档。让 AI 根据需求文档生成“验收标准清单”作为后续测试用例的输入。编码阶段每一个模块用“背景文档 需求描述 边界约束”格式发起新对话。让 AI 先输出理解和一个简短的实现计划人工确认后再写代码。代码产出后先跑 lint/类型检查/单元测试再人工 review 核心逻辑。累积几条质量要求到团队的.cursorrules里减少重复纠正。集成与发布阶段用 AI 辅助生成数据库迁移脚本、环境变量说明、依赖变更说明。让 AI 基于 git diff 生成变更记录人工补充重要信息。端到端测试用例交给 Playwright 跑AI 负责补全选择器和断言。这套流程里最关键的一个底层原则是AI 是杠杆人是支点。支点越稳定杠杆的放大效应越强。如果你连自己的项目规范、边界条件和质量底线都没想清楚AI 不仅不会帮你提质反而会把平庸的代码以更快的速度铺满仓库。我自己在跑通这套流程之后最明显的感受是AI 补齐了“人手不足”的短板但从未替代“工程判断”。该你做的架构决策、边界梳理、经验判断一样都不能省。把这些做扎实之后AI 才能成为真正的高品质应用加速器。
返回列表