v0.19:批量 Controller.set(),更快的 TypeScript
这篇翻译之后英文原文有更新,内容可能已过时。
v0.19 让 Manager 可以在一次 store 更新中写入一整批流式到达的行,把 endpoint 代码的类型检查速度提高约 2 倍,并修复了一批 TypeScript 和 Vue 问题。编码智能体还获得了 Claude Code 插件、Vue skill 和 llms.txt;请参阅面向编码智能体的 Data Client。
新 API:
- 支持 Array schema 的 Controller.set() - 用
ctrl.set([Entity], rows)在一次 store 更新中写入多个 entity,比每行调用一次set()最多快 95 倍
性能:
- 更快的 TypeScript - 编辑器和
tsc检查 RestEndpoint 与 resource() 代码的速度提高约 2 倍,内存减少 40%,并且之前能捕获的错误一个都不少
其他改进:
- 修复 TypeScript 7 对包
exports的模块解析;导入现在会解析到声明文件(#4019) - renderDataHook() 在首次渲染挂起时也会运行 provider 的挂载副作用(#4099)
- Controller.set() 的值按 schema 推导类型,因此
ctrl.set(new schema.All(Todo), 42)会是 TypeScript 错误(#4133) - Controller.set() 可用 Invalidate schema 删除单个 entity,不再需要包成单行批量的变通写法(#4230)
- 在
new RestEndpoint()、.extend()和resource().extend()中,process() 获得带类型的 params,因此写错路径参数会是 TypeScript 错误,而不是运行时的undefined(#4183、#4184) - getOptimisticResponse() 的返回值按 schema 推导类型,因此字段类型写错会是 TypeScript 错误,而不是闪现一下错误数据(#4198)
- Vue 的 useSuspense() 和 useLive() 在新参数加载期间保留之前的数据,而不是返回
undefined(#4131) - Vue 的 useSuspense() 和 useLive() 把参数变化后的获取错误发送给
onErrorCaptured(),而不是产生未处理的 promise rejection(#4135) - Vue 的 useSuspense()、useDLE() 和 useFetch() 不再在每次 store 更新时重新获取过时数据,因此
controller.set()不会被覆盖(#4134) - Vue 的 useSuspense() 在挂载时显示过时数据并在后台重新获取,与 React 一致,而不是在重新获取完成前一直显示
<Suspense>的 fallback(#4169) - Vue 的 useDLE() 和 useCache() 在无关的 store 更新中保留已过期的
invalidIfStale数据,而不是卡在加载状态(#4142) - Vue 的
DataClientPlugin可以安装在 3.5 之前的 Vue 版本上,而不是抛出app.onUnmount is not a function(#4146) - Vue 的 DataClientPlugin 默认进行垃圾回收,与 React 的 DataProvider 一致,因此你不再需要传入
gcPolicy;它如何决定移除什么(#4148) - Vue 组合式函数接受像
() => ({ id: props.id })这样的 getter 参数;之前类型上允许,但却把函数本身传给了 endpoint(#4115) - 修复在关闭
skipLibCheck的 TypeScript 4.x 上出现的Cannot find name 'NoInfer'和export type错误(#4138) - 修复在关闭
skipLibCheck的 TypeScript 4.0–4.5 上Entity、Endpoint、Union和RestEndpoint的类型错误(#4140) - 修复在 TypeScript 4.0–4.4 上导入
@data-client/react/redux、@data-client/react/nextjs或@data-client/test时的',' expected错误(#4232) - 修复在 TypeScript 4.0–4.4 上
@data-client/test的act和renderHook被推导为any的问题(#4251) - Entity 类可以用在期望
EntityInterface的地方(#4149);为未来版本准备好pk()重写 - useCache() 和 useDLE() 对已删除且重新获取失败的 entity 返回
undefined,而不是一个能绕过if (!data)检查的真值Symbol;移除所有变通代码(#4150) - Vue 的 useFetch() 在挂载期间保护其数据不被垃圾回收,与 useSuspense() 一致,因此配置的
gcPolicy不再会清除组件稍后要读取的预取数据(#4152) - 打开 Redux DevTools 的应用在开发模式下遇到大型 store 或频繁更新时不再卡顿;每次更新的序列化快 40-60 倍(#4163)
- 传入 endpoint 覆盖对象的 resource().extend() 会在类型中保留之前用
.extend('name', options)添加的 endpoint,因此使用它们不再是 TypeScript 错误(#4184) - 当 Query 或 Lazy 包装 Collection 时,RestEndpoint.push、
unshift和remove接受 Entity 的字段作为 body,而不是只接受FormData(#4226) - Vue 的 useFetch() 的类型现在是它返回的只读
Ref,因此promise.resolved(始终为undefined)现在是 TypeScript 错误;请改为读取promise.value.resolved(#4114) - 传给 DataProvider 或 DataClientPlugin 的
Controller子类不再需要类型断言就能通过类型检查(#4228) - prepareStore() 的
store可以不加类型断言直接传给 react-redux 的<Provider>,并且其类型中包含dispatch()(#4238) - resource().create 接受 FormData,无需类型断言,与
update、partialUpdate和getList.push一致(#4235) - RestEndpoint.push、
unshift和remove以 JSON 形式发送数组 body,因此一次创建或移除多个条目不再向服务器发送"[object Object]";resource().create也接受数组(#4262) - Vue 的
createDataClient()已弃用,因为它是 DataClientPlugin 的内部实现;请用app.use(DataClientPlugin, options)安装插件,而不是直接调用它(#4193) - Vue 的
renderDataCompose()的waitForNextUpdate()已弃用,因为它会在 1 秒后静默放弃,让仍处于挂起状态的测试通过;请改为await result,或在变化之后await allSettled(),后者现在也会等待由 prop 变化触发的获取(组合式函数的单元测试、#4221)
- 需要 TypeScript 4.0 或更高版本 - 移除了 TypeScript 3.x 的声明文件(#4151)
