代码之家  ›  专栏  ›  技术社区  ›  jhegedus

响应简单的全局实体缓存而不是flux/react/etc

  •  0
  • jhegedus  · 技术社区  · 6 年前

    我在写一点 "fun" Scala/Scala.js 项目。

    在我的服务器上,我有被引用的实体 uuid -S (内部 Ref -S)。

    为了“有趣”,我不想使用Flux/Redux体系结构,但仍然在客户机上使用React(与 ScalaJS-React )

    我要做的是拥有一个简单的缓存,例如:

    • 当反应时 UserDisplayComponent 希望显示 Entity User 具有 uuid=0003
    • 然后 render() 方法调用 Cache (作为 prop )
    • 假设这是第一次 用户显示组件 要求这个特别的 用户 UUID=0003 ) 隐藏物 还没有
    • 然后 隐藏物 做一个 AjaxCall 去取 用户 从服务器
    • 阿贾克斯 返回 隐藏物 触发器 re-render
    • 但是!当组件请求 用户 隐藏物 它得到了 用户 实体 隐藏物 立即且不会触发 阿贾克斯

    我希望实现这一点的方法如下:

    • 我开始了 Read()
    • 里面的“东西” Read() 询问 隐藏物 各种各样的 Entities
    • 隐藏物 也返回 Loading 实体 本身。
    • 在渲染结束时 隐藏物 发送所有 AjaxRequest -s到服务器,并等待所有返回
    • 一旦所有 AjaxRequests 已经返回(假设他们这样做——为了简单起见) 隐藏物 触发“ re-render() “现在,所有以前被请求的实体都由 隐藏物 马上。
    • 当然可能是新来的 实体 -S将触发 Read() 取更多 实体 -例如,如果我加载 实体 举个例子 case class UserList(ul: List[Ref[User]]) 类型。但我们现在不必担心。

    问题:

    1)如果我以这种方式处理国家事务,我是否真的做错了什么?

    2)是否已有解决方案?

    我环顾四周,但一切都是通量/还原等…沿着这些线…-我想避免的原因是:

    • “乐趣”
    • 好奇心
    • 探索
    • 玩弄
    • 我认为对于我的用例来说,这个简单的缓存会更简单,因为我想以一种简单的方式将基于“引用”的“域模型”转移到客户机上:就像客户机在服务器上,网络将无限快且零延迟(这就是缓存将要模拟的)。
    1 回复  |  直到 6 年前
        1
  •  1
  •   Nikita    6 年前

    考虑构建富动态Web UI需要解决哪些问题,以及库/层通常为您处理这些问题。

    1。DOM事件(单击等)需要触发状态更改

    这相对容易。DOM节点公开了基于回调的侦听器API,它可以直接适应任何体系结构。

    2。状态更改需要触发对dom节点的更新

    这是更棘手的,因为它需要完成 有效地 在一个 可维护的 态度。您不希望在整个组件的状态发生变化时从头开始重新呈现它,也不希望编写大量jquery风格的意大利面代码来手动更新DOM,因为即使在运行时效率很高,也很容易出错。

    这个问题主要是为什么像react这样的库会存在,它们将这个抽象到虚拟DOM之后。但是你也可以在没有虚拟DOM的情况下抽象出来,就像我自己的一样 Laminar 图书馆确实如此。

    放弃这个问题的库解决方案只对更简单的应用程序有效。

    三。组件应该能够读/写 全球的 状态

    这是助焊剂/还原剂解决的部分。具体来说,这些都是问题1和2,除了适用于全局状态,而不是组件状态。

    4。高速缓存

    缓存很难,因为缓存需要 失效的 在某一点上,在上面的所有事情之上。

    助焊剂/还原剂对这一点毫无帮助。其中一个有帮助的库是 Relay 它与您提出的解决方案非常相似,只是更为详细,并且位于react和graphql之上。阅读它的文档将帮助您解决问题。如果您不需要整个react/graphql包,但需要了解现有技术,那么您一定可以在plain scala.js中实现中继功能的一小部分。

    5。序列化和类型安全

    这就是 只有 此列表中的问题与scala.js相关,而不是一般的javascript和spa。

    scala对象需要序列化才能在网络上传输。进入JSON、Protobufs或其他任何系统,但是您需要一个不涉及容易出错的手工工作的系统。有许多scala.js库可以解决这个问题,例如upickle、autowire、endpoints、sloth等。关键词:“scala json library”或 scala类型安全RPC “,取决于您需要哪种解决方案。


    我希望这些原则足以作为答案。当您理解这些问题时,您的解决方案是否适用于给定的用例应该是显而易见的。实际上,您没有描述解决方案如何解决问题2、4和5。您可以使用我提到的一些库,或者使用类似的思想/算法实现您自己的解决方案。


    在一个次要的技术说明中,考虑为缓存层实现一个异步的、基于未来的API,以便它返回 Future[Entity] 而不是 Loading | Entity .