第一次让 AI 帮你写代码:用 JavaScript 完成一个待办事项清单
文章目录一、先明确我们要做什么二、先让 AI 拆解需求三、再让 AI 生成代码四、完整可运行代码五、如何运行这段代码六、如何验证 AI 生成的代码七、AI 生成代码时常见的问题1. 代码看起来完整但无法运行2. 只实现了正常情况3. 代码能运行但自己看不懂八、一套可以复用的提示词模板九、这次实践应该掌握什么总结✍创作者全栈弄潮儿 个人主页全栈弄潮儿的个人主页️ 个人社区欢迎你的加入全栈弄潮儿的个人社区 专栏地址欢迎订阅AI 编程提效实战前面的文章中我们了解了什么是 AI 编程也认识了常见的 AI 编程工具。这一篇不再停留在概念层面而是通过一个完整的小案例体验一次真实的 AI 编程流程让 AI 帮我们实现一个简单的 JavaScript 待办事项清单。这个案例虽然简单但包含了日常开发中比较典型的步骤分析需求拆分功能生成代码运行代码发现问题修改代码验证结果掌握这套流程后后面无论是开发表单、后台页面还是实现接口功能都可以使用类似的方法。一、先明确我们要做什么在让 AI 写代码之前不能只说一句帮我写一个待办事项应用。这个需求过于简单AI 不知道我们具体需要什么功能可能会出现以下问题使用什么技术实现不明确页面需要哪些功能不明确数据是否需要保存不明确是否需要处理空输入不明确代码应该放在哪个文件中不明确最终运行方式不明确因此在开始之前我们先把需求整理清楚。本次要实现的待办事项清单包含以下功能功能说明添加任务输入任务内容后点击按钮添加展示任务将已添加的任务显示在列表中完成任务点击复选框后标记任务已完成删除任务删除不再需要的任务数据保存刷新页面后任务仍然保留空输入校验不允许添加空白任务技术要求如下使用 HTML、CSS 和 JavaScript不使用前端框架不依赖第三方库所有代码放在一个 HTML 文件中双击文件即可在浏览器中运行需求越明确AI 生成的结果越接近我们真正想要的结果。二、先让 AI 拆解需求很多人使用 AI 时习惯直接让它输出最终代码。更稳定的方式是先让 AI 分析需求确认实现思路后再让它生成代码。可以使用下面这段提示词我想使用原生 HTML、CSS 和 JavaScript 开发一个简单的待办事项清单。 功能要求 1. 用户可以输入任务并添加 2. 任务显示在列表中 3. 每条任务前有一个复选框 4. 勾选后显示完成状态 5. 每条任务都可以删除 6. 使用 localStorage 保存数据 7. 输入为空时不能添加 请先不要生成完整代码 先帮我拆分功能模块 说明每个模块的实现思路 并列出需要注意的边界情况。一个比较可靠的 AI 回复通常会把需求拆分成以下模块页面结构模块输入框、添加按钮、任务列表。数据模块使用数组保存任务数据。渲染模块将任务数据转换成页面内容。添加模块获取输入内容并创建新任务。完成模块修改任务的完成状态。删除模块从数组中移除指定任务。持久化模块将任务保存到 localStorage。校验模块处理空输入和无效数据。这一步的价值在于我们可以先检查 AI 的理解是否正确。如果需求拆解错了及时纠正即可如果直接生成几百行代码后面再发现方向不对修改成本会更高。三、再让 AI 生成代码确认实现思路后可以继续给 AI 下面的提示词请根据刚才的功能拆解 生成一个完整可运行的 index.html 文件。 具体要求 1. 使用原生 HTML、CSS 和 JavaScript 2. 不使用任何第三方库 3. 所有代码放在同一个 HTML 文件中 4. 页面布局简洁适合初学者阅读 5. JavaScript 使用清晰的函数拆分 6. 使用 localStorage 保存任务 7. 添加任务时校验输入内容 8. 删除任务前不需要弹窗确认 9. 代码中添加必要注释 10. 输出完整代码并说明运行方法这里增加了“单文件”“不使用第三方库”“函数拆分”等限制可以减少 AI 输出不符合要求的代码。四、完整可运行代码下面是一份可以直接运行的示例代码。将代码保存为index.html然后使用浏览器打开即可。!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8metanameviewportcontentwidthdevice-width, initial-scale1.0title我的待办事项/titlestyle*{box-sizing:border-box;}body{margin:0;min-height:100vh;padding:40px 16px;background:#f3f5f7;color:#1f2937;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;}.todo-app{width:min(100%,640px);margin:0 auto;padding:28px;background:#ffffff;border-radius:12px;box-shadow:0 8px 24pxrgba(15,23,42,0.08);}h1{margin:0 0 24px;text-align:center;font-size:28px;}.input-row{display:flex;gap:10px;}#task-input{flex:1;min-width:0;height:42px;padding:0 12px;border:1px solid #d1d5db;border-radius:6px;font-size:15px;}#task-input:focus{outline:none;border-color:#2563eb;box-shadow:0 0 0 3pxrgba(37,99,235,0.12);}button{border:0;border-radius:6px;cursor:pointer;font-size:14px;}#add-button{padding:0 18px;background:#2563eb;color:#ffffff;}#add-button:hover{background:#1d4ed8;}#task-list{margin:24px 0 0;padding:0;list-style:none;}.task-item{display:flex;align-items:center;gap:10px;min-height:48px;padding:8px 0;border-bottom:1px solid #e5e7eb;}.task-text{flex:1;overflow-wrap:anywhere;}.task-item.completed .task-text{color:#9ca3af;text-decoration:line-through;}.delete-button{padding:6px 10px;background:#fee2e2;color:#b91c1c;}.delete-button:hover{background:#fecaca;}.empty-message{padding:20px 0;color:#6b7280;text-align:center;}media(max-width:480px){.todo-app{padding:20px 16px;}.input-row{flex-direction:column;}#add-button{height:42px;}}/style/headbodymainclasstodo-apph1我的待办事项/h1divclassinput-rowinputidtask-inputtypetextplaceholder请输入待办事项maxlength100buttonidadd-buttontypebutton添加任务/button/divulidtask-list/ul/mainscriptconstSTORAGE_KEYtodo-tasks;consttaskInputdocument.querySelector(#task-input);constaddButtondocument.querySelector(#add-button);consttaskListdocument.querySelector(#task-list);lettasksloadTasks();// 从 localStorage 读取任务数据functionloadTasks(){try{constsavedTaskslocalStorage.getItem(STORAGE_KEY);constparsedTaskssavedTasks?JSON.parse(savedTasks):[];returnArray.isArray(parsedTasks)?parsedTasks:[];}catch(error){console.error(读取任务失败,error);return[];}}// 保存任务数据functionsaveTasks(){localStorage.setItem(STORAGE_KEY,JSON.stringify(tasks));}// 将任务数据渲染到页面functionrenderTasks(){taskList.innerHTML;if(tasks.length0){constemptyMessagedocument.createElement(li);emptyMessage.classNameempty-message;emptyMessage.textContent暂时没有待办事项;taskList.appendChild(emptyMessage);return;}tasks.forEach((task){consttaskItemdocument.createElement(li);taskItem.classNametask-item;if(task.completed){taskItem.classList.add(completed);}constcheckboxdocument.createElement(input);checkbox.typecheckbox;checkbox.checkedtask.completed;checkbox.setAttribute(aria-label,完成任务${task.text});checkbox.addEventListener(change,(){toggleTask(task.id);});consttaskTextdocument.createElement(span);taskText.classNametask-text;taskText.textContenttask.text;constdeleteButtondocument.createElement(button);deleteButton.classNamedelete-button;deleteButton.typebutton;deleteButton.textContent删除;deleteButton.addEventListener(click,(){deleteTask(task.id);});taskItem.append(checkbox,taskText,deleteButton);taskList.appendChild(taskItem);});}// 添加任务functionaddTask(){consttexttaskInput.value.trim();if(!text){alert(请输入待办事项);taskInput.focus();return;}tasks.unshift({id:Date.now(),text,completed:false});saveTasks();renderTasks();taskInput.value;taskInput.focus();}// 切换任务完成状态functiontoggleTask(taskId){taskstasks.map((task){if(task.idtaskId){return{...task,completed:!task.completed};}returntask;});saveTasks();renderTasks();}// 删除任务functiondeleteTask(taskId){taskstasks.filter((task)task.id!taskId);saveTasks();renderTasks();}addButton.addEventListener(click,addTask);taskInput.addEventListener(keydown,(event){if(event.keyEnter){addTask();}});renderTasks();/script/body/html五、如何运行这段代码按照下面的步骤操作创建一个名为index.html的文件。将上面的完整代码复制到文件中。保存文件。使用浏览器打开index.html。在输入框中添加几条任务。勾选任务观察完成状态。删除一条任务。刷新浏览器检查任务是否仍然存在。如果刷新后任务还在说明localStorage保存功能正常。六、如何验证 AI 生成的代码代码能够运行并不代表代码完全正确。建议至少验证下面这些情况测试场景预期结果直接点击添加按钮提示输入任务输入空格后添加提示输入任务输入正常内容后添加任务成功显示按回车键添加任务成功显示勾选任务任务显示完成状态取消勾选任务恢复未完成状态删除任务任务从列表中消失刷新页面已有任务仍然存在添加较长文本页面布局不被撑破删除全部任务显示空列表提示这一步非常重要。AI 生成代码时通常会优先实现主流程但一些边界情况可能被忽略。开发者需要通过实际操作发现问题再把问题反馈给 AI。例如发现输入空内容也能添加任务可以继续询问当前代码允许用户输入空格后添加任务 请分析原因并修改代码。 要求 1. 使用 trim 判断输入内容 2. 空内容时给出提示 3. 输入框清空后保持焦点 4. 只输出需要修改的代码片段 并解释修改原因与其让 AI 每次重新生成全部代码不如明确指出问题让它进行局部修改。七、AI 生成代码时常见的问题1. 代码看起来完整但无法运行常见原因包括HTML 标签没有闭合JavaScript 变量名称前后不一致事件绑定到了错误的元素函数名称写错代码依赖了没有安装的第三方库解决方法是把完整报错信息和相关代码一起提供给 AI。打开页面后点击“添加任务”没有任何反应。 浏览器控制台报错 [粘贴完整报错] 请定位具体原因 指出错误代码所在位置 然后给出最小修改方案。2. 只实现了正常情况例如正常输入可以添加任务但空输入、重复任务、超长文本没有处理。可以让 AI 补充边界条件请检查这段待办事项代码 重点分析以下边界情况 - 空字符串 - 只有空格的输入 - 超过 100 个字符的输入 - localStorage 中保存了非法数据 - 用户连续快速点击添加按钮 请列出问题并给出修改建议。3. 代码能运行但自己看不懂这说明 AI 输出的代码超出了当前理解范围。可以要求 AI 降低代码复杂度请把这段代码改写成适合 JavaScript 初学者学习的版本。 要求 1. 保留原有功能 2. 减少复杂语法 3. 拆分成多个简单函数 4. 逐个解释每个函数 5. 说明数据是如何从输入框流向页面的使用 AI 的过程中不要只关注最终结果也要关注自己是否理解实现过程。八、一套可以复用的提示词模板以后开发类似的小功能时可以直接套用下面的模板我想开发一个【功能名称】。 使用技术 - 【技术名称】 - 【是否使用框架】 - 【是否允许第三方库】 核心功能 1. 【功能一】 2. 【功能二】 3. 【功能三】 输入数据 - 【输入内容和格式】 输出结果 - 【页面或接口应该返回什么】 特殊要求 - 【异常处理要求】 - 【边界情况】 - 【兼容性要求】 - 【代码组织要求】 请按照以下步骤完成 1. 先分析需求并拆分功能 2. 列出可能的边界情况 3. 给出实现方案 4. 再生成完整代码 5. 说明运行方法 6. 提供测试清单这个模板的核心不是固定的文字而是让 AI 清楚了解五件事你想做什么使用什么技术需要哪些功能有哪些限制希望 AI 按什么步骤回答九、这次实践应该掌握什么通过这个小案例我们完成了一次比较完整的 AI 编程流程明确需求 ↓ 让 AI 拆解功能 ↓ 确认实现思路 ↓ 让 AI 生成代码 ↓ 本地运行验证 ↓ 发现问题并反馈 ↓ 修改代码并再次测试需要特别注意的是AI 编程不是把需求复制给 AI然后直接复制它返回的代码。更合理的工作方式是开发者负责明确目标、判断方案和验证结果AI 负责提供实现建议和编码辅助。即使案例很简单也应该保留“生成、运行、验证、修改”这几个环节。总结让 AI 写代码之前首先要明确功能和技术要求。先让 AI 拆解需求再让它生成代码结果通常更稳定。代码生成后必须在本地运行并验证正常场景和异常场景。遇到问题时应提供完整报错、相关代码和运行环境。AI 适合帮助我们快速完成基础实现但不能替代开发者进行判断。一套清晰的提示词模板可以复用到不同的开发任务中。下一篇文章将继续讨论一个非常重要的问题为什么 AI 生成的代码不能直接使用如何对 AI 代码进行检查和验证✍坚持原创求关注点赞收藏

相关新闻

Java RAG 实战(第 6 篇):Markdown 知识库与 RAG

Java RAG 实战(第 6 篇):Markdown 知识库与 RAG

系列导航 所属专栏:《Java 开发者从零实现 RAG 知识库》学习位置:第 6 篇 / 共 12 篇上一篇:《第5篇:Embedding 与语义检索》下一篇:《第7篇:使用 Qdrant 保存和检索向量》 本篇先不引入向量数据库&#x…

2026/10/10 17:55:46 阅读更多 →
继承体系搭好了,方法找不到了

继承体系搭好了,方法找不到了

系列回顾:上一篇毛毛姐叠了三个装饰器,执行顺序全反了——洋葱模型 + 协议覆盖,元编程的两把双刃剑。这一篇,毛毛姐搭了个粉丝管理的多重继承体系,结果方法调用顺序完全不对。 📋 本期坑点速览:多重继承 MRO 顺序反直觉 super() 在闭包中绑定错误类 __name 名称修饰不…

2026/10/10 1:28:57 阅读更多 →
2024年KMS_VL_ALL_AIO激活工具完全指南:3步实现Windows和Office自动续期激活

2024年KMS_VL_ALL_AIO激活工具完全指南:3步实现Windows和Office自动续期激活

2024年KMS_VL_ALL_AIO激活工具完全指南:3步实现Windows和Office自动续期激活 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 周一早上,隔壁工位的小王一脸愁容地问我&…

2026/9/27 21:34:02 阅读更多 →

最新新闻

SpringBoot+Vue学生成绩分析与可视化平台全解析

SpringBoot+Vue学生成绩分析与可视化平台全解析

每年毕业季我都能在技术社区里看到大量和“成绩管理系统”相关的提问,这个题目属于那种“看起来老套、实则非常能打”的典型选题。特别是把Java、Vue、SpringBoot这三个词绑在一起的时候,它考查的已经不只是“会写增删改查”,而是完整的前后端…

2026/10/13 2:33:32 阅读更多 →
自制PS5辅助工具箱:游戏库管理、存储分析与网络监测实战

自制PS5辅助工具箱:游戏库管理、存储分析与网络监测实战

前一阵子,我遇到一个几乎所有主机玩家都会碰到的场景:周末想装一款新游戏,系统弹出提示说内置存储空间不足。那一刻我站在电视前反复权衡:哪款游戏已经通关了?哪款还有继续玩的价值?它究竟占了多少空间&…

2026/10/13 2:33:32 阅读更多 →
Java常用类核心解析:String、包装类与时间日期API的实践要点

Java常用类核心解析:String、包装类与时间日期API的实践要点

写这份笔记之前,我先说个背景。我的JavaSE学习笔记已经更到第四篇,前几篇分别梳理过环境搭建和基础语法、面向对象的核心思想、继承多态和接口这些抽象概念。到这期聊"常用类",性质突然就变了——不再是学概念,而是在学…

2026/10/13 2:33:32 阅读更多 →
Grafana配置文件grafana.ini全解:核心参数、修改与避坑指南

Grafana配置文件grafana.ini全解:核心参数、修改与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 2:33:32 阅读更多 →
gdal111编译版部署指南:环境变量配置与避坑实践

gdal111编译版部署指南:环境变量配置与避坑实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 2:33:32 阅读更多 →
Bootstrap 4多级下拉菜单实现:解决复杂导航层级难题

Bootstrap 4多级下拉菜单实现:解决复杂导航层级难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 2:32:31 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →