
小程序首屏加载速度直接影响用户留存。我做过一个测试:同一个小程序,加载时间从3秒优化到1秒,用户留存率提升了25%。优化首屏性能是小程序开发的必修课,我从代码、资源、接口、渲染四个维度分享我的经验。
首先是代码包体积控制。小程序主包大小限制2MB,总包大小限制20MB。我第一个项目没注意这个,把所有页面和组件都打包进主包,结果主包超了,发版被拒。后来做了分包处理,不常用的页面和组件放到分包里,主包控制在1.5MB以内。
图片、字体等资源尽量放CDN,不要打包进代码包。我曾经把几张高清背景图打包进代码包,结果包体积直接涨了800KB。改成CDN加载后,包体积降下来了,而且图片可以按需加载,首屏更快。
定期用开发者工具的代码依赖分析功能,找出无用代码并删除。我有一次分析发现,一个第三方库占了300KB,但实际只用到了其中一个函数。自己写了个替代函数,省了300KB。代码体积优化是个持续过程,每次发版前都应该检查一下。
资源加载优化也很关键。首屏需要的图片用预加载,非首屏图片用懒加载。我现在的项目,首屏背景图和logo在app.js里预加载,商品列表的图片用懒加载,滚动到可视区域再加载。这样首屏渲染时间从2秒降到0.8秒。
图片格式优先用WebP,体积比JPG小30%以上。小程序支持WebP,但iOS和安卓的支持程度略有差异。我的做法是同一张图片准备JPG和WebP两个版本,根据平台自动选择。图标用SVG或者字体图标,不要用小图片,缩放不会失真。
接口请求要优化。首屏数据尽量合并请求,减少HTTP连接数。我之前的项目,首屏要调5个接口,每个接口都有网络开销。后来把5个接口合并成1个,首屏加载时间减少了40%。非关键数据延迟加载,先渲染页面框架,再填充数据。
接口返回的数据量要控制,只返回页面需要的数据,不要一次性返回全量数据。我曾经遇到一个接口返回了商品的所有字段,包括详情、评论、推荐等,但首屏只需要标题、价格、图片。优化后只返回必要字段,接口响应时间从800毫秒降到150毫秒。
渲染性能也要注意。列表页用虚拟列表,只渲染可视区域的元素。我做过一个商品列表,有1000多个商品,全部渲染的话页面很卡。改成虚拟列表后,只渲染屏幕内的20个商品,滚动时动态更新,流畅度提升很明显。
复杂动画用CSS动画代替JS动画,减少主线程负担。避免频繁的setData调用,批量更新数据能显著提升性能。我现在的做法是:把多个setData合并成一次,用Object.assign批量更新。这个习惯帮我解决了不少性能问题。
廷云信息做小程序性能优化时,会先用Lighthouse跑一遍性能评分,找出具体的瓶颈点。然后针对性地优化,优化完再跑一遍验证效果。建议把启动耗时和包体积设成发版门禁,超标就卡住不让发,这样体验不会随版本悄悄劣化。