它们的核心都是 FRP(功能响应式编程)——这意味着它们有一个映射到 DOM 的树,并且只渲染需要渲染的组件或子组件。(正如前面有人指出的,Elm 已经放弃了 FRP 原则来追求自己的想法)
它们都在 JavaScript 中编译(尽管使用 ClojureScript/Om 库或 Reagent,你可以在你的 js 中获得实际的 React 对象),而 Elm 做自己的事情。我不喜欢 Elm 必须通过 npm 安装,尽管据我所知 czapliki 正在使用独立安装程序)
Elm 在我看来更好,因为它管理状态对编码器更友好,并且它具有非常好的(如前所述--)类似 Haskell 的语法,而且您将 RuntimeErrors 移动到 CompileTimeErrors 中,这对于开发人员来说更合适 -加上它具有更容易的代码可维护性。
另一方面,cljs 有很多库——正如我提到的,其中一些库返回实际的 React 组件(cljs/Om 与 R.js LifeCycle 匹配 1:1)——其他的只是尊重 FRP 和 LifeCycle 的心态而不会受到它的阻碍。可能想研究 Om/Next 是否具有从端点调用数据的 GraphQL 方式,并已删除在普通 cljs/Om 中使用的异步通道。
老实说,这是一个品味问题,但我个人更喜欢 Elm(用两种语言编写)。但是,如果您确实使用 cljs,请确保您获得了一个不错的库,并且不要在原版 cljs 中做任何事情,否则当您想要保持 5k+ LOC 时,您会很抱歉。(查找 Fulcro、Reagent、om、OmNext、hoplon、 ETC。)