记一次随机渲染问题
九月 20, 2022
2040
通过种子随机保证 SSR 和 CSR 环境随机结果一致
背景
PD: 兆兆啊,你给我做个开关,打开开关后这个列表随机排序渲染
兆兆: 简单简单,这不分分钟搞定
然后我写了一下午……
SSR & CSR
第一版代码如下,通过 Math.random() - 0.5
是正数或负数控制每次的排序顺序:
|
代码发上去一看有问题,页面渲染后会闪屏,体验很差。
原因是 SSR 和 CSR 环境下都会随机排序一次,并且结果不一样,导致 hydrate 时两份 DOM 映射不上触发整体重渲染。
有两个解法:
- 架上一层 FaaS 在数据源上做随机排序,保证下发的数据完全一致;
- 控制随机种子,确保 SSR 和 CSR 下生成同一个随机数,随机排序的结果自然也就一致了;
种子随机
写 FaaS 太麻烦了还容易背锅,所以采用种子随机改了一版:
|
这里用 serverTime
和 id
做种子,服务端时间可以保证每次刷新页面随机一次,唯一 ID 可以保证每一次遍历随机一次。在 SSR 下 和 CSR 下种子是一致的,随机出来的结果也就一致了。
Sort
跑了一下发现现象很神奇,SSR 和 CSR 下生成的随机数确实是一致的,但是随机排序生成的列表居然不一致,还是触发了重渲染。
调了半天发线是 array.sort()
在 Node 和 Browser 环境下实现方式不一致:
|
心中万马奔腾…… 改成这样就好了:
|
- 本文作者:zhaoo
- 本文链接:https://www.izhaoo.com/2022/09/20/random-render-list/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!
查看评论