用uni-app开发外卖小程序需规避编译陷阱、微信限制和并发问题:改localStorage为uni.setStorageSync(key禁含/和.),路由用uni.navigateTo,ref改用createSelectorQuery,路径别错,图片用/static或CDN,权限、域名、支付参数须严格合规,购物车防覆盖,规格用嵌套对象,库存校验靠后端Redis+Lua,订单状态用WebSocket推送,定位需配置权限,首屏性能要控制在1秒内。

直接上结论:用 uni-app 开发外卖点餐小程序,核心不是“能不能做”,而是“怎么绕开编译陷阱、微信限制和并发坑”。你写的是 Vue 语法,但最终跑在微信小程序环境里——它不认 localStorage,不支持 document,onShow 生命周期比 mounted 更关键,而 uni.setStorageSync 写错路径就丢数据。
uni-app 编译到微信小程序时,哪些 Vue 习惯必须改
很多开发者卡在“本地跑得好,真机白屏/报错10002/购物车消失”,本质是把 H5 思维带进了小程序。以下几点不改,上线前必返工:
-
localStorage→ 必须换成uni.setStorageSync,且 key 名不能含斜杠或点号(如'cart/123'会静默失败) -
router.push→ 微信小程序不支持,一律用uni.navigateTo或uni.switchTab,传参必须是 query 字符串,不能传对象 -
ref获取节点 → 小程序里得用uni.createSelectorQuery(),ref在非 H5 端不可靠 -
import('@/utils/request.js')→ 路径别写错,uni-app 编译器对相对路径敏感,@/指向src,但真机调试时若漏配alias,会直接报 module not found - 图片资源必须用绝对路径或 CDN 地址,
./assets/logo.png在分包里可能加载失败,建议统一走/static/logo.png
微信小程序特有约束,不处理就过不了审
uni-app 不会帮你自动处理微信平台规则,这些配置漏一项,提审被拒概率超 80%:
-
manifest.json中mp-weixin节点必须显式声明权限,比如定位要加:"permission": { "scope.userLocation": { "desc": "用于推荐附近餐厅" } } - 网络请求域名必须在微信公众平台后台「开发管理 → 域名信息」中备案,且协议、端口、路径都要完全匹配(
https://api.xxx.com/v1/order和https://api.xxx.com/v1/视为不同域名) - 支付必须用
uni.requestPayment,参数timeStamp必须是字符串类型(不是 number),package值要带prepay_id=前缀,少一个等号就调不起支付弹窗 - 自定义导航栏需手动计算安全区,
uni.getSystemInfoSync().statusBarHeight+70(胶囊高度)才是顶部真实占用,iOS 和 Android 的胶囊位置不同,不能硬写 44px
外卖场景高频功能,uni-app 实现的关键差异点
点餐不是展示页面,核心逻辑集中在状态同步、库存防超卖、实时反馈。uni-app 的封装层容易掩盖底层细节,导致线上出问题:
- 购物车本地缓存要用
uni.setStorageSync+ 防覆盖策略,比如先uni.getStorageSync('cartData'),再 merge 当前操作,否则多设备登录或杀进程后数据丢失 - 菜品规格选择(如“微辣/免葱/加蛋”)建议用嵌套对象结构存储:
{ id: '1001', specs: { 'spicy': '微辣', 'topping': ['加蛋'] } },避免 flat 数组导致规格组合爆炸 - 库存校验必须前后端协同:前端显示“仅剩2份”只是提示,真正扣减必须走后端 Redis+Lua 原子脚本,否则并发下单必然超卖
- 订单状态推送不能只靠轮询,
uni.connectSocket连 WebSocket 后,服务端用socket.io或原生ws推送ORDER_STATUS_CHANGED事件,比setInterval查接口省 90% 流量 - 地理围栏排序依赖
uni.getLocation,但 iOS 14+ 默认只返回粗略坐标,需在info.plist(App 端)或小程序后台配置location权限说明,否则accuracy始终为3000米
最易被忽略的其实是「启动性能」:外卖小程序首屏必须在 1 秒内渲染完成,否则用户划走。uni-app 的分包机制不是开个开关就行——首页不能引用 uView 全量组件,pages/index/index.vue 的 script 要控制在 30KB 以内,图片必须用 webp + CDN,否则 iOS 真机冷启动直接卡在 1.8 秒以上。











