你如何在Clojure中创build一个Web应用程序?

我想这对于每天在Java中工作的绝大多数程序员来说是一个奇怪的问题。 我不。 我知道Java语言,因为我从事Java项目,但不是Java世界。 我从来没有从头开始在Java中的Web应用程序。 如果我必须用Python做,Ruby,我知道去哪里(Django或Rails),但是如果我想在Clojure中创build一个Web应用程序,不是因为我被迫生活在Java世界,而是因为我像语言,我想试试看,我应该使用什么库和框架?

到目前为止,我所遇到的最好的Clojure Web框架是Compojure: http ://github.com/weavejester/compojure/tree/master

它小而强大,语法优美。 (它使用引擎盖下的Jetty,但它隐藏了你的Servlet API,除非你想要它,这是不经常的)。 查看该URL处的README,然后下载快照并开始播放。

Compojure不再是开发Web应用程序的完整框架。 从0.4发布以来,组合已经被分解成几个项目。

Ring通过抽象出HTTP请求和响应过程来提供基础。 Ring将parsing传入的请求并生成包含请求的所有部分的映射,例如uri,server-name和request-method。 然后应用程序将处理请求并根据请求生成响应。 响应表示为包含以下键的映射:状态,标题和正文。 所以一个简单的应用程序看起来像:

(def app [req] (if (= "/home" (:uri req)) {:status 200 :body "<h3>Welcome Home</h3>"} {:status 200 :body "<a href='/home'>Go Home!</a>"})) 

Ring的另一部分是中间件的概念。 这是位于处理程序和传入请求和/或传出响应之间的代码。 一些内置的中间件包括会话和堆栈跟踪。 会话中间件会为请求映射添加一个:会话密钥,该映射包含发出请求的用户的所有会话信息。 如果会话密钥存在于响应映射中,它将被存储用于当前用户的下一个请求。 虽然堆栈跟踪中间件将捕获处理请求时发生的任何exception,并生成堆栈跟踪,如果发生任何exception,则会发回作为响应的堆栈跟踪。

直接和Ring一起工作可能很乏味,所以Compojure是在Ring的基础上构build的。 现在应用程序可以用路由来表示,所以你可以像这样:

 (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设置为该值。

最后一个组件是Hiccup ,它使生成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文档

还有一个“Noir”( http://www.webnoir.org/ ),这是一个新的Clojurenetworking框架(新的文档还没有出现)。 来自Django / Rails,我挖掘简单,直接的语法,而且非常精简。

考虑Luminus web框架 。 我没有从属关系,但是从我尊重的朋友那里听到了好的东西。

我目前的网页库现在是亚达 。

如果你刚刚开始,介绍性的服务器是Compojure 。 我认为它是Clojure世界中的web服务器的apache (在这种情况下yada / aleph将是nginx)。 你可以使用Luminus作为模板。 有它的变种,比如compojure-api

我试过Pedestal并在全球范围内感到满意。 我不认为掌握它,但它有一个愉快的语法,感觉非常有凝聚力,看起来它有很好的performance。 它也由Cognitect (Rich Hickey工作的Clojure / Datomic公司)提供支持。

我发现Aleph提出了一个有趣的抽象,内置背压看起来很有趣。 我还没有玩,但它绝对在我的名单上。

玩过各种networking服务器后,这里是我的快速Pro / Cons列表:

简短的回答:看看Luminus快速入门,也许随着你的需求的发展,继续进行其他的事情(亚达也许)。

的Compojure

  • 优点(1):

    • 容易,很多模板/例子(例如夜光)
  • 缺点(2):

    • 不是高性能的(每个请求一个线程),期望性能稍好于轨道
    • 不简单,中间件模型不方便

  • 优点(3):

    • 拦截器模型,令人愉快的语法将拦截器添加到路由的子集
    • 高性能路由器
    • 支持json / transit / multipart表单,不需要任何东西。 很酷 !
  • 缺点(4):

    • 没有websocket支持(还),返回core.async频道将是很好的
    • 如果把它放在一个Stuart Sierra的组件中(我认为你应该使用重载拦截器)
    • 没有asynchronous拦截器的testing工具
    • 需要买入(?)

阿列夫

Pro(3):

  • 高性能
  • 背压
  • Websocket / SSE在返回歧pipestream时支持

缺点(1):

  • 低级别,做自己的风格(即它只是让你的方法,使你的处理程序做一些事情,没有路由器,没有什么)。 不是一个真正的缺点,只是要意识到这一点。

亚达

Pro(3):

  • build立在Aleph上
  • 内容谈判
  • 大举集成
  • 比迪是相当好的(虽然我更喜欢基座路由器语法)

缺点(1):

  • 文档(虽然不像nginx-clojure那样糟糕,快速提高)。

HttpKit

Pro(2):

  • 写在Clojure! (和Java …)
  • 性能看起来不错(见600K并发连接post)

缺点(2):

  • 没有CORS的支持
  • 错误? 另外,不是最近的许多提交

Nginx的-的Clojure

注:我没有玩过,主要是因为缺乏文档。 它看起来很有趣,而且非常高效。

优点(2):

  • Nginx(高性能,卸载ssl,重新启动worker …)
  • 这个模型可以允许零停机更新吗? 那太棒了!

缺点(1):

  • 文档(改进)。 另外,如果这是唯一的方法,我不想用embedded在nginxconfiguration文件中的string进行编程。
  • 可能会有点复杂一点的第一个部署(?)

Immutant

注:我没有玩过它。

优点:

  • 集成(caching,消息传递,调度,蜻蜓部署)

缺点:

  • 没有http客户端

Catacumba公园

注:我没有玩过,虽然文件看起来很好。 我可能会尝试下一步。 有一些聊天项目看起来很有趣,他们大量的使用协议让我开始作为Clojure新手。

优点(6):

  • 文档! 像所有funcool项目一样,文档阅读起来非常愉快。
  • 基座式路由语法
  • 应该是高性能的(在Ratpack之上)
  • 背压
  • websockets,sse,cors,security,ssl …
  • 挖掘的独特function:邮政

缺点(2):

  • 不完全确定ct / routes语法是多么令人愉快,并且关于放弃Ring规范(据说是为asynchronous的故事,但我认为基座的人修复)
  • 不知道如何整合招摇等
  • 当我尝试的时候,我无法马上完成工作

注意 : Clojure Web服务器的基准是可用的,如果原始性能是重要的。

这几天Pedestal是一个值得一看的框架。 这是一个构build在Ring之上的服务器端框架,而且通过能够暂停和恢复该特定请求(否则缓慢的请求实际上阻止了该serverthread),从而释放来自初始线程的传入请求。 也许有点像JavaBean。

其他很酷的框架是hoplon.io和David Nolen的Om (基于React)

Webjure ,一个Clojure的Web编程框架。

特点:调度servlet调用Clojure函数。 dynamicHTML生成。 SQL查询接口(通过JDBC)。

这个答案是作为Webjure信息的占位符。

Compojure是我用来创build一个小博客应用程序。 它是以Sinatra为蓝本的,这是一个最小,轻量级的Ruby框架。 我主要是使用路由,就像Sinatra的路由。 看起来像:

 (GET "/post/:id/:slug" (some-function-that-returns-html :id :slug)) 

没有ORM或模板库,但它具有将vector转换为HTML的function。

你也可以看看这些框架(来自disclojure / projects ):

  • 级联
  • 变戏法

还有一个关于堆栈溢出的相关问题: 成熟的Clojure Web框架?

免责声明:我是作者。

我把一个结合了luminusweb和栗子模板的leiningen模板放在一起。 所以你得到一些你可以构buildclojure代码和clojurescript代码的前端和后端。
此外,它提供了用户pipe理加上一些简单的CRUD生成和一些更好的拥有: https : //github.com/sveri/closp

你也可以尝试Clojure上的线圈, http : //github.com/zubairq/coils – 免责声明:我是作者

另一个有趣的networking服务器是Http-kit 。 它具有良好的性能,符合环形要求,并支持WebSocket。 它主要由clojure构成,在Jetty / Tomcat中缺less一些奇怪的东西。

很容易修补。

我还会从Compujure和Ring的维护者@weavejester那里投入我的两分钱。

它的核心是将Component和Ring路由器集中到一个屋檐下。 我使用导pipe的原因:

  • 优秀的哲学基础:它鼓励您将您的应用程序构build为一系列小型组件,并且在提供理智的默认设置的同时,在保留less量意见之间取得了良好的平衡。
  • 稳定的path:我自言自语,但多年来,我感觉到Clojure社区已经提出了一个接一个的不可信的Web框架。 一对夫妇只是觉得太“实验性”(我不是经验丰富),而是实验性的(我和Om和客户端Pedestal的经验)。 另一方面,我觉得@韦伯斯特带来了同样的稳定性和实际的进步,他在Compojure和Ring上做了很多,他们在社区中的performance非常出色。
  • 这是超级轻量级的,而且不在我的组件之中。

主要特点:

  • 通过“端点”来组织路线,小组件可以被认为是迷你networking服务器(或者HTTP路由的小截面)。
  • 即装即用的支持重新加载的工作stream程 。
  • 与Ring和Compojure完美整合。
  • 开发和生产configuration(我发现在其他地方显着失踪)。
  • 用例子很好的文档。

注意:不言而喻,但为了网页开发新人的利益,就像大多数Clojurey的事情一样,Duct需要牢固掌握Clojure的语言。 我也build议先阅读关于Component的内容。

另一个个人说明,我已经在一些生产应用中使用风pipe已经有一年多的时间了,我对此非常满意。

重构和om.next可能是你在找什么。

Arachne是一个新的Web框架。 引用网站的描述:

Arachne是一个完整的,高度模块化的Clojure Web开发框架。 它强调易用性,简单性和可靠的可扩展devise。

它有一个kickstarter活动,声称提供类似于Rails的“入门”体验。 它由Cognitect开发。

这里和Luminus(yogthos)的作者有一个很好的讨论。

我已经在生产中成功地使用了解放者一段时间了。 如果你仅仅想要那些枯燥的骨头,例如,如果你正在构build一个REST风格的Web服务或类似的东西,那么这是一个很好的框架。 这本质上是一个环和组合的包装,并提供了一个决定图时validation传入的请求。 与其他更笨重的网页框架相比,它的速度也非常快。 如果你想从某个地方快速地开始,然后慢慢build立起来,Liberator是个不错的select。