嘿 r/Devvit — 首个帖子。 Spell Royale (直播单词战royale,100名玩家比赛) 已经在 App Directory 中发布,并在 r/SpellRoyale 上运行。以下是一些值得分享的构建细节。

堆栈: u/devvit/web 0.12.23,React 19 + Vite 客户端,Hono + tRPC 服务器,Redis 有序集合处处,Devvit 实时匹配事件。

四个我学到的东西可能会节省你的时间:

1. pipeline Redis。
默认的顺序等待是慢的。
我第一次版本的 submit-word 做了 5 个顺序的 Redis 调用 (\~250ms 模型路径)。Promise.all'd 并行读写 — 同样的操作,\~150ms 现在。Devvit 服务器端无状态冷启动仍然是 \~1s,但是这是一种基础限制。将 Redis 顺序性保留用于实际依赖项。

2. 实时是火车头忘记 — 认为交付间隙。
我有一个“沉默消失”的bug:服务器消除了玩家,发送 tick 事件 eliminatedNow:[userId],客户端重新加载状态。有时实时事件到达了,但下一个 /state 汇报看到的仍然是 Redis 的陈旧值。解决方案:让客户端 乐观更新状态从事件负载本身 (当 event.eliminatedNow.includes(me),本地将 yourEliminated=true 翻转)。不要等待服务器回合来确认。

3. vw 单位不尊严你的列克拉姆。
Devvit帖子渲染在一个iframe中,\~375px宽于移动设备,但600–800px+于桌面。
我有 --tile-size: clamp(40px,13vw,64px),并且在桌面上得到了分块的块,因为 vw视口宽度,而不是容器。
解决方案:将 clamp 的上限限制在移动设备上的值(50px),所以桌面 = 移动设备。

4. 跨子数据通过全局Redis键有效。
只是发布了一个社区排行榜 — 每个运行Spell Royale的子区都显示在一个全局排名中。
关键点:Devvit的Redis是应用域,而不是子域,因此任何键,如 global:sub-wins,在所有应用安装中都共享。
存储 subredditName 在匹配元数据中,在大厅创建时,随后 zIncrBy 在匹配结束时。
跨子竞争而不需要任何跨子数据接口。

下一步

  • Mod工具包(预定比赛,mod-only在游戏中的控制)
  • Q-无-U保护在字母生成中(小事,大QoL)
  • 最后:跨子团队锦标赛,带有一个直播主播

试试: r/SpellRoyale

模块:如果您运行一个单词,谜题或每日游戏的子区并且想为您的社区安装Spell Royale,请联系我 — 我很乐意帮助设置。

对上述任何内容都有问题。 — Doug (u/dkinnison)