时间:2010-07-24 12:13:38

标签: frameworks clojure comparison web-frameworks

6 个答案:

答案 0 :(得分:41)

答案 1 :(得分:21)

我知道这个问题有点陈旧......但我忍不住建议Noir作为一个非常好的选择。

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

答案 2 :(得分:11)

正如Bjorn Lindqvist的评论above中提到的, Noir已经死了。详情here

相反,请考虑使用Compojurelib-noir

答案 3 :(得分:10)

从框架角度思考可能是一个错误。更好的方法是根据您组合的库组件进行思考,以获得最适合您要求的“框架”。

我过去曾使用过很多框架。他们中的大多数人都非常出色地完成了基本应用程序的运行。然而,毫无例外,我发现所有这些都经常变得令人沮丧。通常是由于太多的样板或只是必须跳过与您正在开发的应用无关的箍。

第一次来到Clojure时,我开始寻找框架,但后来意识到这是错误的方法。相反,我发现从一个基本的环形应用程序开始然后在我需要它们时添加库会好得多。这看起来似乎是一个更大的学习曲线,但实际上事实证明它同样有效,因为你没有被迫学习一堆你通常不需要的框架脚手架。

但是,我发现查看各种框架非常有用,因为它给了我如何最好地集成库的想法,更重要的是IMO,如何最好地构建lein project.clj文件,以最好地适应您想要的工作流程。

我发现以下模板非常有用。我并没有“按原样”使用它们,而是调整了许多其他人的想法来开发最适合我正在使用的应用程序的框架

  • LuminusLuminus templates提供了一个非常广泛的框架。我发现它们对于许多应用程序来说有点“沉重”,但是有一些很好的例子可以说明如何将各种Clojure库集成到您的应用程序中。主网站也有一些有用的文档。

  • Reagent Project,其中包含试剂模板,为使用Reagent(react.js)ClojureScript支持的应用提供了良好的起点。我发现这是创建具有良好Javascript集成的应用程序的最简单的ClojureScript库之一。

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

  • Compojure Template是一个很好的起点。它建立了一个非常基本的基于组件的项目,包含所有基本的环和组件。开始使用Clojure Web开发的好方法,因为它很简单,并且允许您在淹没所有其他选项之前专注于基础知识。

还有许多其他模板和框架,其中许多我尚未有时间查看。这些天,我经常从compojure模板或试剂模板开始,然后在需要时添加额外的位。我通常还包括用于模板的selmar,并使用与Luminus基本相同的配置。

为Web开发获取一个好的“框架”的最重要的部分可能是试验和理解lein如何工作以及lein project.clj文件。拥有一个好的project.clj文件将决定您的工作流程。拥有正确的配置文件,能够以不同的方式启动repl并加载不同的库,这些库允许您启动figwheel或浏览器repl或生成jar等,这些都与您的project.clj文件有关。做到这一点,您的环境将提供您所需的工作流程。

答案 4 :(得分:2)

一个新的玩家出现在场景中,作为实现REST服务的一个很好的选择是liberator。它可以更轻松地将您的数据作为资源公开,同时自动遵守HTTP规范RFC-2616的所有相关要求,并与http-kit和Compojure很好地配合使用。

非常高兴使用http-kit btw,实时代码重新加载功能非常方便。

答案 5 :(得分:2)

尝试快速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}))