深挖`React`里程碑之作`AutoStore`与`helux`的渊源

2023/11开始,经过超500+commits的开发,以近日正式发布里程碑之作AutoStore

AutoStore是一款设计精巧而优雅的现代化响应式状态管理库,提供了强大的状态管理能力,支持响应式计算属性异步计算表单双向绑定信号组件等功能,为您提供一站式全自动的状态管理。

helux 是腾讯TNTWeb前端团队开源的一款集atomsignal依赖追踪为一体,支持细粒度响应式更新的状态引擎。

AutoStore的开始分两个阶段

第1个阶段: SpeedForm

  • 初步想法

helux大概发布于2023/9左右,也是一款经过超2年不断迭代的精心大作,作者钟正楷在掘金上发布一系列推文,阅读之后,极为惊艳!!!

然后就开始进行陆续试用helux,并期间为helux贡献了一些文档、构建、测试之类的外围工作。经过深入学习和使用,也发现了一些问题,主要是对heluxAPI设计有自己的想法,觉得不够优雅。

  • 因此,我决定基于helux包装一个类似helux-starter之类的封装库,用来简化helux的使用。
  • 随着helux-starter代码的增加,我冒出一个就地计算的主意,如下:
tsx 复制代码
const order = sharex({
   price:9.9,
   count:2,
   total:(state)=>state.price * state.count
})

以上orderhelux处理后,会创建一个derive对象,然后将派出计算结果写入到原始对象,如下:

复制代码
order= {
   price:9.9,
   count:2,
   total:18.8
}

但此时的helux还没有开放相应的hook接口来做这件事,因此,在作者钟正楷的全力配合下,我们在某个周六花了5个小时将相关的代码加入,并发布正式支持此特性。

  • 开发SpeedForm

有了就地计算这个想法后,我进一步开发helux-starter,随着对helux的深入了解,有了更疯狂的的玩法和想法。

就是在一个复杂的JSON对象中,将就地计算发挥到极致,然后与表单进行结合,我想这将大大简化复杂的业务的表单处理,比如下面的orders

tsx 复制代码
const orders = sharex({
    orders:[
        { price:9.9, count:2, total:(state)=>state.price * state.count},
        { price:9.9, count:2, total:(state)=>state.price * state.count}
        { price:9.9, count:2, total:(state)=>state.price * state.count}
    ]
})

一个由响应式核心helx驱动的强大表单引擎开始有了雏形。

因此,我从2023/11开始正式将helux-starter更名为speedform,正式定位为一个基于由响应式核心helx驱动的强大表单引擎。

接下来,SpeedForm的开发进入稳定期,陆续提交300+commits,至2024/5已基本完工,我跟钟正楷已经基本完工,也出了初步的文档, 但还不完善以及后续的文档了。

但由于各种原因,停更了一段时间,之间:

  • 使用SpeedForm抽空参加了openInula 开源之夏活动,获取了三等奖。
  • 开源了LiteTree一款在Vitepress/MarkDown下使用的树组件
  • 开源了FlexStyled一款CSS-IN-JS库
  • 开源了FlexTree:一款Nodejs下基于左右值的树存储库
  • 开源了一些至今没有完工的坑...

第2个阶段: AutoStore

正在SpeedForm进行收宫阶段时,很快就可以正式发布SpeedForm了,风云再起。

  • 在打包阶段我发现SpeedForm打包后,产物超过100K,对于一款表单库而言,虽然功能比较多,但是还是不太可接受。经过与作者钟正楷的沟通,由于设计原因,并不能支持Tree Shaking之类的技术进行优化。
  • React组件中开发时,我想实现一个useForm的功能,在组件销毁时将helux创建的sharex销毁,但是helux并不支持,这几乎意味着只能是使用为全局状态库。

基于以上两个主要原因,我开始思考如何解决此问题。

  • 我先看了helux的源码,还是否可以进行改造之类的,发现很难,甚至都看不懂。
  • 然后我发现helux的底层是由原作者开发的limulimu是一个不可变数据库,同样功能强大性能强劲。

是否可以直接使用limu来为SpeedForm重构一个响应式核心呢?一方面这相当于重写一个helux,较大的工作量。另一方面,我预想中的响应式核心,并不需要不可变数据。需要为此买单吗?

犹豫之中,SpeedForm停更了好长一段时间。

某一天,我试着想,能不能自己写一个响应式核心,我不需要不可变数据,就想满足SpeedForm的设计。说干就干,没想到,非常顺利,几乎是2-3天时间就将核心基于Proxy的关键代码写完。

经过思考,我决定重构自己的响应式核心,并且SpeedForm重命名为AutoStore,自2024/8开始,由了之前的工作基础,AutoStore的开发非常顺利,终于于近日正式发布了。

AutoStore是一款设计精巧而优雅的现代化响应式状态管理库,提供了强大的状态管理能力,支持响应式计算属性异步计算表单双向绑定信号组件等功能,为您提供一站式状态管理。

主要特性:

  • 响应式核心 :基于Proxy实现,数据变化自动触发视图更新。
  • 就地计算属性 :独有的就地计算特性,可以在状态树中任意位置声明computed属性,计算结果原地写入。
  • 依赖自动追踪 :自动追踪computed属性的依赖,只有依赖变化时才会重新计算。
  • 异步计算 :强大的异步计算控制能力,支持超时、重试、取消、倒计时、进度等高级功能。
  • 状态变更监听 :能监听get/set/delete/insert/update等状态对象和数组的操作监听。
  • 信号组件 :支持signal信号机制,可以实现细粒度的组件更新。
  • 调试与诊断 :支持chromeRedux DevTools Extension调试工具,方便调试状态变化。
  • 嵌套状态:支持任意深度的嵌套状态,无需担心状态管理的复杂性。
  • 表单绑定:强大而简洁的双向表单绑定,数据收集简单快速。
  • 循环依赖:能帮助检测循环依赖减少故障。
  • Typescript: 完全支持Typescript,提供完整的类型推断和提示
  • 单元测试:提供完整的单元测试覆盖率,保证代码质量。

AutoStore

相关推荐
mldong1 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排2 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60613 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角4 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!4 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰4 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi6 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen6 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马7 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒7 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端