商业级应用-微信小程序开发实战
商业级应用:微信小程序开发实战全流程解析
微信小程序早已不是”玩具”,而是承载电商、本地生活、工具、SaaS 的商业基础设施。本文以商业级项目的标准,从 0 到 1 拆解完整开发流程,覆盖架构设计、核心开发、性能优化、上线运营全链路。
一、商业级小程序与 Demo 的区别
很多人写小程序停留在”能跑就行”,但商业项目和练习项目的差距是数量级的:
| 维度 | Demo 级 | 商业级 |
|---|---|---|
| 架构 | 页面堆砌 | 分层架构、状态管理 |
| 性能 | 能显示即可 | 首屏秒开、分包加载 |
| 稳定性 | 不崩溃就行 | 埋点监控、错误上报 |
| 体验 | 功能可用 | 骨架屏、动画、无障碍 |
| 安全 | 不关心 | 鉴权、加密、防刷 |
| 运营 | 无 | 数据看板、AB 测试、灰度 |
商业级的核心是:可维护、可扩展、可监控、可增长。
二、项目启动:需求与技术选型
2.1 需求拆解
以”社区团购小程序”为例,功能模块:
首页:banner、分类、商品列表
商品详情:图文、规格、加购
购物车:多选、优惠计算
订单:下单、支付、状态流转
个人中心:地址、订单、优惠券
团长端:开团、核销、佣金
2.2 技术选型
原生 vs 框架:
| 方案 | 优点 | 缺点 | 适用 |
|---|---|---|---|
| 原生小程序 | 性能最好、无依赖 | 开发效率低 | 性能敏感、简单项目 |
| Taro | 多端复用、React 语法 | 有转换损耗 | 需同时出 H5/App |
| uni-app | 生态丰富、多端 | 复杂逻辑受限 | 快速多端 |
| mpvue | Vue 语法 | 已停止维护 | 不推荐新项目 |
商业级推荐:
纯小程序 → 原生 + TypeScript + Skyline(2022 后主推新渲染引擎)
需多端 → Taro3 + React + TypeScript
团队 Vue 背景 → uni-app + Vue3
其他关键选型:
状态管理:原生用
mobx-miniprogram,Taro 用 Redux/ZustandUI 库:Vant Weapp、TDesign、uView
请求库:自封装
request+ 拦截器构建:原生用官方,Taro 用 Webpack5/Vite
三、架构设计:分层与规范
3.1 目录结构
text
miniprogram/
├── app.ts / app.json / app.wxss
├── pages/ # 页面
│ ├── index/
│ ├── goods/
│ └── order/
├── components/ # 公共组件
├── services/ # 接口层
│ ├── api/
│ └── request.ts
├── store/ # 状态管理
├── utils/ # 工具函数
├── constants/ # 常量
├── styles/ # 全局样式
└── assets/ # 静态资源
3.2 分层架构
text
视图层(Page/Component)
↓
状态层(Store)
↓
服务层(Service/API)
↓
请求层(Request 封装)
↓
后端 API
原则:页面不直接调 wx.request,必须走 Service 层。这样接口变更、加缓存、加埋点都集中处理。
3.3 请求封装实战
ts
// services/request.ts
interface RequestOptions {
url: string;
method?: ‘GET’ | ‘POST’ | ‘PUT’ | ‘DELETE’;
data?: Record<string, any>;
loading?: boolean;
auth?: boolean;
}
const BASE_URL = ‘https://api.example.com';
export function request(options: RequestOptions): Promise {
const { url, method = ‘GET’, data, loading = true, auth = true } = options;
if (loading) wx.showLoading({ title: ‘加载中’, mask: true });
const header: Record<string, string> = {
‘Content-Type’: ‘application/json’,
};
if (auth) {
const token = wx.getStorageSync(‘token’);
if (token) header[‘Authorization’] = Bearer ${token};
}
return new Promise((resolve, reject) => {
wx.request({
url: BASE_URL + url,
method,
data,
header,
success: (res) => {
const { statusCode, data: body } = res as any;
if (statusCode === 200 && body.code === 0) {
resolve(body.data);
} else if (statusCode === 401) {
// token 过期,重新登录
handleUnauthorized();
reject(body);
} else {
wx.showToast({ title: body.message || ‘请求失败’, icon: ‘none’ });
reject(body);
}
},
fail: (err) => {
wx.showToast({ title: ‘网络异常’, icon: ‘none’ });
reject(err);
},
complete: () => {
if (loading) wx.hideLoading();
},
});
});
}
async function handleUnauthorized() {
wx.removeStorageSync(‘token’);
const { code } = await wx.login();
// 调用后端换取新 token…
}
商业级要点:
统一 loading、统一错误提示
Token 自动注入、401 自动重登
支持埋点、重试、超时
四、核心功能开发
4.1 登录鉴权流程
微信小程序的登录是商业项目的第一个坎:
text
小程序 后端 微信服务器
|– wx.login() ——>| |
|<– code ————| |
|– code 发给后端 —->| |
| |– code2Session –>|
| |<– openid+session |
| |– 生成 token —–|
|<– 返回 token ——-| |
|– 存储 token 后续携带 |
ts
// 登录
async function login() {
const { code } = await wx.login();
const { token, userInfo } = await request({
url: ‘/auth/login’,
method: ‘POST’,
data: { code },
auth: false,
});
wx.setStorageSync(‘token’, token);
store.setUserInfo(userInfo);
}
关键点:
openid是用户唯一标识,unionid跨应用统一敏感信息(手机号)用
getPhoneNumber+ 后端解密token 有效期 + refresh token 机制
4.2 状态管理
以 mobx-miniprogram 为例:
ts
// store/cart.ts
import { observable, action } from ‘mobx-miniprogram’;
export const cartStore = observable({
items: [] as CartItem[],
get totalPrice() {
return this.items.reduce((sum, i) => sum + i.price * i.count, 0);
},
addItem: action(function (this: any, item: CartItem) {
const exist = this.items.find((i) => i.id === item.id);
if (exist) exist.count += item.count;
else this.items.push(item);
}),
});
页面中使用:
ts
import { createStoreBindings } from ‘mobx-miniprogram-bindings’;
import { cartStore } from ‘../../store/cart’;
Page({
onLoad() {
this.storeBindings = createStoreBindings(this, {
store: cartStore,
fields: [‘items’, ‘totalPrice’],
actions: [‘addItem’],
});
},
onUnload() {
this.storeBindings.destroyStoreBindings();
},
});
4.3 支付流程
微信支付是商业闭环的核心,流程:
text
1. 用户点击下单
2. 后端创建订单,调用微信统一下单 API
3. 返回 prepay_id + 签名
4. 小程序调用 wx.requestPayment
5. 用户支付,微信回调后端
6. 后端更新订单状态,通知小程序
ts
async function pay(orderId: string) {
const params = await request({
url: ‘/order/pay’,
method: ‘POST’,
data: { orderId },
});
await wx.requestPayment({
timeStamp: params.timeStamp,
nonceStr: params.nonceStr,
package: params.package,
signType: ‘RSA’,
paySign: params.paySign,
});
wx.showToast({ title: ‘支付成功’ });
}
商业级要点:
支付结果以后端回调为准,不能只信前端
处理支付中的异常(用户取消、网络中断)
订单状态幂等处理
五、性能优化:商业级的生命线
5.1 启动性能
分包加载:
json
{
“pages”: [“pages/index/index”],
“subpackages”: [
{
“root”: “packageA”,
“pages”: [“pages/order/list”, “pages/order/detail”]
},
{
“root”: “packageB”,
“pages”: [“pages/user/profile”]
}
],
“preloadRule”: {
“pages/index/index”: {
“network”: “all”,
“packages”: [“packageA”]
}
}
}
主包控制在 2MB 内,总包 20MB
用
preloadRule预加载常用分包
分包异步化:跨分包引用组件/JS。
独立分包:不依赖主包,适合活动页。
5.2 渲染性能
长列表用
recycle-view:只渲染可视区域。避免频繁
setData:合并更新,只传变化字段。
ts
// 差:全量更新
this.setData({ list: newList });
// 好:局部更新
this.setData({ ‘list[0].name’: ‘new name’ });
图片优化:WebP 格式、CDN 裁剪、懒加载。
Skyline 渲染引擎:2022 后主推,性能接近原生。
5.3 首屏秒开
ts
// 骨架屏
Page({
data: { loading: true, list: [] },
async onLoad() {
const data = await fetchList();
this.setData({ list: data, loading: false });
},
});
骨架屏 + 数据预取
首屏接口合并,减少请求数
使用
wx.getBackgroundFetchData预拉数据
六、稳定性与监控
6.1 错误上报
ts
// app.ts
App({
onError(err) {
wx.request({
url: ‘api.example.com/log/error',
method: ‘POST’,
data: { err: err.stack, time: Date.now() },
});
},
onUnhandledRejection({ reason }) {
// 上报未处理的 Promise 拒绝
},
});
6.2 性能监控
官方:微信性能面板 + 小程序数据助手
自建:
wx.getPerformance()获取启动、渲染耗时关键指标:首屏时间、FCP、接口成功率、崩溃率
6.3 埋点体系
ts
function track(event: string, params?: Record<string, any>) {
wx.request({
url: ‘api.example.com/log/track',
method: ‘POST’,
data: { event, params, time: Date.now(), uid: store.uid },
});
}
// 使用
track(‘add_to_cart’, { goodsId, price });
商业价值:埋点是数据驱动增长的基础,转化漏斗、AB 测试都靠它。
七、上线与运营
7.1 发布流程
text
开发 → 体验版 → 审核 → 发布 → 灰度 → 全量
体验版:内测用,扫码访问
审核:注意类目、资质、隐私协议
灰度:按版本号或用户比例放量
回滚:保留上一版本,出问题快速回退
7.2 合规要点
隐私协议:2022 后强制,未配置无法调用敏感接口
用户信息授权:
wx.getUserProfile替代旧版getUserInfo内容安全:
security.msgSecCheck检测违规内容支付资质:需企业主体 + 微信支付商户号
7.3 运营工具
订阅消息:替代模板消息,用户主动订阅
客服消息:48 小时内可主动推送
分享裂变:
onShareAppMessage+ 参数追踪小程序码:渠道追踪、线下引流
八、商业级 Checklist
架构
□
分层清晰,页面不直接调接口
□
状态管理统一
□
TypeScript 全覆盖
□
环境区分(dev/staging/prod)
性能
□
主包 < 2MB,合理分包
□
首屏 < 1.5s
□
长列表用虚拟滚动
□
图片 CDN + WebP
稳定性
□
全局错误上报
□
接口失败重试 + 降级
□
关键路径埋点
□
崩溃率 < 0.1%
安全
□
Token 鉴权 + 刷新机制
□
敏感数据加密
□
防刷限流
□
隐私协议合规
运营
□
数据看板
□
AB 测试能力
□
灰度发布
□
用户反馈通道
九、总结
商业级小程序开发,本质是工程化 + 性能 + 稳定 + 增长的综合能力:
| 阶段 | 核心关注 |
|---|---|
| 启动 | 需求拆解、技术选型 |
| 架构 | 分层、规范、可维护 |
| 开发 | 登录、支付、状态管理 |
| 优化 | 启动、渲染、首屏 |
| 稳定 | 监控、上报、容错 |
| 上线 | 审核、灰度、合规 |
| 运营 | 埋点、增长、迭代 |
记住一句话:Demo 拼功能,商业拼细节。真正拉开差距的,是那些用户看不见但能感受到的地方——首屏快 0.5 秒、崩溃少 0.1%、转化高 1%。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: