3. 微信小程序开发规范:那些你必须知道的硬性门槛

做小程序开发,说实话,跟做普通网页完全是两码事。网页你可以随便写,大不了加载慢点。但小程序不行——微信给你画了条条框框,你得在框里跳舞。今天我就把几个最关键的规范掰开揉碎了讲,都是我踩过的坑。

3.1 代码包大小限制:别让你的小程序变成“胖子”

微信对小程序代码包有严格限制。主包不能超过 2MB,整个小程序所有分包加起来不能超过 20MB。为什么这么严?你想想看,用户点开小程序,要是等半天才加载完,谁还有耐心?

⚠️ 注意: 2MB 是编译后的代码包大小,不是你源码的大小。图片、字体文件这些资源,压缩前后差距很大。

我在项目中遇到过好几次,代码写完了,一打包发现超了。最惨的一次是上线前夜,主包 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"
      ]
    }
  ]
}

嗯,这里要注意:主包只放首页、登录页、公共组件库。其他业务页面全扔分包里。我个人习惯把图片资源也按分包存放,别一股脑全塞主包里。

💡 小技巧: 使用 weptsource-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'
  });
}
📌 核心原则: 用户操作路径尽量控制在 5 步以内。如果业务逻辑确实需要深层次跳转,考虑用 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 过滤
功能不完整 页面空白、按钮无效 测试所有流程再提交
💡 最后提醒: 提交审核前,自己先跑一遍完整流程。我习惯用真机测试,因为模拟器有时候会“骗人”。尤其是支付、定位、授权这些功能,真机上一测就原形毕露。

好了,关于小程序开发规范,今天就聊到这儿。说白了,这些限制都是为了让用户体验更好。你遵守规则,微信就给你流量;你乱来,微信就封你。嗯,就这么简单。