ice icon indicating copy to clipboard operation
ice copied to clipboard

[RFC] 支持双端执行的dataloader

Open HomyeeKing opened this issue 2 years ago • 1 comments

Summary | 概述

csr下dataloader 的请求时机较为提前,可以提前获取请求数据 ssr下会在服务端执行,如果有异常会再次执行客户端对应的逻辑

但是还存在一种使用场景,即ssr请求成功,但是依然需要dataloader来处理另一部分客户端前置请求

Motivation | 背景

ssr会在服务端请求数据并跟随html返回,但是有些场景类似于千人千面的,则需要放置在前端请求(避免缓存影响页面内容)

Usage example | 使用示例

为了避免breaking change, 可以对应defineServerDataLoader 导出一个 defineClientDataLoader

export const clientDataLoader = defineClientDataLoader()

Detailed design | 方案设计

ssr下,目前dataLoaderserverDataloader属于对应关系,里边的逻辑内容基本要保持一致,clientDataloader可以作为一个独立的内容即只关注必须在客户端执行的请求逻辑

现有逻辑:

  • 如果只定义了dataLoader,则逻辑按以前处理,即成功时只在服务端调用一次,如果异常客户端再次进行调用
  • 如果dataLoaderserverDataloader同时定义,成功时只调用serverDataLoader,异常降级后调用dataLoader

新增逻辑

clientDataLoader不参与降级处理,即无论服务端调用成功与否,都会被调用

推荐用法

// 降级后使用
export const dataloader = defineDataLoader()

// server用 
export const serverDataLoader = defineServerDataLoader()

// 客户端执行总是触发
export const clientDataLoader = defineClientDataLoader()

Additional context | 额外信息

No response

HomyeeKing avatar Sep 06 '23 07:09 HomyeeKing

原则上不再增加 clientDataLoader 这样的概念,serverDataLoader 后续我们也计划 deprecate 掉,后续统一用 dataloader 的方法

至于 RFC 中提到的场景,可以考虑通过数组形式的 dataLoader 进行操作,如果服务端不执行的数据请求,可以考虑异常或降级的标志位,前端统一根据页面数据再决定是否重新发起已失败的请求

cc @chenjun1011 @answershuto

ClarkXia avatar Sep 07 '23 03:09 ClarkXia