用途:优化偏慢的 React Router loader,减少冗余数据库访问与等待时间。资料列出三类反模式及对应改法。
一、重复获取调用方已有数据。若 loader 先取一条记录(如 getVideoWithClipsById),再把 ID 传给内部会重新取同一记录的下游函数,应改为直接把已取到的对象传给下游,例如把 getNextVideoId(videoId) 改为 getNextVideoId(video)。重构签名时参数类型只声明函数实际用到的字段(如 id、lesson 及其 id、videos、section.repoVersion.repo.id),而非完整返回类型。
二、过度获取嵌套关系。只需 ID 和 path 做导航却加载 clips、transcripts 等完整嵌套树时,应新建精简查询变体,如用 getCourseNavigationData(repoId) 代替 getCourseWithSectionsById(repoId)。精简查询要点:叶子关系只选必要列(columns: { id: true, path: true });对只需最新一条的关系加 limit: 1;不遍历的关系用 omit 去掉 clips、chapters、thumbnails;保留 where 过滤(如 archived = false)和 orderBy。
三、串行执行相互独立的查询。多个互不依赖的数据库调用应改用 Effect.all 并行执行,使总耗时取各自耗时最大值而非求和,示例中同时取 nextVideoId 与 previousVideoId。
依赖注入:新增查询(如 getCourseNavigationData)若位于 course 操作但被 video 操作使用,应在 db-course-operations.server.ts 中添加并导出该查询;在 VideoOperationsService 的 effect 块中通过 yield* CourseOperationsService 声明跨域依赖,Effect Layer 系统会自动解析。
限制:资料未提供安装方式、版本要求、计费或平台支持信息,也未给出完整实现代码,上述仅为资料中记录的模式与示例。