技术分享
111
8
871353782
发布于 2026年1月25日 · 24 min read
离线优先架构改造完成报告
改造目标
所有页面采用离线优先策略:
- ✅ 先加载本地缓存(秒开)
- ✅ 后台刷新云端数据(静默更新)
- ✅ 网络异常时继续使用缓存(离线可用)
已完成改造
1. 基础设施 ✅
utils/family-data-cache.js - 家庭维度缓存工具
- ✅ 按家庭ID维度存储所有数据
- ✅ 支持列表缓存:
set(familyId, dataType, data) - ✅ 支持详情缓存:
setDetail(familyId, dataType, id, data) - ✅ 24小时有效期,自动过期
- ✅ 支持清空单个家庭或全部缓存
2. 列表页面 ✅
所有列表页已实现家庭维度缓存 + 离线优先:
✅ pages/travel/travel.js - 时光页
- 数据类型:
travels,memories,allMemoriesForGrowth,growthStages - 切换家庭:立即显示新家庭缓存
- 数据刷新:自动保存到缓存
- 离线模式:继续使用缓存
✅ pages/index/index.js - 动态列表
- 数据类型:
records - 切换家庭:立即显示新家庭缓存
- 数据刷新:自动保存到缓存
✅ pages/archive/archive.js - 档案页
- 数据类型:
medicalRecords,usedMedicines - 切换家庭:立即显示新家庭缓存
- 就医和药品列表都支持离线查看
✅ pages/family/family.js - 我的家庭
- 数据类型:
familyMembers - 成员列表支持离线查看
3. 详情页面 ✅
✅ pages/travel-detail/travel-detail.js - 足迹详情
- 缓存key:
family_data_{familyId}_travel_{travelId} - 支持离线查看足迹详情、照片、参与人
改造要点:
// 1. 先读缓存,立即显示 const cached = familyDataCache.getDetail(familyId, 'travel', travelId, false); if (cached) { this.setData({ currentTravel: cached, loading: false }); } // 2. 后台刷新,成功后保存缓存 const res = await cloud.call('getTravelDetail', { travelId }); if (res.success) { familyDataCache.setDetail(familyId, 'travel', travelId, res.travel); this.setData({ currentTravel: res.travel }); } // 3. 失败时静默处理(如果有缓存) catch (e) { if (!cached) { wx.showToast({ title: '加载失败', icon: 'none' }); } else { console.log('🔌 继续使用缓存(离线模式)'); } }
待完成详情页(按优先级)
高优先级(用户常访问)
⏳ pages/memory-detail/memory-detail.js - 回忆详情
// ID字段:this.data.memoryId // 数据类型:'memory' // 云函数:'getMemoryDetail'
⏳ pages/medical-detail/medical-detail.js - 就医详情
// ID字段:this.data.recordId // 数据类型:'medical' // 云函数:'getMedicalRecordDetail'
⏳ pages/medicine-detail/medicine-detail.js - 药品详情
// ID字段:this.data.medicineId // 数据类型:'medicine' // 云函数:'getMedicineDetail'
中优先级
⏳ pages/stats-detail/stats-detail.js - 统计详情
// ID字段:this.data.type(特殊:依赖type参数) // 数据类型:'stats' // 注意:缓存key需包含type和date
⏳ pages/time-capsule-detail/time-capsule-detail.js - 时光胶囊详情
// ID字段:this.data.memoryId // 数据类型:'timeCapsule' // 云函数:'getTimeCapsuleDetail'
低优先级(不常用)
pages/medicine-record-detail/medicine-record-detail.js- 用药记录详情pages/clothing-detail/clothing-detail.js- 衣物详情pages/wear-record-detail/wear-record-detail.js- 穿搭记录详情
快速改造指南
通用改造步骤(3步)
第1步:在页面顶部添加导入
const { getCurrentFamilyId } = require('../../utils/family-context.js'); const familyDataCache = require('../../utils/family-data-cache.js').default;
第2步:修改 loadDetail 方法开头
async loadDetail() { const familyId = getCurrentFamilyId(); const detailId = this.data.xxxId; // 替换为实际ID字段 const dataType = 'xxx'; // 替换为数据类型 // ✅ 先从缓存加载 const cachedData = familyDataCache.getDetail(familyId, dataType, detailId, false); if (cachedData) { console.log(`📦 [${dataType}详情] 使用本地缓存`); this.setData({ detail: cachedData, loading: false }); } else { this.setData({ loading: true }); } // 后续云函数调用... }
第3步:修改成功和失败处理
// 成功后保存缓存 if (res.success) { familyDataCache.setDetail(familyId, dataType, detailId, res.data); this.setData({ detail: res.data, loading: false }); } else if (!cachedData) { wx.showToast({ title: '加载失败', icon: 'none' }); } // 异常时静默处理 catch (e) { console.error(`🔌 [${dataType}详情] 云端加载失败:`, e); if (!cachedData) { wx.showToast({ title: '加载失败', icon: 'none' }); } this.setData({ loading: false }); }
用户体验提升
✅ 已实现效果
- 秒开列表:切换家庭/tab瞬间显示上次数据
- 离线可用:飞行模式下可查看所有已缓存的列表
- 静默刷新:有缓存时不显示loading,后台更新
- 家庭隔离:每个家庭的数据独立缓存,不会混乱
⏳ 即将实现效果(完成详情页后)
- 离线详情:飞行模式下可查看所有已缓存的详情页
- 极速加载:详情页秒开,无需等待网络
- 完整离线体验:列表+详情全部离线可用
测试清单
✅ 已测试
- 列表页家庭切换
- 列表页数据刷新
- 列表页缓存读取
⏳ 待测试
- 飞行模式下打开已缓存的列表(应正常显示)
- 飞行模式下打开已缓存的详情(应正常显示)
- 网络恢复后数据是否自动刷新
- 切换家庭后详情页缓存是否正确
- 缓存过期(24小时)后是否自动刷新
性能指标
预期提升
- 列表首屏时间:2000ms → 50ms(缓存命中时)
- 详情页加载时间:1500ms → 30ms(缓存命中时)
- 离线可用率:0% → 95%+(已访问过的内容)
- 网络请求减少:50%+(缓存有效期内)
存储占用
- 列表缓存:约10-50KB/家庭
- 详情缓存:约5-20KB/详情
- 图片缓存:最多150MB(已有)
- 总计:< 200MB(极限情况)
下一步行动
-
完成剩余详情页改造(按优先级)
- memory-detail.js
- medical-detail.js
- medicine-detail.js
-
离线场景测试
- 飞行模式完整流程测试
- 弱网环境测试
- 缓存过期测试
-
性能监控
- 添加缓存命中率统计
- 监控离线模式使用情况
-
用户体验优化
- 添加"离线模式"提示(可选)
- 优化缓存更新策略
技术亮点
- 家庭维度隔离:每个家庭数据独立缓存,安全可靠
- 智能刷新策略:有缓存时静默刷新,无缓存时显示loading
- 离线优先架构:网络异常不影响已缓存内容的访问
- 最小侵入改造:不破坏现有逻辑,仅添加缓存层
- 统一缓存管理:一键清除所有缓存(profile页)
💬评论 (0)
登录后即可发表评论
立即登录暂无评论,来抢沙发吧!