我想这对于每天使用Java的绝大多数程序员来说是一个奇怪的问题。我不。我知道Java语言,因为我从事过Java项目,但不从事Java世界。我从未使用Java从头开始制作Web应用程序。如果我必须使用Python,Ruby来做,那么我知道要去哪里(Django或Rails),但是如果我想在Clojure中创建Web应用程序,不是因为我被迫生活在Java世界中,而是因为我喜欢这种语言,我想尝试一下,我应该使用哪些库和框架?
我想这对于每天使用Java的绝大多数程序员来说是一个奇怪的问题。我不。我知道Java语言,因为我从事过Java项目,但不从事Java世界。我从未使用Java从头开始制作Web应用程序。如果我必须使用Python,Ruby来做,那么我知道要去哪里(Django或Rails),但是如果我想在Clojure中创建Web应用程序,不是因为我被迫生活在Java世界中,而是因为我喜欢这种语言,我想尝试一下,我应该使用哪些库和框架?
Answers:
到目前为止,我尚未遇到的最好的Clojure Web框架是Compojure:http ://github.com/weavejester/compojure/tree/master
它虽小却功能强大,并且语法优美。(它在后台使用了Jetty,但是除非您愿意,否则它会向您隐藏Servlet API,这种情况很少见)。在该URL上查看README,然后下载快照并开始播放。
Compojure不再是用于开发Web应用程序的完整框架。从0.4版本开始,compojure已分解为多个项目。
Ring通过抽象HTTP请求和响应过程来提供基础。Ring将解析传入的请求并生成一个映射,其中包含请求的所有部分,例如uri,服务器名和请求方法。然后,应用程序将处理请求,并根据请求生成响应。响应表示为包含以下键的映射:状态,标头和正文。因此,一个简单的应用程序将如下所示:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Ring的另一部分是中间件的概念。这是位于处理程序与传入请求和/或传出响应之间的代码。一些内置的中间件包括会话和stacktrace。会话中间件将在请求映射中添加: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设置为该值。
最后一个组件是打ic,它使生成html更容易。各种html标签用矢量表示,第一个元素代表标签名称,其余元素代表标签的主体。"<h2>A header</h2>"
成为[:h2 "A Header"]
。标签的属性在可选映射中。"<a href='/login'>Log In Page</a>"
成为[:a {:href "/login"} "Log In Page"]
。这是一个使用模板生成html的小示例。
(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 Web框架(因此还没有新的文档)。来自Django / Rails,我研究了简单明了的语法,它非常精简。
考虑Luminus Web框架。我没有从属关系,但听到了我尊敬的朋友的好消息。
我当前的转到网络图书馆现在是yada。
如果您只是刚入门,则入门服务器为Compojure
。我将其视为apache
Clojure世界中的Web服务器(在这种情况下,yada / aleph将为nginx)。您可以Luminus
用作模板。它有多种变体,例如compojure-api
。
我尝试了ou,Pedestal
并对此感到满意。我并没有声称要掌握它,但是它具有令人愉悦的语法,感觉非常内聚,并且看起来确实具有出色的性能。它还得到了Cognitect
Rich Richickey工作的Clojure / Datomic公司的支持。
我发现Aleph
提出了一个有趣的抽象,并且内置的反压似乎很有趣。我还没有玩过它,但是它肯定在我的清单上。
在使用各种Web服务器后,这是我的快速Pro / Cons列表:
简短的答案:看看Luminus可以快速入门,也许随着您的需求发展而转向其他东西(也许是Yada)。
优点(1):
缺点(2):
优点(3):
缺点(4):
专业版(3):
缺点(1):
专业版(3):
缺点(1):
专业版(2):
缺点(2):
注意:我没有玩过它,主要是因为缺少文档。它看起来很有趣,而且性能很高。
优点(2):
缺点(1):
注意:我还没有玩过。
优点:
缺点:
注意:尽管文档看起来很棒,但我还没有玩过它。我可能接下来要尝试。有一些聊天项目示例看起来很有趣,它们大量使用协议使我刚开始时是Clojure开发新手。
优点(6):
缺点(2):
注意:如果原始性能至关重要,则可以使用Clojure Web服务器的基准测试。
免责声明:我是作者。
我整理了一个结合了luminusweb和栗子模板的leiningen模板。因此,您可以获得可以用来构建clojure代码以及用于前端和后端的clojurescript代码的东西。
此外,它还提供用户管理以及一些简单的CRUD生成以及一些更小的优点:https : //github.com/sveri/closp
我还将为Duct投两分钱,同样来自Compojure and Ring的维护者@weavejester。
它的核心是将Component和Ring路由器放在一个屋顶下。我使用风管的原因:
主要特点:
注意:不用说,但是对于Web开发新手来说,像大多数Clojurey一样,Duct要求Duct扎实地掌握Clojure语言。我还建议您先阅读有关组件的信息。
另外,我已经在多个生产应用程序中使用Duct一年多了,对此我感到非常高兴。
Arachne是一个新手Web框架。引用网站的描述:
Arachne是Clojure的完整,高度模块化的Web开发框架。它强调易用性,简单性和可靠的可扩展设计。
它有一个 kickstarter活动, 声称提供与Rails类似的“入门”体验。它是由一个认知者开发的。
下面是与Luminus公司(yogthos)的作者关于它的良好的讨论。