微信小程序开发专家
概述
一套在真机上验证过的小程序工程规程,解决四类高频翻车:真机输入交互、AI 能力接入、无素材视觉创作、分享与海报,并在交付前用脚本把风险一次性扫出来。
业务价值:
- 把"开发者工具一切正常、真机上打不出字"这类静默 bug 变成可静态检测的硬错误
- AI 能力做成增强项而非依赖项,无密钥、无网络、无云环境时功能 100% 可用
- 不依赖任何设计素材即可产出可复现的卡片/海报视觉
- 分享路径只走平台可靠能力,避免"点了没反应"
何时使用
- 新建或维护微信小程序(页面、组件、工具库、云函数)
- 出现"电脑上能输入、手机上不能输入"、"键盘弹了又消失"、"只能输入一个字"
- 需要接入大模型(OpenAI 兼容接口 / 云函数)且要保证无密钥时仍可用
- 需要生成卡片、海报、背景等视觉效果,但不依赖图片素材
- 需要"发送给朋友 / 发朋友圈 / 保存相册"等分享能力
- 交付前需要一份可复跑的全项目自检报告
依赖声明
| 依赖 | 版本 | 是否必需 | 说明 |
|---|---|---|---|
| Node.js | >= 12 | 仅运行 scripts/check_miniprogram.js 时需要 |
脚本为零依赖(仅用 fs/path/child_process),不装任何 npm 包 |
| 微信开发者工具 / 真机预览 | — | 仅验证时需要 | 工具正常不代表真机正常,输入类问题必须真机回归 |
| 大模型 API KEY | — | 可选 | 不配置则自动降级到本地方案,不影响任何功能 |
执行步骤
- 先取基线:执行
node <skill>/scripts/check_miniprogram.js <小程序根目录>,记录 PASS / WARN / FAIL 数量。改代码前必须先有基线,改完必须复跑。 - 判定问题类型并只读对应参考:真机输入 →
references/real-device-input.md;AI 接入 →references/ai-integration.md;视觉 →references/visual-engine.md;分享/海报 →references/share-and-poster.md。不要一次性加载全部参考文档。 - 给出最小可粘贴修复:直接产出 WXML / JS / WXSS 片段,复用
assets/safe-input-template.md中三个代码块的结构,不要凭直觉改写input与setData。 - 逐条对照硬性规则(见下):input 节点静态化、打字期间零 setData、focus 与样式解耦、外盒承担布局、禁用危险 CSS。
- 复跑自检并清零:
node <skill>/scripts/check_miniprogram.js <根目录> --warn-as-error,FAIL 与 WARN 必须归零;纯逻辑模块(视觉引擎 / 海报 / AI 解析)用 mock 在 Node 里跑冒烟。 - 交付前走清单:逐项核对
references/checklist.md,并明确列出必须在真机上验证的条目(工具通过不算通过)。
硬性规则(违反必出真机问题)
- input 节点保持静态:input 上只允许
value/focus/adjust-position三个动态属性,其余(class、style 等)一律静态;聚焦高亮、边框、背景放到外层容器 view 上。 - 打字期间零 setData:
bindinput只写草稿(this._draft = e.detail.value),不做任何 setData;联动逻辑放到失焦或停手 600–800ms 防抖之后。 - focus 与样式状态解耦:用
focusNow(仅程序化唤起键盘)与inputFocus(仅样式)两个独立状态;用户手动点击时绝不把focus从 false 改成 true。 - input 固定宽高、不参与 flex 自适应:外盒承担
flex:1、边框、背景;input 用width:100%+ 固定height。 - 禁用危险 CSS:含 input 的祖先不用
backdrop-filter;input 自身只用transition过渡background / border-color / box-shadow,禁用transition: all。 - 必备键盘属性:
cursor-spacing、adjust-position、bindinput必配bindblur(草稿同步的最后一道保险)。
<view class="text-box {{inputFocus ? 'focus' : ''}}">
<input class="text-input" value="{{text}}" bindinput="onTextInput" bindblur="onEditBlur"
bindconfirm="onEditConfirm" cursor-spacing="30" adjust-position="{{true}}" />
</view>
onTextInput: function (e) { this._draft = e.detail.value; },
onEditBlur: function () { this.syncDraft(); this.build(); }
AI 接入:三级策略(任何一级失败都静默降级)
- 填了 API KEY →
wx.request直连 OpenAI 兼容接口 - 未填 KEY → 云函数(密钥不出服务端)
- 都没有 / 超时 / 返回非法 → 本地启发式兜底,返回
null,界面零报错
开关关闭 = 纯本地,不发起任何网络请求;密钥只存本机 wx.setStorageSync;界面必须提示需把接口域名加入 request 合法域名。详见 references/ai-integration.md。
分享路径
- 发送给朋友:
<button open-type="share">+onShareAppMessage(唯一能用 JS 触发的分享面板) - 发朋友圈:不能用 JS 拉起面板,
open-type="shareTimeline"在部分客户端点击无响应且 JS 无法感知失败 → 改为「生成海报 →wx.saveImageToPhotosAlbum→ 用户去微信发朋友圈」 - 好友打开即还原作品:把设计参数 +
seed+copySeed+variant放进分享path/query - 详见
references/share-and-poster.md
输入输出示例
输入:
我的小程序输入框在手机上打不出字,电脑上却正常,请帮我定位并修复
输出(要点):
真因:bindinput 中 setData 了 value 绑定的字段,输入法拼音组合期间被回写打断。
修复:
1. bindinput 只写草稿,失焦/防抖后再同步并刷新预览
2. 按 assets/safe-input-template.md 的 WXML 块搭结构,样式放到外层容器
3. 复跑 node scripts/check_miniprogram.js <根目录>,确认 input 审计全部 PASS
真机验证:中文拼音连续输入、中英混输、切页面再回来
输入:点击分享没有反应,帮我接上微信真实转发面板 → 输出:改用 open-type="share" + onShareAppMessage,并把朋友圈路径改成「生成海报 → 保存相册」,附带自检脚本中分享钩子配对项的复跑结果。
异常处理
| 场景 | 处理逻辑 | 输出话术 |
|---|---|---|
自检脚本报 bind* 处理器在 JS 中不存在 |
交叉核对 WXML 事件名与 JS 方法名,改到完全一致 | "该事件在 JS 中不存在,真机上会静默失效,已改名对齐" |
| AI 请求超时 / KEY 无效 / 返回非 JSON | 三级降级到本地方案,try/catch 包裹解析,任何异常 resolve(null) |
"当前未走 AI,已使用本地方案,界面不报错" |
旧版微信无 createSelectorQuery 或 canvas 节点为空 |
明确提示不支持并给出替代路径,绝不静默无响应 | "当前版本不支持海报生成,请升级微信客户端" |
| 相册授权被拒 | 弹窗引导去设置页,允许后继续保存 | "需要相册权限,点击去设置" |
| 分享链接缺少关键参数(如 sceneId) | 走空态渲染,不误判、不崩溃 | "参数不完整,已展示默认卡片" |
| 自检脚本本身执行失败 | 检查 Node 是否可用、根目录路径是否正确,输出原始错误 | "脚本执行失败:<错误信息>,请确认 Node.js >= 12" |
约束与边界
- 输入约束:自检脚本的目标目录必须是包含
app.json的小程序根目录;跳过node_modules/miniprogram_npm/.git等目录。 - 执行约束:先跑基线再改代码,改完必须复跑;不修改用户未要求改动的文件;不在小程序根目录留下临时脚本。
- 业务边界:本技能只给工程规范与可粘贴片段,不代替真机验收,也不替用户提交审核或处理账号资质问题。
- 能力边界:不提供 JS 主动拉起朋友圈面板的方案(平台无此 API),不使用外部网络服务,不读写小程序目录之外的文件。
资源索引
| 资源 | 用途 |
|---|---|
scripts/check_miniprogram.js |
全项目自检:app.json 页面注册、JS 语法、WXML 标签配对、input 真机审计、分享钩子配对、平台限制告警;支持 --json 与 --warn-as-error |
references/real-device-input.md |
真机输入六大坑与修复范式、必备属性清单、排查顺序 |
references/ai-integration.md |
AI 三级接入、Prompt 约束、JSON 提取、超时与降级、mock 测试方式 |
references/visual-engine.md |
无素材创意视觉:种子分离、伪随机、输入时不重建图层、候选与动画 |
references/share-and-poster.md |
转发好友、朋友圈、canvas 2D 海报、相册授权、分享参数还原 |
references/checklist.md |
交付前检查清单与真机回归用例 |
assets/safe-input-template.md |
真机安全输入框模板:WXML 块 + WXSS 块 + 草稿模式 JS 块(含离屏 canvas 样式) |