refactor: 简化schema结构,更新AGENTS.md

This commit is contained in:
2026-04-14 14:20:46 +08:00
parent c3846da8ae
commit 6d991326a5
37 changed files with 51 additions and 5 deletions
+108
View File
@@ -0,0 +1,108 @@
import type { Entity, Condition } from '../core';
import type { Interaction } from '../interaction';
import type { QueryConfig } from './query-config';
/**
* 数据查询配置
*
* 【架构定位】:
*
* 1. 它是低代码数据流“三层漏斗”模型的中间层(核心业务层)。
* 2. 遵循 CQRS 架构,专职处理幂等的“读操作(Read)”。
* 3. 它是连接底层 DataSource(协议层)与顶层 Component(视图层)的桥梁。
*
* 【引擎实现指引】:
*
* 渲染引擎应将其映射为一个强大的状态机(如 TanStack Query 的 `useQuery` 实例)。
*
* 它不应将 `isLoading`, `data`, `error` 等运行时快照存入此 Schema,
* 而是由引擎在全局内存(QueryClient)中动态维护这些衍生状态,供组件声明式地订阅。
*/
export interface Query extends Entity {
/**
* 执行条件
*
* 决定了该查询是否允许被发送(无论是因为页面加载、轮询还是组件订阅)。
*
* 核心场景(串行依赖):
*
* 当 Query B 需要用到 Query A 的返回结果作为参数时,
* 可在此配置 `enabled: { type: 'code', code: 'return !!context.queries.QueryA.data' }`。
* 引擎会挂起 Query B,直到 Query A 成功返回并填充了数据,Query B 才会被自动放行。
*
* 如果不填,默认允许执行。
*/
enabled?: Condition;
/**
* 页面加载时自动执行
*
* 性能优化的杀手锏。
*
* 如果为 true,引擎在路由命中(或应用启动)的极早期阶段,
* 在 UI 组件树还未开始渲染时,就提前向服务器发起请求。
* 这样当底层图表组件渲染完毕并尝试订阅此 Query 时,数据可能已经“热乎”地躺在缓存里了,
* 从而彻底消灭组件的初始白屏 Loading 时间。
*/
prefetch: boolean;
/**
* 定时轮询策略
*
* 数字大屏(Dashboard)的灵魂特性。赋予数据流实时刷新的能力。
*/
polling: {
/**
* 是否开启轮询
*/
enabled: boolean;
/**
* 轮询间隔时间(单位:毫秒 ms)
*
* 引擎实现指引:在页面不可见(浏览器标签页隐藏)时,引擎应智能暂停轮询以节省性能。
*/
interval: number;
};
/**
* 过滤器管道
*
* 极其关键的数据转换层(Transform Layer)。
* 包含了一系列被引用的全局 Filter ID。
*
* 引擎实现指引:
*
* 当底层 API 返回原始 JSON 后,在存入 Query 内存缓存池(或喂给组件)之前,
* 必须将原始数据像接水管一样,串行流过这些 Filter 函数。
* data = filter3(filter2(filter1(rawData)))
*
* 优势:让组件拿到的永远是极其纯净、格式规整的业务数据(如 `[{ x, y }]` 数组),
* 实现了“一份原始接口数据,清洗出多种衍生视图”的极致复用。
*/
filterIds: string[];
/**
* 交互
*
* 请求生命周期与副作用控制流
*
* 挂载于查询状态突变时的高阶事件侦听器。
*
* 引擎实现指引:
*
* 1. `onSuccess` (请求成功):常用于触发数据获取后的连锁反应(如更新某个全局 Variable,或弹出“数据同步成功”的 Toast)。
* 2. `onError` (请求失败):常用于统一拦截错误,触发异常上报或显示全局 Error Modal。
*
* 这将原本散落在组件里的异步回调地狱,完美收拢到了数据请求自身的配置中。
* 若无副作用,必须为一个显式的空数组 `[]`。
*/
interactions: Interaction[];
/**
* 具体的请求协议配置
*
* 采用极其强大的“多态联合类型(Polymorphism Union Type)”。
*
* 它决定了这究竟是一个静态的 Mock 数据(Static),
* 还是一个通过 HTTP 调用的 REST 请求(Rest),
* 抑或是一个直连数据库执行的 SQL 语句(Database)。
*
* 引擎通过读取 `config.type` 决定派发给哪个底层的 DataSource 客户端去执行。
*/
config: QueryConfig;
}