Clojure Web框架的比较

67

有几个适用于Clojure的Web框架:

还有一些处理特定Web开发子任务的库,例如:

  • 用于模板的Enlive
  • 用于模板的Hiccup
  • 使用Ring处理请求/响应的低级事项
  • 用于持久化的ClojureQL(虽然它似乎不太活跃)

同时也有数百个可供使用的Java库。关于这些方面,已经在这里这里讨论过。

我想知道这些框架/组件在成熟度、范围、开发易用性和Django/RoR感觉等方面如何比较。


不要忘记在 https://github.com/zubairq/coils 上添加Clojure以及Pedestal。 - yazzapps.com
3
今天是2013年底,目前情况怎么样? - scape
6个回答

41

我开始学习Web开发时用的是Clojure语言。在此之前,我完全没有Web开发方面的经验。我无论如何都想不出Compojure是什么。我不知道现在初学者文档是否已经改进了(这并不久远),但当时我无法掌握它。一个朋友向我推荐了Moustache,读了一下README后,我就能够组合出目前的http://try-clojure.org网站。所以就易用性而言,我认为Moustache对我来说是最好的选择。

然而,如果像这里介绍的那样存在,我的看法可能会有所不同。

Conjure看起来非常酷,但与其他框架非常不同。由于我在Web开发方面的经验非常有限,因此我对此并没有太多发言权,但对我来说,Conjure感觉有点不符合Clojure语言的风格。它就是感觉不对劲。可能只是我还没有适应它的做法。

更新:我写这篇文章已经有一段时间了。很多事情已经发生了变化。现在不太有人使用Moustache,也没有人维护它了,虽然它足够完善(而且简单),但我现在建议选择Compojure或Noir。这两个框架都是目前维护的优秀框架。

更新2:Noir已经被弃用了很长时间,大部分功能移动到一个名为lib-noir的库中,该库设计用于从compojure/其他基于ring的Web框架中使用。


感谢您添加框架列表,Moustache对我来说是新的。 - Adam Schmideg
@[Adam Schmideg] 可能还有更多!这些只是我现在能想到的所有内容。它们肯定是最受欢迎的。 :) - Rayne
2
关于更新,Moustache仍然健在。它并不需要任何维护,我一直是它快乐的用户,即使在Clojure核心的所有变化中也是如此。Christophe Grand目前正在努力发布一个新版本,具有更丰富的语法和更多的功能。 - Marko Topolnik
这里是一个链接,其中指定了更新后的语法:http://cgrand.github.com/moustache/syntax.html。 - Marko Topolnik
还有一个更改:Noir 框架已经不再推荐使用,其核心部分已经移动到基于 ring/compojure 的库中。 - Profpatsch
这个已经有一段时间没有更新了,compojure仍然是推荐的框架吗? - ZN13

21

我知道这个问题有点过时了...但我还是不能不建议使用 Noir,作为一个非常好的选择。

Noir使用Ring、Compojure和Hiccup的组合来完成工作。快去看看吧!


11
Noir现已被弃用,请参考:http://blog.raynes.me/blog/2012/12/13/moving-away-from-noir/。作者建议改用Compojure替代。 - Björn Lindqvist

11

如Bjorn Lindqvist在其评论中所提到的,Noir已经不再使用。详情请参见这里

相反,建议考虑使用Compojurelib-noir


10

从框架的角度去考虑可能是一个错误的做法。更好的方法是考虑使用库组件,将它们组合在一起以得到最适合您需求的“框架”。

我过去使用过许多框架。大多数都能够快速为你创建一个基本的应用程序,但毫无例外的是,我发现它们往往会令人沮丧。通常是由于太多的样板文件或者需要进行不必要的步骤才能完成开发所需的功能。

当我开始接触Clojure时,我也开始寻找框架,但后来意识到这是错误的方法。相反,我发现只需从一个基本的ring应用程序开始,然后按需添加库即可。虽然这可能需要较长的学习曲线,但实际上与使用框架构建应用程序相比同样高效,因为您不需要强制性地学习整个框架,并且可以更好地满足自己的需求。

然而,查看各种框架是非常有用的,因为它可以给我提供如何最好地集成库的想法,更重要的是,在我的看法中,可以帮助我确定如何最好地结构化 lein project.clj 文件以适应自己的工作流程。

我发现以下模板非常有用。虽然我没有直接使用它们,但从许多模板中我获得了一些灵感,并且将这些想法进行过适当的改编和转化以开发最适合我正在开发的应用程序的框架。

  • LuminusLuminus 模板 提供了一个非常广泛的框架。我发现它们对于许多应用程序来说有点“沉重”,但是在集成各种 Clojure 库到您的应用程序中方面提供了一些很好的示例。该网站还有一些有用的文档。

  • Reagent 项目,其中包括一个reagent模板,为使用 Reagent (react.js) ClojureScript 支持的应用程序提供了一个良好的起点。我发现这是构建具有良好 JavaScript 集成的应用程序最简单的 ClojureScript 库之一。

  • Lein-figwheel 是一个非常有趣的模板,使用 figwheel 提供动态加载 ClojureScript 的功能,允许您在修改代码时在浏览器中看到您的 ClojureScript 更改。现在许多其他模板已经将此功能添加到了它们自己的模板中。最初是为 Om 开发的,Luminus 和 Reagent 模板现在也将 Figwheel 功能集成到它们的模板中。真正展示了 Clojure 和 ClojureScript 用于交互式开发的一些好处。

  • Compojure Template 是一个很好的起点。它设置了一个基于 compojure 的非常基本的项目,包括所有基本的 ring 和 compojure 部分。这是开始 Clojure web 开发的绝佳方式,因为它简单,并允许您专注于基础知识而不至于淹没在所有其他选项之下。

  • 还有许多其他模板和框架,其中许多我尚未来得及查看。如今,我通常从 compojure 模板或 reagent 模板开始,然后根据需要添加额外的部分。我通常还会包括 selmar 用于模板,并使用与 Luminus 基本相同的配置。

    也许获得适合您 web 开发的好“框架”的最重要的部分是尝试并理解 lein 的工作方式和 lein project.clj 文件。拥有一个好的 project.clj 文件将决定您的工作流程。具有正确的配置文件、能够以不同方式启动 repl 和加载不同库的能力,这些库允许您启动 figwheel 或浏览器 repl 或生成一个 jar 等,都与您的 project.clj 文件相关。把它搞对了,您的环境就会提供您所需的工作流程。


    2

    尝试使用Road框架进行快速web开发 https://github.com/zhujinxian/road

    (defn render-test [ret tmt]
      (-> (resp/response "------render----test------") 
        (#(resp/content-type %1 "text/plain"))))
    
    (defn foo
      "I don't do a whole lot."
      [x]
      (str "来自源码目录的参数:" x))
    
    (defn handler [^Integer x]
        {:$r render-test :text (str "hello world, road goes sucess!" (foo x))})
    
    (defn home [req content ^Integer num]
        {:hiccup "home.clj" :content (str "home" content) :num num})
    
    (defroad road (GET "/web-test-0.1.0-SNAPSHOT-standalone/main" handler) 
                  (GET "/web-test-0.1.0-SNAPSHOT-standalone/home/:num{\\d+}" home))
    
    (defn -main [& args]
      (log/info "---------log4j test-------")
      (jetty/run-jetty road {:port 3000}))
    

    2
    一位新玩家出现在场景中,作为实现REST服务的良好替代品,它就是liberator。它使得将您的数据公开为资源更加容易,同时自动遵守HTTP规范RFC-2616的所有相关要求,并与http-kit和Compojure协同工作。
    顺便说一下,我对http-kit非常满意,其实时代码重载功能很方便。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接