跳到主要内容

2 篇博文 含有标签「Managers」

Managers handle global side effects and middleware

查看所有标签

v0.19:批量 Controller.set(),更快的 TypeScript

· 阅读需 29 分钟
Nathaniel Tucker
Creator of Reactive Data Client
备注

这篇翻译之后英文原文有更新,内容可能已过时。

v0.19 让 Manager 可以在一次 store 更新中写入一整批流式到达的行,把 endpoint 代码的类型检查速度提高约 2 倍,并修复了一批 TypeScript 和 Vue 问题。编码智能体还获得了 Claude Code 插件、Vue skill 和 llms.txt;请参阅面向编码智能体的 Data Client。

新 API:

性能:

其他改进:

  • 修复 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)

破坏性变更:

为未来版本做好准备:

v0.14:精简的 Manager API、性能提升与 GC

· 阅读需 13 分钟
Nathaniel Tucker
Creator of Reactive Data Client

Manager:

Manager API 得到了精简——更扁平的 action 结构降低了代码复杂度,并通过减少不同的内联缓存条目来提升性能;同时更简单的配置 API 让自定义更加愉快。

性能:

Schema/数据建模:

测试:

垃圾回收:

  • GCPolicy——自动回收过时数据

破坏性变更: