我开始学习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框架中使用。
我知道这个问题有点过时了...但我还是不能不建议使用 Noir,作为一个非常好的选择。
Noir使用Ring、Compojure和Hiccup的组合来完成工作。快去看看吧!
从框架的角度去考虑可能是一个错误的做法。更好的方法是考虑使用库组件,将它们组合在一起以得到最适合您需求的“框架”。
我过去使用过许多框架。大多数都能够快速为你创建一个基本的应用程序,但毫无例外的是,我发现它们往往会令人沮丧。通常是由于太多的样板文件或者需要进行不必要的步骤才能完成开发所需的功能。
当我开始接触Clojure时,我也开始寻找框架,但后来意识到这是错误的方法。相反,我发现只需从一个基本的ring应用程序开始,然后按需添加库即可。虽然这可能需要较长的学习曲线,但实际上与使用框架构建应用程序相比同样高效,因为您不需要强制性地学习整个框架,并且可以更好地满足自己的需求。
然而,查看各种框架是非常有用的,因为它可以给我提供如何最好地集成库的想法,更重要的是,在我的看法中,可以帮助我确定如何最好地结构化 lein project.clj 文件以适应自己的工作流程。
我发现以下模板非常有用。虽然我没有直接使用它们,但从许多模板中我获得了一些灵感,并且将这些想法进行过适当的改编和转化以开发最适合我正在开发的应用程序的框架。
Luminus 和 Luminus 模板 提供了一个非常广泛的框架。我发现它们对于许多应用程序来说有点“沉重”,但是在集成各种 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 文件相关。把它搞对了,您的环境就会提供您所需的工作流程。
尝试使用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}))