216

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

4

16 回答 16

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 的另一部分是中间件的概念。这是位于处理程序和传入请求和/或传出响应之间的代码。一些内置的中间件包括会话和堆栈跟踪。会话中间件将向请求映射添加一个 :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 设置为该值。

最后一个组件是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 的作者目前正在编写的一些文档的粗略草稿的链接,您可能会发现这些文档对您有帮助:Compojure Doc

于 2010-07-17T15:54:47.180 回答
104

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

它体积小但功能强大,语法优美优雅。(它在底层使用了 Jetty,但它对你隐藏了 Servlet API,除非你想要它,这不会经常发生)。去查看那个 URL 上的 README,然后下载一个快照并开始播放。

于 2008-10-11T17:23:33.680 回答
48

还有“Noir”(http://www.webnoir.org/),它是一个新的 Clojure Web 框架(所以还没有新的文档)。来自 Django/Rails,我挖掘了简单、直接的语法,它非常精简。

于 2011-06-23T05:31:36.503 回答
25

考虑Luminus Web 框架。我没有从属关系,但从我尊敬的朋友那里听到了好话。

于 2014-11-26T20:24:46.350 回答
21

我目前的首选网络图书馆现在是yada

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

我试过Pedestal了,全球都对它感到满意。我并没有声称自己掌握了它,但它有一种令人愉快的语法,感觉非常有凝聚力,而且看起来它确实有很好的性能。它也得到了Cognitect(Rich Hickey 工作的 Clojure/Datomic 公司)的支持。

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

在使用了各种 Web 服务器之后,这是我的快速优缺点列表:

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

复合

  • 优点(1):

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

    • 性能不佳(每个请求一个线程),预计性能略好于 rails
    • 不简单,中间件模型有不便之处

  • 优点(3):

    • 拦截器模型,将拦截器添加到路由子集的令人愉悦的语法
    • 高性能路由器
    • 开箱即用地透明地支持 json/transit/multipart 表单,无需询问任何内容。很酷 !
  • 缺点(4):

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

阿莱夫

临 (3):

  • 高性能
  • 背压
  • 返回歧管流时的 Websocket/SSE 支持

缺点(1):

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

雅达

临 (3):

  • 建立在 Aleph 上
  • 内容协商
  • 大摇大摆的整合
  • 比迪很好(虽然我更喜欢基座路由器语法)

缺点(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、安全、ssl...
  • 独特的挖掘功能:邮政

缺点(2):

  • 不完全确定 ct/routes 语法有多令人愉快,以及放弃 Ring 规范(据说是为了异步故事,但我认为基座人员已经解决了这个问题)
  • 不知道如何整合招摇等。
  • 当我尝试它时,我无法立即使其工作

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

于 2015-08-23T10:27:46.433 回答
14

如今, Pedestal是一个值得一看的框架。它是一个构建在Ring之上的服务器端框架,但也可以通过暂停和恢复该特定请求(否则一个缓慢的请求实际上会阻塞该服务器线程)来释放来自初始线程的传入请求。也许有点像JavaBean。

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

于 2013-08-13T08:53:33.250 回答
11

Webjure,Clojure 的 Web 编程框架。

特点: Dispatch servlet 调用 Clojure 函数。动态 HTML 生成。SQL 查询接口(通过 JDBC)。

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

于 2008-10-20T05:51:22.340 回答
8

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

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

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

于 2009-03-04T13:42:55.737 回答
5

您还可以查看这些框架(取自disclojure/projects):

Stack Overflow 上还有一个相关问题:成熟的 Clojure Web 框架?

于 2011-05-21T09:02:42.600 回答
3

免责声明:我是作者。

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

于 2015-04-28T11:17:21.117 回答
3

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

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

  • 优秀的哲学基础:它鼓励您将应用程序构建为一系列小组件,并且在保持少量意见和提供合理的默认值之间取得了很好的平衡。
  • 稳定的道路:我为自己说话,但多年来我一直觉得 Clojure 社区提出了一个又一个不太可信的 Web 框架。一对夫妇只是觉得“把事情做好”(并不是说他们不会在未来证明是优越的)太具有实验性(我对 Om 和客户端 Pedestal 的经验)。另一方面,我觉得@weavejester 为 Duct 带来了与他为 Compojure 和 Ring 所做的相同的稳定性和可衡量的进步,这在社区中已经非常出色地诞生了。
  • 轻量级,并且不妨碍我的组件。

主要特点:

  • 通过“端点”组织路由,您可以将这些小组件视为迷你 Web 服务器(或 HTTP 路由的小横截面)。
  • 对重新加载的工作流的开箱即用支持。
  • 与 Ring 和 Compojure 完美结合。
  • 开发和生产配置(我在其他地方发现明显缺失的东西)。
  • 带有示例的良好文档。

注意:这是不言而喻的,但为了 Web 开发新手的利益,像大多数 Clojure 东西一样,Duct 需要对 Clojure 语言有扎实的掌握。我还建议先阅读有关 Component 的内容。

另一方面,我已经在多个生产应用程序中使用 Duct 一年多了,对此我感到非常满意。

于 2016-10-05T23:06:48.053 回答
2

你也可以在 Coils 上尝试 Clojure, http: //github.com/zubairq/coils - 免责声明:我是作者

于 2013-08-14T12:32:37.543 回答
2

另一个有趣的网络服务器是Http-kit。它具有良好的性能并且符合环形标准,并且还支持 WebSockets。它主要是用 clojure 制作的,缺少 Jetty/Tomcat 中的一些奇怪的东西。

这很容易修补。

于 2015-05-20T14:24:04.490 回答
2

Reframe 和 om.next 可能是您正在寻找的。

于 2016-12-22T08:04:30.527 回答
1

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

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

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

是与 Luminus (yogthos) 的作者的一个很好的讨论。

于 2017-02-19T20:28:47.177 回答
1

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

于 2017-05-04T14:35:17.120 回答