对于每天都在使用Java的绝大多数程序员来说,我想这可能是一个奇怪的问题。但我并不是那样。虽然我接触过Java语言并参与过Java项目,但并不熟悉Java技术栈。我从未使用Java从头开始构建Web应用程序。如果我需要使用Python或Ruby来构建Web应用程序,我会选择Django或Rails这样的框架,但如果我想使用Clojure构建Web应用程序,不是因为我被迫生活在Java世界中,而是因为我喜欢这门语言,想尝试一下,那我该使用哪些库和框架呢?
对于每天都在使用Java的绝大多数程序员来说,我想这可能是一个奇怪的问题。但我并不是那样。虽然我接触过Java语言并参与过Java项目,但并不熟悉Java技术栈。我从未使用Java从头开始构建Web应用程序。如果我需要使用Python或Ruby来构建Web应用程序,我会选择Django或Rails这样的框架,但如果我想使用Clojure构建Web应用程序,不是因为我被迫生活在Java世界中,而是因为我喜欢这门语言,想尝试一下,那我该使用哪些库和框架呢?
Compojure不再是一个完整的用于开发web应用程序的框架。自从0.4版本发布以来,compojure已经被拆分成了几个项目。
Ring提供了基础功能,将HTTP请求和响应过程抽象化。Ring会解析传入的请求并生成包含请求中所有部分(例如uri、server-name和request-method)的映射。然后应用程序将处理该请求并根据请求生成响应。响应表示为包含以下键的映射:状态(status)、标头(headers)和正文(body)。因此,一个简单的应用程序看起来像:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Ring的另一个部分是中间件的概念。这是介于处理程序和传入请求/传出响应之间的代码。一些内置的中间件包括sessions和stacktrace。 session中间件将向请求映射中添加一个:session键,其中包含发出请求的用户的所有会话信息。 如果响应映射中存在 :session键,则会将其存储为当前用户的下一个请求。 而堆栈跟踪中间件将捕获在处理请求时发生的任何异常,并生成一个堆栈跟踪作为响应发送回来,如果确实发生了任何异常。
直接使用Ring进行工作可能很繁琐,因此Compojure是建立在Ring之上的,抽象掉了细节。现在可以通过路由来表达应用程序,所以您可以像这样:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure仍然使用请求/响应映射,因此如果需要,您始终可以访问它们:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
在这种情况下,{uri :uri} 部分访问请求映射中的 :uri 键,将 uri 设置为该值。(defn layout [title & body]
(html
[:head [:title title]]
[:body [:h1.header title] body]))
(defn say-hello [name]
(layout "Welcome Page" [:h3 (str "Hello " name)]))
(defn hiccup-routes
(GET "/user/:name" [name] (say-hello name)))
这里有一个链接,指向compojure的作者正在编写的一份文档,可能会对您有所帮助: Compojure Doc
还有一个名叫"Noir"的框架(http://www.webnoir.org/),这是一个新的Clojure网络应用框架(文档目前还不存在)。作为一个Django/Rails用户,我很喜欢它简单,直接的语法,而且非常轻盈。
我的首选Web库现在是yada。
如果你刚开始,可以使用Compojure
作为入门服务器。我认为它在Clojure世界中就像是Web服务器的Apache
(那么yada / aleph将是nginx)。你可以使用Luminus
作为模板。还有它的变种,比如compojure-api
。
我尝试了Pedestal
,并对它感到非常满意。我不敢说我掌握了它,但它的语法很舒适,感觉非常协调,并且看起来确实具有出色的性能。它也由Cognitect
支持(Rich Hickey工作的Clojure / Datomic公司)。
我发现Aleph
提供了一个有趣的抽象概念,并且内置的背压机制似乎非常有趣。我还没有试过它,但它肯定在我的列表上。
尝试了各种Web服务器后,这是我的快速优缺点列表:
简短地说:快速入门可以看看Luminus,随着需求的变化可以转向其他东西(也许是Yada)。
利:
弊:
优点(3):
缺点(4):
优点(3):
缺点(1):
优点(3):
缺点(1):
优点(2):
缺点(2):
注:我没有尝试过它,主要是因为缺少文档。但它看起来非常有趣,而且性能很好。
优点(2):
缺点(1):
注:我没有尝试过它。
优点:
缺点:
注:我没有尝试过它,尽管文档看起来很好。我可能会尝试下一个。有一些有趣的示例聊天项目,它们对协议的大量使用起初让我作为一个新手Clojure开发者望而却步。
优点(6):
缺点(2):
注意: 如果只关注原始性能,可用Clojure Web服务器基准测试结果。
Webjure 是一个针对Clojure的web编程框架。
特点:将servlet调用指向Clojure函数。 动态生成HTML。 SQL查询接口(通过JDBC实现)。
此答案旨在为 Webjure 提供信息的占位符。
我使用Compojure构建了一个小型博客应用程序。它的模型基于Sinatra,这是一个轻量级的Ruby Web框架。我主要使用了路由功能,这与Sinatra非常相似。代码如下:
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
虽然没有ORM或模板库,但它确实有将向量转换为HTML的函数。
免责声明:我是作者。
我制作了一个leiningen模板,结合了luminusweb和chestnut模板。
这样你就可以构建clojure代码和前后端的clojurescript代码。
此外,它还提供了用户管理以及一些简单的CRUD生成和更多小的实用功能:https://github.com/sveri/closp