Clojure 有一些 Web 框架
还有一些用于处理某些 Web 开发子任务的库,例如
- 为模板而活
- 打嗝模板
- 使用请求/响应处理较低级别的东西
- 用于持久性的ClojureQL(虽然它似乎不是很活跃)
还有数百个 Java 库可供使用。有些方面已经在这里讨论过,其中两个进行了比较。
我想知道这些框架/组件在成熟度、范围、易于开发、Django/RoR 感觉等方面的比较。
当我第一次开始 Web 开发时,是使用 Clojure。我以前完全没有Web 开发经验。在我的一生中,我无法弄清楚 Compojure。我不知道从那时起(不是很久以前)初学者文档是否得到了改进,但当时我无法管理它。一位朋友向我指出 Mustache,在阅读了自述文件后,我能够将http://try-clojure.org的当前状态拼凑在一起。所以,就易用性而言,我认为 Mustache 为我准备了蛋糕。
但是,如果当时存在这种情况,我可能会唱不同的曲子。
Conjure 看起来很酷,虽然与其他框架非常不同。鉴于我在一般 Web 开发方面的经验非常有限,我在这件事上没有太多发言权,但 Conjure 对我来说有点不合时宜。就是感觉不对。可能只是我不习惯它做事的方式。
更新:我写这篇文章已经有一段时间了。很多事情都变了。不再使用 Mustache 的人不多,而且它也没有得到真正的积极维护,尽管它已经足够完整(并且足够简单),它可能仍然可以工作,我现在建议使用 Compojure 或 Noir。这两个都是当前维护的框架,并且都在他们的工作中表现出色。
更新 2:Noir 已经被弃用了很长一段时间,它的大部分功能都转移到了一个库,该库设计用于从 compojure/其他基于环的 web 框架中使用,称为lib-noir。
我知道这个问题有点过时了......但我忍不住建议Noir作为一个非常好的选择。
Noir 使用 Ring、Compojure 和 Hiccup 的组合来完成工作。看看这个!
从框架的角度思考可能是一个错误。更好的方法是考虑您组合在一起的库组件,以便拥有最适合您要求的“框架”。
我过去使用过许多框架。他们中的大多数在让您快速启动并运行基本应用程序方面做得相当不错。但是,无一例外,我发现他们所有人都经常感到沮丧。通常是因为样板文件太多,或者只需要跳过与您开发的应用程序无关的障碍。
刚开始使用 Clojure 时,我开始寻找框架,但后来意识到这是错误的方法。相反,我发现从一个基本的环应用程序开始,然后根据需要添加库要好得多。开始时这似乎是一个更大的学习曲线,但实际上它同样有效,因为您不必被迫学习您通常不需要的一大堆框架脚手架。
但是,我发现查看各种框架非常有用,因为它让我了解如何最好地集成库,更重要的是 IMO,如何最好地构建 lein project.clj 文件以最适合您想要的工作流程。
我发现以下模板非常有用。我没有“按原样”使用它们中的任何一个,而是从其中许多人那里改编/窃取了想法,以开发最适合我正在开发的应用程序的框架
Luminus和Luminus 模板提供了一个非常广泛的框架。我发现它们对于许多应用程序来说有点“重”,但是有一些很好的例子说明了如何将各种 Clojure 库集成到您的应用程序中。主网站也有一些有用的文档。
包含试剂模板的Reagent Project为使用 Reagent (react.js) ClojureScript 支持的应用程序提供了良好的起点。我发现这是创建具有良好 Javascript 集成的应用程序的最简单的 ClojureScript 库之一。
lein-figwheel是一个非常有趣的模板,它使用 figwheel 提供 clojurescript 的动态加载,以便您在修改代码时在浏览器中看到 ClojureScript 的变化。许多其他模板现在已将此功能添加到他们自己的模板中。Luminus 和 Reagent 模板最初是在考虑 Om 的情况下开发的,现在也在其模板中集成了 Figwheel 功能。真正展示了 Clojure 和 ClojureScript 对交互式开发的一些好处。
Compojure 模板是一个很好的起点。它建立了一个非常基本的基于组合的项目,其中包含所有基本的环和组合的东西。开始 Clojure Web 开发的好方法,因为它很简单,并且允许您在淹没于所有其他选项之前专注于基础知识。
还有许多其他模板和框架,其中许多我还没有时间查看。这些天来,我经常从复合模板或试剂模板开始,然后在需要时添加额外的位。我通常还包括模板的 selmar 并使用与 Luminus 使用的基本相同的配置。
为您的 Web 开发获得一个好的“框架”也许最重要的部分是试验和理解 lein 的工作原理和 lein project.clj 文件。拥有一个好的 project.clj 文件将决定您的工作流程。拥有正确的配置文件,能够以不同的方式启动 repl 并加载不同的库,这些库允许您启动 figwheel 或浏览器 repl 或生成 jar 等,这一切都与您的 project.clj 文件有关。做到这一点,您的环境将提供您需要的工作流程。
作为实现 REST 服务的一个很好的替代方案,出现在场景中的新玩家是liberator。它可以更轻松地将数据作为资源公开,同时自动遵守 HTTP 规范RFC-2616的所有相关要求,并与http-kit和 Compojure很好地配合使用。
顺便说一句,对 http-kit 非常满意,实时代码重新加载功能很方便。
尝试快速 web 开发的 road 框架 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}))