小程序消息总被折叠?三步重构通讯链路
|
跟产品吵。去年过年那会儿,消息盒子直接塌成一张纸片——不是折叠,是收容所式压缩,点开弹窗里三行字,第四行起全进“更多”黑洞。我原以为是模板渲染层搞鬼,结果发现是微信自己在后台把整个 message list 给 memoized 了,而且 memo key 居然用的是 timestamp 取整到分钟级。你敢信? 先扔结论后补细节。重构通讯链路根本不是为了“让用户看见”,是逼系统淘汰低效通道。优胜劣汰——这词现在听上去像 HR 在念 KPI 答辩稿,但真跑通那晚,我敢打包票:消息不折叠的阈值,本质是服务端 push 触发频次和前端 onShow 生命周期错位的容忍带宽。这个我敢打包票。别的我不敢。 PM 当天下午三点蹲我工位边上,手机举着调试面板刷屏,左手捏着半块融化的巧克力酥。她指那个「展开全部」按钮说“用户不会点”。我说“用户连「通知」tab 都不进,你指望他点二级菜单?”她没接话,转身去倒水,玻璃杯磕在饮水机出水口上,“当啷”一声,水滴溅到桌面那台没关的录屏——画面右下角还挂着时间戳:15:23:07。录屏文件名是 last_xxx_19.mp4,前面十八个都删了。 第一步,砍掉所有「即时」幻觉。把 wx.onMessage 改成只监听 type === 'push' + tag === 'urgent' 的裸 payload;非 urgent 全塞进 getStorage(key: 'msg_pool') + 本地 diff;触发时机绑定 onTabItemTap 而不是 onShow。你以为这就完了?错。微信底层对 storage 读写有隐式节流,我测过连续五次 setStorage,第三次开始就卡在 pending,连 setTimeout(0) 都撬不动。后来发现得用 wx.getStorageInfoSync().keys.length 做前置哨兵——这个我说不准,但那天下午两点四十七分,后端老张换了一根绿色编织线给 MacBook 充电,我盯着他插拔三次,才突然意识到:IO 不是瓶颈,状态同步才是。 第二步,让消息自己长腿。不靠 template data-bind,改用 Canvas 渲染卡片底图,文字区域留白,runtime 用 measureText 去撞字号+行高+padding 拼出来的“可渲染矩形”。canvasDraw 本身不卡,卡在 drawImage 之后紧接着的 getImageData——这个我敢打包票,iOS 真机上必掉帧,哪怕你画的只是个灰色方块。我们最后用 createImageData 绕过去,但代价是安卓低端机 canvas 多占三百七十二 KB 内存。PM 说“要不要加个兜底 fallback”?我说不加。优胜劣汰嘛,谁内存撑不住,谁就看不到「已读回执小红点」——这功能本就不该存在。 第三步最糙:把 notify 接口从 /v2/msg/notify 改成 /v2/ack?ts=${Math.floor(Date.now()/60e3)}。后端说“你这是把幂等性当呼吸用了”。我说对,就呼吸那么自然。微信判定折叠的原始依据,是它发现同一个「语义簇」里重复推送太密——但它不看 body,只扫 query 参数。我们用时间戳分桶,每分钟最多一条有效 notify,多余请求直接 204。上线那天,凌晨一点十一分,群里甩出一张 Lighthouse 跑分截图:FCP 降了十八毫秒,LCP 不动,TTI 毛刺变多。没人回。静音了二十一分钟。然后前端小王发了个“咖啡续上了”,配图是他桌面一包撕开的速溶。 岔个题:上个月 CDN 账单出来,我们偷偷把 message history 接口的 Cache-Control max-age 从 300 改成 30,节省了四千块。但这笔钱 PM 不知道,财务以为是测试环境流量误标。反正 KPI 折算里没这一项,就像去年过年折叠消息压根不算事故——没人上报,日志里只有 warn 级别的一行 “MsgList render skipped: too frequent”。你猜这行 log 是哪个模块写的?不是小程序,是微信开发者工具模拟器内部的 bridge 模块。他们自己写的。
文章配图,仅供参考 我原以为重构完能喘口气,结果春节假期第七天,发现安卓端某型号在横屏切换时 canvas 文字偏移两像素。查半天,是系统 WebView 的 fontMetrics 返回值在 orientationchange 后缓存失效却没重算。修法简单:监听 resize 事件后强制清空一次 canvas 上下文并重绘。但我没动——横屏看消息的人,本身就该被折叠。这话我不能跟 PM 讲,但我在 commit message 里写了:“not a bug, a feature gate”。所以现在我卡在这:消息是不折叠了,可用户打开频率反而跌了百分之几。数据埋点还没归因,因为上周运维说服务器磁盘快满了,临时关了三台日志 collector。你让我怎么归因?我连哪台 collector 关了都不知道。现在每天早上八点,我会手动 curl 一下 /healthz,看返回头里有没有 x-msg-bucket-status 字段。有,说明 bucket 分桶还在生效;没有,我就得去翻后端老张昨晚的 Git commit ——他习惯在凌晨一点零三分推代码,且永远不写完整 message,只写“fix cache”。 下一步?把 onTabItemTap 触发的拉取逻辑,再往前挪——挪到 wx.preloadPage。但这玩意儿文档写着“仅部分机型支持”,而我们测不出是哪些。所以打算下周找个雨天,叫前端小王穿拖鞋来公司,坐我左手边那把吱呀响的转椅,用他那台旧 iPad 测一遍。他说行,前提是给我带豆浆。我答应了。反正豆浆凉得快,正好匹配我们当前的消息热力衰减曲线。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


新能源项目借力小程序实现元数据驱动增长
PHP工程师转战新能源小程序,半年月入12万
小程序服务器安全:端口管控与数据保护实战
