feat(leaderboard): 预计算快照消除首开延迟

- leaderboard 云函数重写为快照架构:定时触发离线算日/月/年三榜写入
  leaderboard_snapshot 集合(约 50ms 单次 get),请求默认读快照,force 才
  实时重算并回写;快照缺失/过期自动回退实时路径,老客户端零改动兼容
- config.json 加每 4 分钟定时器 snapshotTimer
- _persistSnapshot 修复 wx-server-sdk 写操作需 { data: {...} } 包裹的坑
  (裸 set(data) 报 parameter.data should be object instead of undefined)
- app.js onLaunch 预热排行榜,覆盖"开 App→点榜"常见路径
- leaderboard.js 更新过时"全表扫描 2-3s"注释
This commit is contained in:
2026-07-28 17:41:08 +08:00
parent 926dffad95
commit a3dd080b6f
4 changed files with 203 additions and 72 deletions
+11
View File
@@ -3,6 +3,7 @@ const cloud = require('./utils/cloud')
const storage = require('./utils/storage')
const darkMod = require('./utils/darkMode')
const voice = require('./utils/voice')
const config = require('./config')
App({
async onLaunch() {
@@ -33,6 +34,16 @@ App({
// Init cloud storage (no-op if not configured)
cloud.init()
// P1 排行榜预热:App 启动即后台触发一次榜单请求,提前填充云函数实例/快照,
// 用户点进排行榜时已是热路径,首开等待从 2-3s 降到近乎无感。
// fire-and-forget,不 await,不阻塞启动链路;失败静默忽略。
if (cloud.enabled) {
wx.cloud.callFunction({
name: 'leaderboard',
data: { period: 'day', maxRank: config.leaderboardMaxRank }
}).catch(() => {})
}
const settings = wx.getStorageSync('user_settings')
if (!settings) {
wx.setStorageSync('user_settings', {