3. 微信小程序开发规范:那些你必须知道的硬性门槛
做小程序开发,说实话,跟做普通网页完全是两码事。网页你可以随便写,大不了加载慢点。但小程序不行——微信给你画了条条框框,你得在框里跳舞。今天我就把几个最关键的规范掰开揉碎了讲,都是我踩过的坑。
3.1 代码包大小限制:别让你的小程序变成“胖子”
微信对小程序代码包有严格限制。主包不能超过 2MB,整个小程序所有分包加起来不能超过 20MB。为什么这么严?你想想看,用户点开小程序,要是等半天才加载完,谁还有耐心?
我在项目中遇到过好几次,代码写完了,一打包发现超了。最惨的一次是上线前夜,主包 2.3MB,硬是熬到凌晨三点才砍下来。所以我的建议是:从一开始就做好分包规划。
分包策略实战
说白了,分包就是把不常用的页面和资源拆到子包里。微信会在用户访问时才加载对应分包。举个例子:
// app.json 中的分包配置
{
"pages": [
"pages/index/index",
"pages/login/login"
],
"subPackages": [
{
"root": "packageA",
"pages": [
"pages/goods/goods",
"pages/cart/cart"
]
},
{
"root": "packageB",
"pages": [
"pages/user/user",
"pages/setting/setting"
]
}
]
}
嗯,这里要注意:主包只放首页、登录页、公共组件库。其他业务页面全扔分包里。我个人习惯把图片资源也按分包存放,别一股脑全塞主包里。
wept 或 source-map-explorer 分析包体积,看看哪个模块是“胖子”。我一般把大图转成 WebP 格式,能省 30%-50% 的体积。
3.2 页面层级限制:别让用户“钻”太深
微信限制页面栈最多 10 层。什么意思?就是用户从首页点进二级页面,再点进三级页面……最多只能点 10 次。超过 10 层,再跳转就会失败。
为什么会这样?我猜是为了防止内存溢出。毕竟小程序运行在微信的 WebView 里,页面开太多,手机扛不住。
我曾经遇到一个电商项目,商品详情页里嵌套了活动页,活动页又跳转到了优惠券页……用户反馈说“点着点着就没反应了”。一查,页面栈爆了。
解决方案:用重定向代替跳转
对于超过 5 层的场景,我建议用 wx.redirectTo 代替 wx.navigateTo。前者会关闭当前页面,不会增加层级。
// 不推荐:一直叠加层级
wx.navigateTo({
url: '/pages/detail/detail?id=123'
});
// 推荐:超过5层后改用重定向
if (getCurrentPages().length >= 5) {
wx.redirectTo({
url: '/pages/detail/detail?id=123'
});
} else {
wx.navigateTo({
url: '/pages/detail/detail?id=123'
});
}
switchTab 或自定义 tab 来“重置”页面栈。
3.3 API 调用频率限制:别把微信服务器“打爆”
微信对大部分 API 都有调用频率限制。比如 wx.request 默认并发上限是 10 个,wx.login 每分钟最多 100 次。超过限制,接口直接返回错误码。
我记得有一次做秒杀活动,用户疯狂点击“立即购买”,结果 wx.request 并发数瞬间飙到 30 多,后面的请求全被微信拦截了。用户看到的就是“网络异常”。
常见 API 限制一览
| API 名称 | 限制说明 | 我的建议 |
|---|---|---|
wx.request |
并发上限 10 个 | 用队列控制请求,别一股脑全发 |
wx.login |
每分钟 100 次 | 缓存 token,别每次都调 login |
wx.getUserProfile |
每次调用需用户授权 | 只在必要场景弹窗 |
wx.getLocation |
频繁调用会被降级 | 用 wx.onLocationChange 替代轮询 |
wx.request,结果被微信封了 10 分钟。后来改用 Promise.all 配合限流,才解决问题。
// 限流示例:控制并发数为 5
async function limitedRequest(urls) {
const concurrency = 5;
const results = [];
for (let i = 0; i < urls.length; i += concurrency) {
const batch = urls.slice(i, i + concurrency);
const res = await Promise.all(batch.map(url => wx.request({ url })));
results.push(...res);
}
return results;
}
3.4 常见审核拒绝原因与解决方案
小程序审核,说白了就是微信的“门卫”。门卫觉得你不对劲,就不让你进门。我见过太多开发者因为审核被拒而抓狂。下面列几个最常见的“雷区”。
雷区一:类目与代码不符
你注册的是“工具”类目,但代码里却做了“社交”功能。微信会直接驳回。解决方案:注册时选对类目,或者代码里不要越界。
雷区二:用户隐私数据收集
小程序不能强制用户授权手机号、位置等隐私信息。我见过一个案例:用户一打开就弹窗要手机号,不给就用不了。这种必被拒。正确做法是:在用户真正需要时才弹窗,并且说明用途。
雷区三:虚拟支付
微信不允许小程序做虚拟商品支付(比如会员、课程、充值)。如果你做的是知识付费,得用“iOS 虚拟支付”的替代方案,或者引导用户到公众号支付。
常见拒绝原因速查表
| 拒绝原因 | 典型场景 | 解决方案 |
|---|---|---|
| 类目不符 | 工具类目做社交 | 修改类目或删除社交功能 |
| 强制授权 | 一打开就要手机号 | 改为按需授权 |
| 虚拟支付 | 卖会员、课程 | 改用公众号支付或走 H5 |
| 内容违规 | 含敏感词、色情内容 | 用内容安全 API 过滤 |
| 功能不完整 | 页面空白、按钮无效 | 测试所有流程再提交 |
好了,关于小程序开发规范,今天就聊到这儿。说白了,这些限制都是为了让用户体验更好。你遵守规则,微信就给你流量;你乱来,微信就封你。嗯,就这么简单。