[RFC] 支持双端执行的dataloader
Summary | 概述
csr下dataloader 的请求时机较为提前,可以提前获取请求数据 ssr下会在服务端执行,如果有异常会再次执行客户端对应的逻辑
但是还存在一种使用场景,即ssr请求成功,但是依然需要dataloader来处理另一部分客户端前置请求
Motivation | 背景
ssr会在服务端请求数据并跟随html返回,但是有些场景类似于千人千面的,则需要放置在前端请求(避免缓存影响页面内容)
Usage example | 使用示例
为了避免breaking change, 可以对应defineServerDataLoader 导出一个 defineClientDataLoader
export const clientDataLoader = defineClientDataLoader()
Detailed design | 方案设计
ssr下,目前dataLoader 和 serverDataloader属于对应关系,里边的逻辑内容基本要保持一致,clientDataloader可以作为一个独立的内容即只关注必须在客户端执行的请求逻辑
现有逻辑:
- 如果只定义了
dataLoader,则逻辑按以前处理,即成功时只在服务端调用一次,如果异常客户端再次进行调用 - 如果
dataLoader和serverDataloader同时定义,成功时只调用serverDataLoader,异常降级后调用dataLoader
新增逻辑
clientDataLoader不参与降级处理,即无论服务端调用成功与否,都会被调用
推荐用法
// 降级后使用
export const dataloader = defineDataLoader()
// server用
export const serverDataLoader = defineServerDataLoader()
// 客户端执行总是触发
export const clientDataLoader = defineClientDataLoader()
Additional context | 额外信息
No response
原则上不再增加 clientDataLoader 这样的概念,serverDataLoader 后续我们也计划 deprecate 掉,后续统一用 dataloader 的方法
至于 RFC 中提到的场景,可以考虑通过数组形式的 dataLoader 进行操作,如果服务端不执行的数据请求,可以考虑异常或降级的标志位,前端统一根据页面数据再决定是否重新发起已失败的请求
cc @chenjun1011 @answershuto