VibeCoding开发小程序总结与思考

VibeCoding开发小程序总结与思考

一、写在前面:学生的AI开发实验

首先介绍一下我的项目背景~我没有企业资质,只是纯粹的学生个人开发者,想做个微信小程序体验一下我感兴趣的的全vibe coding流程。项目叫食算纪——一个帮你算每日热量、做AI食谱推荐的工具类小程序。

分工比较明确:
Trae以及Codex负责全部前端UI交互,从页面骨架到样式调试到交互逻辑,几乎没手写过一行WXML;
我负责底层的部署——微信登录、云函数接口、Dify AI对话对接、数据流转、上线配置等。

这篇文章是想存档并且分享一个全流程——两个AI协作、一个小程序、从零到上线的完整心路


二、两个关键方案要取舍:做决策比写代码重要

2.1 弃用手机号登录,改OpenID静默方案

最开始想得很理想——“用户进来一键登录,我拿手机号做用户标识” 然后就去研究微信的 getPhoneNumber 接口。结果是:个人小程序接不了。微信要求 getPhoneNumber 必须在微信开放平台绑定,个人主体没这权限。

折腾了两天,试过各种"曲线救国"方案:

  • 方案一:让用户手动输入手机号 + 验证码。被自己否决了——个人小程序发短信要钱,接入验证码SDK要企业资质,此路不通。
  • 方案二:纯邮箱注册。在小程序端,邮箱输入体验极差,而且微信生态里用户天然抵触填表单,留存率会崩。
  • 最终方案OpenID + 静默登录 + 游客模式

思路比较简单——用户打开小程序,我在后端自动调 wx.login,拿到临时code后传给云函数,云函数换回 openid,这就是用户的唯一标识。全程不需要用户点任何按钮,自动注册。用户首次进入是游客,可以浏览首页食谱、看内容,只有用到AI推荐、收藏、记录三餐等核心功能时,才弹出温和提示引导登录。

落地时的核心代码(云函数端,有脱敏处理):

`javascript
// 云函数: user_login
const cloud = require(‘wx-server-sdk’)
cloud.init()
const db = cloud.database()

exports.main = async (event) => {
const { cloudID } = event
const wxContext = cloud.getWXContext()
// openid 由云函数自动解析,不涉及敏感信息
const openid = wxContext.OPENID

// 查询或创建用户
let user = await db.collection(‘users’).doc(openid).get()
.catch(() => null)

if (!user) {
await db.collection(‘users’).add({
_id: openid,
role: ‘guest’,
createdAt: db.serverDate()
})
}

return { openid, isNew: !user }
}
`

客户端这边,我在 uth.service.js 里封装了一层:isLoggedIn() 检查缓存中是否有 uth_token,isGuest() 判断 uth_guest 标志。首页 onShow 里做一次判断,没登录且非游客状态才跳登录页。游客登录和正式登录是独立的两条路径,互不干扰。

这个取舍让我省掉了短信费用、规避了资质问题,体验上用户进来就能看内容,留存反而比强制登录好。

2.2 本地Dify迁移云端SaaS:AI接入的完整落地记录

AI食谱推荐是我的小程序“食算纪”的核心功能。最初我在本地搭了Dify社区版,部署在内网服务器上,通过内网穿透让小程序访问。但这个方案的问题很关键:

问题1:本地Dify的稳定性取决于内网穿透服务的可靠性。我用的frp穿透,高峰期经常断连,用户那边"AI推荐食谱"按钮转圈30秒然后报错
equest:fail,排查半天发现是穿透服务有问题。

问题2:Dify社区版更新频繁,每次升级都要手动迁移数据,工作流和知识库配置得重配。

问题3:最关键的一点——微信小程序要求所有请求域名必须配置在合法域名白名单中。内网穿透的域名每次换服务器IP都要重新配置,审核周期1-3个工作日,等项目审批下来用户早流失了。

最终决定:迁移到Dify云端SaaS(dify.ai的官方云服务)

迁移过程踩了几个坑:

  • 工作流兼容性:本地版导出工作流DSL文件,导入云端SaaS后发现部分节点配置不兼容(本地版的自定义工具节点在云端的映射规则不同)。解决:逐个节点检查,把自定义HTTP请求节点改成了LLM节点+代码节点组合。
  • API密钥管理:本地版直接用API Key调用,云端SaaS要求用 pp-secret + pp-id 的方式鉴权。我需要在云函数端重新封装Dify对接逻辑。
  • 响应格式差异:本地版流式返回SSE格式,云端SaaS返回JSON格式。客户端那边的解析逻辑要同步改。

迁移后的对接代码如下(云函数端,有脱敏处理):

`javascript
// 云函数:dify_chat
const cloud = require(‘wx-server-sdk’)
cloud.init()

exports.main = async (event) => {
const { query, user_id } = event
const DIFY_API = ‘https://api.dify.ai/v1/chat-messages’

const res = await cloud.callFunction({
name: ‘http_proxy’,
data: {
url: DIFY_API,
method: ‘POST’,
headers: {
Authorization: 'Bearer ’ + event.api_key,
‘Content-Type’: ‘application/json’
},
data: {
inputs: {},
query: query,
user: user_id,
response_mode: ‘blocking’
}
}
})

return res.result
}
`

核心经验:内网穿透方案在开发阶段够用,但上线必须上云端产品。不是因为本地Dify不好,而是小程序生态对域名、HTTPS、稳定性有硬性要求,是绕不过去的。


三、VibeCoding开发经验总结(Trae前端 + 后端接口融合经验)

我自己记录了比较丰富的踩坑经验,结合了自己做底层接口对接的体会,总结出一套融合AI协作的高效方法论

3.1 指令要量化到像素级,不要给AI模糊空间

Trae文档里有个特别真实的案例——早期做个人中心页时指令写"做一个个人中心页,简约古风",结果AI生成了:

【界面还原描述:顶部出现一个超级大的浅绿色椭圆背景包裹着头像,椭圆宽度远超头像两倍以上,昵称在头像正下方竖排显示,热量卡片被挤到右下角且尺寸巨大,整体布局臃肿不对称】

这问题我在后端接口对接时也遇到过。让AI写一个 “用户登录接口”,它给我写了一个 wx.login + wx.getUserProfile + 数据库读写 + 页面跳转全都揉在一个云函数里。原因我认为是:指令缺少约束维度

两个AI协作后,我提炼出一个标准指令模板,无论给Trae写前端还是给我底层写接口,都按这个结构:

任务:[一句话说清做什么]
输入输出:[明确入参类型和返参结构]
约束条件:[技术栈、环境限制、禁止项]
代码规范:[文件命名、模块拆分规则]
适配要求:[多端兼容、边界情况]
禁止事项:[明确排除的内容]

举个例子,我让AI写Dify对接云函数时的指令:

任务:编写云函数调用Dify chat-messages API,接收用户query返回AI回复
输入:event.query(string),event.user_id(string)
输出:返回AI回复文本
约束:运行在微信云函数环境,使用cloud.callFunction代理HTTP请求
代码规范:拆分为dify_chat主函数和http_proxy辅助云函数
禁止:不要硬编码API密钥,使用cloud的环境变量;不要使用axios

这个命令的关键在于——把"期望"变成"约束",AI自由发挥的空间小了,返工率就低了。

3.2 需求拆分:不要一次给AI完整页面/完整接口

Trae文档里有个很好的实践:"结构 → 样式 → 交互 → 适配"四步迭代。做后端接口对接也是类似的:“入参定义 → 逻辑实现 → 异常处理 → 性能优化”

我做Dify对接时,第一步只让AI写API调用的函数签名和入参校验,第二步才填充核心的业务逻辑,第三步补异常处理和重试机制,第四步优化超时和缓存。每次只改一个关注点,AI不容易翻车,出了问题也知道精确到哪一行代码。

Trae那边踩过一个同样逻辑的坑——让AI一次性生成"AI推荐食谱"完整页面,结果WXML结构做对了但CSS样式太丑,修样式时又不小心改坏了WXML结构。后来改成:先让Trae生成骨架WXML,确认布局没问题后加样式,最后补交互逻辑。每一步改动都在前一步确认的基础上叠加,不会发生"改A坏了B"的连锁崩塌。

3.3 多AI分工的关键:建立统一的"上下文锚点"

两个AI做同一个项目,最大的问题是风格漂移。今天用Trae生成了一个页面,配色是 #1F6B3E 深绿配 #F9F6EF 米白底;明天用另一个AI写后端管理面板,它自己选了蓝色主色调,跟小程序前端完全对不上。

我的解决办法是:在项目根目录维护一份设计规范文档和接口规范文档,每次对话开头都附带一句"记忆锚点"。

给Trae的锚点:

沿用食算纪规范:主色#1F6B3E,背景#F9F6EF,卡片圆角28rpx, 字号24-40rpx七级体系,按钮渐变#D7EFDD→#A7E0B8配深绿文字

给我底层AI的锚点:

项目环境:微信云开发,云函数Node.js 12+
数据库:云数据库,集合命名users/meals/favorites/recipes
鉴权方式:OpenID静默登录,auth_token缓存机制
API代理:通过http_proxy云函数转发外部API请求

这一行"锚点"能让AI从第一个回答就开始保持在正确的上下文中,不需要你反复纠正"不对,颜色改成绿色"“不对,用云函数不是Express”。成本几乎为零,但效率提升很明显。

3.4 AI生成的代码,一定要做"人工审查"

这句话听起来像废话,但实际开发中是很多人(包括我)会偷懒的环节。AI生成的代码"看起来能用"就直接部署了,然后线上出问题才回头排查。

我踩过的几个"太过信任AI"的坑:

  • Trae生成的头像选择按钮用了 包裹,没有清掉微信小程序的默认 ::after 伪元素边框和 line-height,导致头像在真机上变成椭圆形。排查了半小时才发现是button默认样式问题。
  • 我让AI写的云函数登录接口,它没有做 ry-catch,用户网络差时 wx.login 偶发失败,请求直接抛错,小程序白屏。加了一个全局错误中间件才稳定。

所以我现在养成了习惯:AI提交代码后,我至少花5分钟做code review——看异常处理是否完备、边界情况是否覆盖、敏感信息是否泄露。这5分钟帮我拦截了至少80%的上线后故障。


四、全场景Debug排错合集(五大类真实问题)

这一章是真正的"血泪史"。我按问题类型分类,每条统一格式:现象 → 根源 → 解决方案

4.1 权限类

问题:getPhoneNumber接口调用失败,返回"无权限"
现象:用户点击"微信手机号一键登录"按钮,弹窗提示"获取手机号失败"。
根源:个人小程序没有 getPhoneNumber 的调用权限,这是微信开放平台对认证企业的专属能力。我绕了一大圈才发现根本不是代码问题,是资质问题。
解决:放弃手机号方案,彻底改用OpenID静默登录 + 游客模式。对外展示用户昵称和头像通过 wx.getUserProfile(仅限已登录用户触发),用户标识只用openid。

问题:头像选择后保存失败
现象:用户点击头像区域弹出选择器,选完头像后保存到数据库,再次打开仍是旧头像。
根源:微信头像URL有时效性,直接存 vatarUrl 到数据库,一段时间后URL过期失效。另外 在部分基础库版本下 indinput 不触发,导致昵称丢失。
解决:头像用云存储转存——用户选完头像后,云函数把临时URL下载并上传到云存储,存云存储的永久FileID;昵称同时监听 indinput 和 indblur,lur 时兜底取值。

4.2 域名类

问题:request:fail 域名不在合法列表中
现象:小程序调用Dify API时,真机上始终返回
equest:fail。开发工具中"不校验合法域名"勾上能跑,真机一关就不行。
背景:【界面还原描述:手机上打开小程序,点击"AI推荐食谱"功能后,页面底部出现红色toast提示"网络异常",稍后loading消失,页面没有任何数据展示。开发者工具中看到控制台报错信息指向request失败,URL为自定义穿透域名。】
根源:微信小程序要求所有 wx.request 的域名必须在微信公众平台配置为合法域名,且必须是备案过的HTTPS域名。内网穿透的临时域名不可能通过备案审核。
解决:所有外部API调用统一走云函数代理。云函数不在域名白名单限制范围内,云函数的HTTP请求微信不管。我建了一个 http_proxy 云函数做通用转发层,所有第三方API请求经它中转。

问题:云函数请求超时
现象:用户连续快速点击"换一批"切换AI食谱,页面loading转圈超过20秒,最终显示"请求超时"。
根源:云函数默认超时时间是3秒(免费版),Dify的AI生成需要5-15秒,必然超时。加上快速点击产生多个并发请求,云函数并发数超限。
解决:在云函数控制台将超时时间调整为20秒(免费版最大支持),客户端加防重复点击锁,以及一个"请求合并"机制——相同查询在5秒内只发一次,缓存结果返回。

4.3 Dify对接类

问题:Dify响应内容格式异常
现象:AI回复中包含大量Markdown标记和列表符号,在小程序端直接显示成了原始符号而不是格式化文本。
根源:Dify的Prompt中没有要求纯文本回复,默认输出Markdown格式。小程序端没有Markdown渲染能力,直接当纯文本显示了。
解决:在Dify的Prompt末尾加了约束:"请使用纯文本回复,不要使用Markdown标记、列表符号、粗体斜体标记。用数字序号+顿号表示列表,用换行分段。"同时在小程序端用正则过滤残留标记。

问题:Dify工作流导入失败
现象:从本地Dify社区版导出的DSL工作流文件,导入云端SaaS时报"节点配置不兼容"。
根源:本地版和云端版的节点Schema有差异,特别是自定义工具节点和HTTP请求节点的配置格式不同。云端版不支持本地版的部分插件。
解决:云端重新搭建工作流,对照本地版的逻辑链,用云端的原生LLM节点 + 代码节点 + 知识检索节点重新组合。写了一份迁移文档记录节点映射关系:

本地节点云端替代方案
自定义HTTP工具LLM节点 + 代码节点
知识库检索云端知识库节点(需重新上传文档)
条件判断代码节点内写if逻辑
变量聚合LLM节点输出格式化指令

4.4 UI布局类

问题:flex布局文字溢出
现象:食谱详情页中,菜名超过10个字时,文字把右侧的热量卡片和收藏按钮挤出屏幕,热量卡片只显示一半。
根源:AI生成的flex布局中,文字区域没有设置 min-width: 0,flex子元素内容溢出时不收缩。这是CSS flex布局的经典问题。
解决:文字容器加 min-width: 0,右侧固定元素加 lex-shrink: 0,长文本用 -webkit-line-clamp: 2 限制显示两行。

问题:按钮文字显示HTML实体编码
现象:登录页 getPhoneNumber 按钮上显示  和 › 字符,看起来像乱码。
根源:AI在生成WXML时混入了HTML实体编码(如  是字体图标编码),小程序WXML引擎不解码HTML编码,直接当文字显示。
解决:全文搜索WXML中所有 &#x 开头的字符串,替换为纯文字。指令中明确要求"不要使用HTML实体编码,所有符号用Unicode字符直接写"。

问题:loading状态卡片留白过大
现象:AI推荐食谱的加载状态卡片,上下padding设了48rpx,配合64rpx的图标和28rpx的按钮间距,中间出现大片空白,视觉上像内容丢失。
根源:AI认为空状态需要"呼吸感",给了过大的内边距和元素尺寸,但空状态内容少,大padding反而暴露了"内容不足"的缺陷。
解决:空状态卡片padding统一32rpx,图标56rpx,元素间距16rpx。核心原则:空状态的视觉重量应低于正常内容卡片

4.5 网络与性能类

问题:退出登录后缓存残留导致状态异常
现象:用户退出登录后重新登录,个人中心仍显示旧头像和昵称,首页数据也未清空。
根源:logout() 只清了 uth_token 和 uth_user,没有清理 mine_user、profile、meals 等业务缓存。重新登录后从缓存中读取了旧数据。
解决:logout() 中统一清理所有用户相关缓存Key,用一个白名单管理(只保留不依赖登录态的基础配置),其他全部清除。退出后
eLaunch 清空页面栈。

问题:快速点击触发重复请求
现象:用户快速连续点击"换一批"按钮,触发了多个并发Dify请求,服务器端生成多个回复,页面展示混乱。
根源:按钮没有防重复点击机制,异步请求未完成时按钮仍可点击。
解决:所有异步按钮设置 loading 和 disabled 双重保护:

javascript // 通用按钮防重复点击逻辑
handleTapButton: function () {
if (this.data.isSubmitting) return
this.setData({ isSubmitting: true })
// 异步操作
wx.showLoading({ title: '处理中...' })
doAsyncTask().finally(() => {
this.setData({ isSubmitting: false })
wx.hideLoading()
})
}


五、个人小程序上线适配实操经验

这一章全是我在上线过程中用血泪换来的经验!

5.1 隐私协议修改

微信从2023年9月开始要求所有小程序必须配置《用户隐私保护指引》,否则部分接口无法调用。

踩坑点1:隐私协议写得"太全"。我一开始直接复制了网上某大厂的隐私协议模板,结果微信审核反馈"协议内容与小程序实际功能不符"。原因是我的小程序没用到「位置信息」「相册写入」等权限,但协议里写了,审核认为"声明权限超出实际功能"。

解决:老老实实对照微信公众平台的功能列表,逐项确认自己的小程序用什么权限,只声明真正用到的——用户昵称、头像、openid、剪切板(复制食谱文字)。

踩坑点2:隐私授权弹窗触发时机不对。我开始在 onLaunch 时弹隐私授权弹窗,结果小程序都还没渲染就弹窗,用户点同意后页面没加载出来,体验极差。

解决:移到首页 onShow 中检测,如果 wx.getPrivacySetting 返回
eedAuthorization: true,再弹窗。同意后正常加载页面,不同意则显示"部分功能受限"的提示页。

5.2 域名配置

域名配置直接决定小程序能不能正常跑。我的配置清单:

  1. 云开发域名自动白名单:微信云开发(cloudbase)的域名不需要手动配置,自动在白名单中
  2. 外部域名:如果小程序直接调外部HTTP API,必须在「开发管理 - 服务器域名」中配置
    equest合法域名。但我的方案是全部走云函数代理,所以这一步我几乎没配任何外部域名
  3. 业务域名:如果需要内嵌web-view,还要配业务域名。个人小程序用web-view有限制,我干脆没做这个功能

核心建议:能用云函数代理的请求全部走云函数代理,省去域名配置的麻烦。云函数请求外部API时,微信不检查域名白名单。

5.3 上线自查清单

我整理了一份上线前的checklist,每次提审前对照检查:

  • 首页不依赖登录态,游客能顺畅浏览
  • 所有 wx.request 域名已配置合法域名(或已走云函数代理)
  • 隐私协议已配置并正确触发
  • 无硬编码密钥、内网IP,所有敏感信息存云函数环境变量
  • 所有API调用有异常处理,网络差不白屏
  • 所有按钮有防重复点击
  • 退出登录后缓存完全清除
  • 加载状态有loading指示,空数据有占位提示
  • 头像URL已转存云存储(非微信临时URL)
  • 字号统一rpx单位,flex布局有min-width:0防溢出
  • 真机测试通过,非仅开发者工具测试
  • 已设置合理的云函数超时时间(AI功能20s,普通接口5s)
  • 符合微信「个人主体小程序」的类目要求(审核最关注的)

审核被拒"重灾区":个人小程序最容易在类目选择上被拒。我用的是「工具-计算类」,需要提供计算功能的文案说明。如果你的小程序涉及"医疗建议"“饮食建议”,可能会被归到医疗健康类目——个人小程序做不了。所以AI食谱推荐的文案要加"仅供参考"的免责声明,文案上刻意避开口吻像"专业建议"。


六、VibeCoding开发模式总结与深度思考

做完整食算纪,我对"用AI写代码"这件事有了完全不一样的理解。

6.1 VibeCoding真正的优势在哪

1. 快速搭建原型。从0到MVP的速度是传统开发的5-10倍。我花了3天时间(课余)就让食算纪的基础页面跑起来了——首页、食谱列表、个人中心、登录页,几乎所有UI都是AI一句话生成的。换做手写,至少一周起步。

2. 消灭了"不敢动手"的心理门槛。以前做一个新功能,要先调研API、看文档、写demo,光心理准备就要半天。现在直接跟AI说"帮我写个XXX",5分钟后就有可运行的代码。哪怕代码不全对,至少有了一个可修改的起点。这个心理门槛的降低,对独立开发者来说是巨大的生产力释放。

3. 适合"你不知道你不知道的东西"的场景。比如我一开始不知道微信云函数可以自动解析 wxContext.OPENID,我甚至不知道有云函数这个东西。AI直接帮我写了完整的登录云函数,我才知道"哦,原来微信生态里可以这么干"。AI像是一个"懂很多但需要你指挥的技术顾问"。

6.2 但是——必须清醒认识到的短板

1. AI没有"全局意识"。它帮你写一个页面的时候很厉害,但它不会考虑这个页面和另外五个页面的视觉一致性;它帮你写一个函数很高效,但它不会考虑这个函数和其他十个函数的数据流是否闭环。全局架构、技术选型、方案取舍,还是必须人来做。

2. AI生成的代码质量不稳定。有时候给你一个工业级封装,有时候给你一个玩具级实现。你需要有能力判断这坨代码"能不能用"——这恰恰是需要基本功的地方。如果你完全不懂代码,让AI写个完整的微信小程序,几乎一定会踩坑(就像我踩的那些)。

3. 调试成本被转移了。传统开发是"写代码2小时,调试0.5小时";VibeCoding是"写代码5分钟,调试2小时"。AI帮你快速生成了,但出了问题你得自己排查。这对开发者的排查能力要求反而更高了——你不仅要会写,还要会"读懂AI写的东西然后修它"。

6.3 给独立开发者和毕设同学的建议

如果你打算用VibeCoding模式做自己的小程序/毕设,我的建议是:

首先,技术基本功不能丢。至少要能读懂AI生成的代码,能判断它写得对不对,能定位问题在哪儿。AI写代码不等于你不用学了——它像是让你的阅读能力变得比写作能力更重要。

其次,选型比编码重要一万倍。我这个食算纪项目里最关键的决定不是"怎么写登录接口",而是"用不用手机号登录"、“Dify放本地还是云端”。这些决策AI做不了,需要你结合微信生态规则、个人资质、成本、用户体验来权衡。方案对了,代码只是执行。

再次,用AI要"叠层"而非"一次性"。不要指望给AI一个终极指令就得到一个完美产品。按"骨架→功能→样式→适配→优化"的节奏迭代,每层用AI辅助完成,但每层都要经过人类评审。我和Trae分步做前端的方式,和我自己分步做后端接口的方式,本质上是一回事:把问题拆到AI能稳定输出的粒度

最后,接受"AI写了一堆你也能手写的代码"。很多时候AI写的代码你自己也能写,甚至写得更好。但AI的价值在于帮你省掉写作时间,让你把精力放在更重要的事情上——测试、优化、上线、迭代。这就像用脚手架而不是徒手搬砖,虽然砖还是砖,但效率不同。

6.4 我的个人评价

回头看看,食算纪是我做过"最复杂,最从0到1"的项目,也是我做过"最累"的项目

我觉得VibeCoding最好的使用姿势是:决策靠人,执行靠AI。技术选型、架构设计、方案评估用人的判断力;编码实现、样式调试、多端适配让AI冲在前面。不神话AI,也不抵制AI,它就是一把好用的工具——但握工具的得是清醒的手。

如果让我重新开始做食算纪,我会在第一天就确定好登录方案、域名策略(全部云函数代理)、Dify部署方式(直接云端SaaS不折腾本地),而不是等到上线前才一个一个改。这些决策上的经验,我觉得比烧一个月的token都值钱。


附录

A. 可复用的AI开发指令模板

前端页面指令模板

页面:[功能名称] 设计规范:主色#1F6B3E,背景#F9F6EF,卡片白底圆角28rpx 布局:[flex方向/排列方式/对齐规则] 元素规格:[各元素具体的rpx尺寸、间距] 交互:[点击跳转/状态切换/禁用态] 适配:box-sizing:border-box,min-width:0,单位统一rpx 禁止:[明确排除的元素和样式]

后端接口指令模板

任务:[一句话描述] 输入:[入参结构] 输出:[返参结构] 约束:[技术栈/环境/限制条件] 异常处理:[网络超时/参数错误/空数据] 密钥管理:[说明密钥如何传入,禁止硬编码] 文件规范:[模块拆分/命名规则]

多AI协作上下文锚点

项目:食算纪微信小程序 前端规范:主色#1F6B3E,背景#F9F6EF,卡片28rpx,七级字号24-40rpx 后端规范:云函数Node.js,云数据库,OpenID鉴权,Dify SaaS 通信方式:云函数代理外部API请求

B. 个人小程序避坑速查表

类别常见坑正确做法严重程度
登录getPhoneNumber个人小程序不可用改用OpenID静默登录致命
登录onLaunch跳转页面白屏onShow中跳转,用reLaunch
域名直接调外部API报request:fail全部走云函数代理致命
Dify响应含Markdown无法渲染Prompt约束+客户端过滤
Dify云函数超时(3s默认)调大到20s+客户端loading
UIflex布局文字溢出min-width:0 + flex-shrink:0
UIButton默认样式干扰::after清除+border-box
UI头像URL短暂过期转存云存储FileID
UIHTML实体编码乱码禁用&#x编码
权限隐私协议与功能不符只声明实际使用的权限
权限隐私授权弹窗过早首页onShow按需弹窗
上线类目选择错误被拒工具-计算类,加免责声明致命
性能快速点击重复请求按钮loading+disabled双重锁
性能退出登录缓存残留logout()全量清除用户缓存

食算纪是我第一个完整走完"AI辅助开发→上线"全流程的小程序。文章里的每一个问题都是我真实踩过的坑,每一个方案都是我改过至少两版才落地的。希望能帮同样在VibeCoding路上探索的你,少走一些弯路~~~

如果你也在用AI做小程序开发,欢迎交流心得。