您如何在Clojure中制作Web应用程序?[关闭]


216

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


1
我想知道您是否要使用Java本机API或Clojure本机API?
安德·特纳

安德(Ande):我真的不确定,因为我在这方面对Java世界了解得很少(但是我已经在使用Java这种语言了一段时间了)。
2008年

我认为,如果这个问题最后列出一个Clojure Web框架列表,每个答案一个,并且任何人都可以投票选出自己喜欢的框架,那就太好了。我认为Meredydd的回答绝对是Compojure的回答。我将为Webjure添加一个,并且进行比较会很好。
2008年

up!我来到这里搜索“使用clojure的Web应用程序”。此页面是Google的第一个结果。
塞巴斯蒂安·格里尼亚利

Answers:


104

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

它虽小却功能强大,并且语法优美。(它在后台使用了Jetty,但是除非您愿意,否则它会向您隐藏Servlet API,这种情况很少见)。在该URL上查看README,然后下载快照并开始播放。


16
理查德的评论对这个答案有用吗?我不明白
John Cromartie 2010年

26
@Richard您的论点很愚蠢。是的,如果您决定使用Java库,那么在很多情况下您就放弃了功能。但是,这些库的要点是,您不必再做一次。例如,Ring是围绕servlet的Clojury包装器,因此您不必直接使用servlet。您是否会建议我们从头开始重新发明Web开发轮子,而不是使Clojure能够完美地使用完美的Java工具?逻辑在哪里。此外,使用这些库的选择有什么不好呢?...
雷恩

15
@Richard您的整个论点都暗示着,非功能性非Clojure代码本质上是非常糟糕的,以至于隐藏在库中的代码甚至都是污染。我不明白这个理由。许多Java库都是有用且功能强大的代码段。当我们可以简单地提供自己的包装库,从而可以从Clojure优雅地,功能地使用它们时,为什么要彻底重写它们呢?
雷恩

10
@Richard,请随时制作一个纯Clojure的http服务器。
gtrak

5
用Lisp / Clojure术语来说,功能没有副作用。(请参见gigamonkeys.com/book/…)。但是,正如《 Lisp之地》(landoflisp.com/trade_func.png)中指出的那样,纯功能性程序通常不是很有用,因为副作用对于实际操作是必不可少的,例如写数据库记录,下载文件,发布到数据库等。 REST服务器,生成图像等...
lfalin 2014年

179

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


48

还有一个“ Noir”(http://www.webnoir.org/),它是一个新的Clojure Web框架(因此还没有新的文档)。来自Django / Rails,我研究了简单明了的语法,它非常精简。


Webnoir实际上非常有用!入门非常容易-实际上,您可以像开发PHP一样进行一些开发-只需启动服务器(这次使用leiningen),编辑文件并重新加载浏览器即可查看。
claj 2011年

由于@elithrar已回答,因此Noir现在拥有可用的文档:webnoir.org/docs
Alistair Collins

18
只是为了记录在案,似乎辄已被弃用,不再维持....
SolarBear


20

我当前的转到网络图书馆现在是yada

如果您只是刚入门,则入门服务器为Compojure。我将其视为apacheClojure世界中的Web服务器(在这种情况下,yada / aleph将为nginx)。您可以Luminus用作模板。它有多种变体,例如compojure-api

我尝试了ou,Pedestal并对此感到满意。我并没有声称要掌握它,但是它具有令人愉悦的语法,感觉非常内聚,并且看起来确实具有出色的性能。它还得到了CognitectRich Richickey工作的Clojure / Datomic公司的支持。

我发现Aleph提出了一个有趣的抽象,并且内置的反压似乎很有趣。我还没有玩过它,但是它肯定在我的清单上。

在使用各种Web服务器后,这是我的快速Pro / Cons列表:

简短的答案:看看Luminus可以快速入门,也许随着您的需求发展而转向其他东西(也许是Yada)。

杂项

  • 优点(1):

    • 简单,很多模板/示例(例如Luminous)
  • 缺点(2):

    • 性能不佳(每个请求一个线程),期望性能比Rails稍好
    • 不简单,中间件模型带来不便

  • 优点(3):

    • 拦截器模型,令人愉快的语法,可将拦截器添加到路由的子集中
    • 性能路由器
    • 开箱即用地透明支持json / transit / multipart表单,而无需提出任何要求。很酷 !
  • 缺点(4):

    • 还没有websocket支持,返回core.async通道会很好
    • 如果将其放入Stuart Sierra的组件中,则重新加载会有点慢(我认为您应该使用重新加载拦截器)
    • 没有异步拦截器的测试工具
    • 需要买入(?)

阿列夫

专业版(3):

  • 表演者
  • 背压
  • 返回多路流时的Websocket / SSE支持

缺点(1):

  • 低级,按自己的风格做(即,它只是给您一种使处理程序执行某项操作的方式。没有路由器,什么也没有)。并不是一个真正的缺点,只是要意识到这一点。

矢田

专业版(3):

  • 建立在Aleph上
  • 内容协商
  • 昂首阔步的整合
  • bidi还可以(尽管我更喜欢基座路由器语法)

缺点(1):

  • 文档(尽管不如nginx-clojure差,但仍在迅速改进)。

HttpKit

专业版(2):

  • 用Clojure写!(和Java ...)
  • 性能看起来不错(请参见600K并发连接数)

缺点(2):

  • 没有CORS支持
  • 虫子?另外,最近的提交也不多

Nginx-Clojure

注意:我没有玩过它,主要是因为缺少文档。它看起来很有趣,而且性能很高。

优点(2):

  • Nginx(性能,卸载SSL,重新启动工作程序...)
  • 该模型可以允许零停机时间更新吗?那太棒了!

缺点(1):

  • 文档(改进)。另外,如果这是唯一的方法,我也不想用嵌入在nginx配置文件中的字符串进行编程。
  • 第一次部署可能会有些复杂(?)

不变的

注意:我还没有玩过。

优点:

  • 集成(缓存,消息传递,计划,wildfly部署)

缺点:

  • 没有HTTP客户端

卡塔昆巴

注意:尽管文档看起来很棒,但我还没有玩过它。我可能接下来要尝试。有一些聊天项目示例看起来很有趣,它们大量使用协议使我刚开始时是Clojure开发新手。

优点(6):

  • 文档!像所有funcool项目一样,该文档非常易于阅读。
  • 类似基座的路由语法
  • 应该表现出色(在Ratpack之上)
  • 背压
  • websockets,sse,cors,security,ssl ...
  • 独特的功能:邮政

缺点(2):

  • 不确定ct / routes语法的舒适程度如何,以及是否放弃Ring规范(可能是异步故事,但我认为是基座专家可以解决此问题)
  • 不知道如何整合招摇等。
  • 当我尝试它时,我无法使其立即工作

注意:如果原始性能至关重要,则可以使用Clojure Web服务器基准测试


很棒的比较。不确定nginx隐喻如何工作:)
matanster

1
@matanster我认为apache是​​许多组织的默认默认服务器。简单,适用于许多人。但是它也比nginx老,并且使用不同的内部模型。当Yada异步时,Compojure是同步的(可能会更改)。我没有提到的Yada的另一个好处是,一切都是数据,因此与Compojure中的宏相比,编写/转换/检查/生成要容易得多。
nha

14

这些天基座是一个框架值得一看。这是一个在Ring之上构建的服务器端框架,但通过能够暂停和恢复该特定请求(否则,较慢的请求实际上会阻塞该服务器线程),还将传入请求从初始线程中释放出来。也许有点像JavaBean。

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


11

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

功能:调度Servlet调用Clojure函数。动态HTML生成。SQL查询接口(通过JDBC)。

此答案旨在作为Webjure信息的占位符。


3
我也不确定这是否是一个很好的例子。虽然代码库似乎很浅(不错),但是用Java编写的代码足够多,似乎似乎错过了这个标记。我本来希望有一个纯Clojure框架。
理查德

8

Compojure是我用来构建小型博客应用程序的工具。它以Sinatra为模型,Sinatra是用于Ruby的最小,轻量级的Web框架。我主要只是使用路由,就像Sinatra一样。看起来像:

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

没有ORM或模板库,但是它确实具有将向量转换为HTML的功能。



3

免责声明:我是作者。

我整理了一个结合了luminusweb和栗子模板的leiningen模板。因此,您可以获得可以用来构建clojure代码以及用于前端和后端的clojurescript代码的东西。
此外,它还提供用户管理以及一些简单的CRUD生成以及一些更小的优点:https : //github.com/sveri/closp


3

我还将为Duct投两分钱,同样来自Compojure and Ring的维护者@weavejester

它的核心是将Component和Ring路由器放在一个屋顶下。我使用风管的原因:

  • 出色的哲学基础:它鼓励您将应用程序构建为一系列小组件,并在保持少数意见与提供合理的默认值之间取得良好的平衡。
  • 稳定的道路:我为自己说话,但是多年来,我感到Clojure社区提出了一个不那么可信的Web框架。一对夫妇只是觉得太实验性(我在Om和客户端Pedestal上的经验)无法“完成工作”(并不是说他们不会在将来证明自己更出色)。另一方面,我觉得@weavejester给Duct带来了与他为Compojure和Ring所做的相同的稳定性和可衡量的进度,后者在社区中非常出色。
  • 它是轻量级的,不会影响我的组件。

主要特点:

  • 通过“端点”来组织路由,这些端点可以看作是小型Web服务器(或者HTTP路由的小横截面)。
  • Reloaded Workflow的开箱即用的支持。
  • 与Ring和Compojure完美集成。
  • 开发和生产配置(我发现其他地方明显缺少的东西)。
  • 带有示例的良好文档。

注意:不用说,但是对于Web开发新手来说,像大多数Clojurey一样,Duct要求Duct扎实地掌握Clojure语言。我还建议您先阅读有关组件的信息。

另外,我已经在多个生产应用程序中使用Duct一年多了,对此我感到非常高兴。


2

您还可以尝试在线圈上使用Clojure,http://github.com/zubairq/coils-免责声明:我是作者


2

另一个有趣的Web服务器是Http-kit。它具有良好的性能并且符合环规要求,并且还支持WebSockets。它主要由Clojure制成,并且在Jetty / Tomcat中缺少一些奇怪的东西。

很容易修补。


2

重新构造和om.next可能是您想要的内容。


1

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

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

它有一个 kickstarter活动, 声称提供与Rails类似的“入门”体验。它是由一个认知者开发的。

下面是与Luminus公司(yogthos)的作者关于它的良好的讨论。


1

我已经在生产中成功使用Liberator已有一段时间了。如果您只需要裸露的骨骼,那么这是一个很好的框架,例如,如果您正在构建RESTful Web服务或类似的东西。它实质上是环形和compojure的包装器,并在验证传入请求时提供决策图。与其他更庞大的Web框架相比,它的速度也非常快。如果您想快速开始并缓慢地发展,那么Liberator是一个不错的选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.