小程序开发选原生还是 uni-app?我做了 3 个项目后,先劝你别急着跨端
2021 年我接了个社区团购小程序,团队 3 个人,用 uni-app 2.x + HBuilderX 3.2.16 + Vue2,一套代码想同时发微信和支付宝。结果微信主包干到 1.9MB,离 2MB 红线只差 100KB,提审前夜还在删图片。首屏在 Redmi Note 9 上 2.4 秒,老板问我为什么隔壁原生小程序 1.2 秒。后来 2022 年做门店预约,换成原生微信 + TypeScript + glass-easel,首屏 1.1 秒,但开发速度慢了大概 30%。2023 年又用 Taro 3.6.8 + React 18 + Vite 做多端,构建时间从 48 秒降到 19 秒。所以现在有人问我选什么,我不先回答框架,我先问:你几个人、几个端、一周发几次、能不能接受 30 分钟回滚。
先别比框架,先算维护半径
我的独立观点可能有点得罪人:小程序开发的第一问题不是性能,也不是跨端,是维护半径。维护半径就是你改一个登录逻辑,需要同时动几个端、几个仓库、几个人。原生微信的半径最小,但只能管微信;uni-app 和 Taro 半径大,能管微信、支付宝、抖音、H5,可一旦端特化,代码里全是 #ifdef MP-WEIXIN 和 process.env.TARO_ENV,维护半径反而爆炸。我那个社区团购项目,登录、支付、分享、定位 4 个模块,跨端复用率只有 68%,剩下 32% 写了 11 个条件编译分支。所以我现在选型只做一张表,打 5 个分:端数量、团队栈、首屏要求、发版频率、原生能力依赖。只做微信、团队会 Vue、6 个月内试错,uni-app 够用;React 团队多端,Taro 优先;要吃 Skyline、glass-easel、视频号、微信支付分这些新能力,原生微信优先。
分包和 setData,才是真正卡人的地方
微信小程序包体积规则很硬:主包不超过 2MB,整个小程序所有分包不超过 20MB,单个分包不超过 2MB。我第一次做电商小程序,32 个页面全塞主包,结果主包 2.3MB 上传失败。后来拆成 4 个分包,主包只留首页、分类、购物车、我的、登录、支付回调 6 个页面,主包压到 1.4MB。步骤很简单:在 app.json 里配 subPackages,把商品详情、订单列表、售后、积分商城丢进分包;再用 preloadRule 做预下载,network: 'all',packages: ['goods', 'order'],用户点首页时偷偷把商品分包拉下来。图片别偷懒,放 CDN,转 webp,主图 750px 宽,质量 75,一张 120KB 能压到 38KB。setData 更坑,我给自己定的红线是单次不超过 64KB,长列表每次只渲染 20 条。之前商品列表 800 条全量 setData,数据 1.2MB,iOS 直接卡成幻灯片;改成分页 20 条后,单次 43KB,滑动才回到 55fps 左右。这些不是玄学,是能拿真机测出来的。
跨端登录支付,别信 100% 复用
跨端最容易被销售话术骗的地方,就是登录和支付。uni-app 编译到微信和支付宝,微信用 wx.login,支付宝用 my.getAuthCode,微信支付用 wx.requestPayment,支付宝用 my.tradePay,参数和回调都不一样。我当时的做法是抽一层 auth 和 pay 接口,微信、支付宝各写一个 adapter,业务层只调 login() 和 pay(orderId)。Taro 也一样,Taro 3.6 + React 18 能跑多端,但 H5 和 RN 端我们最后没上,因为人力只够维护微信和抖音。我的结论是:跨端不是目标,是手段,70% 复用 + 30% 端特化最稳。审核也别忽略,2023 年 9 月微信隐私协议生效后,摄像头、相册、位置、手机号这些接口要配置《小程序用户隐私保护指引》,否则用户授权会出问题。电商类目要营业执照,食品要食品经营许可证,提审尽量避开周五下午,因为审核 1 到 3 天,周末你只能干等。
我的选型步骤:3 天 demo,别开 3 周会
我现在带人做小程序,第一步不是画架构图,是列 5 个问题:做几个端?团队熟 Vue 还是 React?有没有必须用的原生插件?首屏要求 1.5 秒还是 3 秒?一周发几次版?第二步,用 3 天做一个 demo,必须包含登录、支付、长列表、分包、埋点这 5 件事。第三步,真机跑,不是模拟器,至少找 3 台机器:iPhone 12、Redmi Note 9、一台低端安卓。第四步,打分选型。我的粗暴建议是:只做微信、小团队、6 个月试错,uni-app + Vue3 + Vite 够用;多端、长期、要性能,原生微信 + 分包 + Skyline 试点;React 团队多端,Taro 优先。最后一句,小程序开发不是选框架,是选回滚速度。能让你 30 分钟回滚、1 天发版、3 天接新能力的栈,就是好栈。