技术分享

111

8
871353782
发布于 2026年1月25日 · 24 min read

离线优先架构改造完成报告

改造目标

所有页面采用离线优先策略

  1. ✅ 先加载本地缓存(秒开)
  2. ✅ 后台刷新云端数据(静默更新)
  3. ✅ 网络异常时继续使用缓存(离线可用)

已完成改造

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 }); }

用户体验提升

✅ 已实现效果

  1. 秒开列表:切换家庭/tab瞬间显示上次数据
  2. 离线可用:飞行模式下可查看所有已缓存的列表
  3. 静默刷新:有缓存时不显示loading,后台更新
  4. 家庭隔离:每个家庭的数据独立缓存,不会混乱

⏳ 即将实现效果(完成详情页后)

  1. 离线详情:飞行模式下可查看所有已缓存的详情页
  2. 极速加载:详情页秒开,无需等待网络
  3. 完整离线体验:列表+详情全部离线可用

测试清单

✅ 已测试

  • 列表页家庭切换
  • 列表页数据刷新
  • 列表页缓存读取

⏳ 待测试

  • 飞行模式下打开已缓存的列表(应正常显示)
  • 飞行模式下打开已缓存的详情(应正常显示)
  • 网络恢复后数据是否自动刷新
  • 切换家庭后详情页缓存是否正确
  • 缓存过期(24小时)后是否自动刷新

性能指标

预期提升

  • 列表首屏时间:2000ms → 50ms(缓存命中时)
  • 详情页加载时间:1500ms → 30ms(缓存命中时)
  • 离线可用率:0% → 95%+(已访问过的内容)
  • 网络请求减少:50%+(缓存有效期内)

存储占用

  • 列表缓存:约10-50KB/家庭
  • 详情缓存:约5-20KB/详情
  • 图片缓存:最多150MB(已有)
  • 总计:< 200MB(极限情况)

下一步行动

  1. 完成剩余详情页改造(按优先级)

    • memory-detail.js
    • medical-detail.js
    • medicine-detail.js
  2. 离线场景测试

    • 飞行模式完整流程测试
    • 弱网环境测试
    • 缓存过期测试
  3. 性能监控

    • 添加缓存命中率统计
    • 监控离线模式使用情况
  4. 用户体验优化

    • 添加"离线模式"提示(可选)
    • 优化缓存更新策略

技术亮点

  1. 家庭维度隔离:每个家庭数据独立缓存,安全可靠
  2. 智能刷新策略:有缓存时静默刷新,无缓存时显示loading
  3. 离线优先架构:网络异常不影响已缓存内容的访问
  4. 最小侵入改造:不破坏现有逻辑,仅添加缓存层
  5. 统一缓存管理:一键清除所有缓存(profile页)

💬评论 (0)

登录后即可发表评论

立即登录

暂无评论,来抢沙发吧!