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

有帮助吗?

解决方案

到目前为止,我遇到的最好的Clojure Web框架是Compojure: http:// github。 COM / weavejester /的Compojure /树/主

它虽然小巧但功能强大,而且语法优美。 (它在引擎盖下使用Jetty,但除非你需要它,否则它会隐藏你的Servlet API,这不会经常发生)。去查看该URL的README,然后下载快照并开始播放。

其他提示

Compojure不再是开发Web应用程序的完整框架。自0.4发布以来,compojure已被分解为几个项目。

响铃通过抽象出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的另一部分是中间件的概念。这是位于处理程序与传入请求和/或传出响应之间的代码。一些内置的中间件包括会话和堆栈跟踪。会话中间件将向请求映射添加:会话密钥,其中包含发出请求的用户的所有会话信息。如果:会话密钥存在于响应映射中,则它将被存储以用于当前用户发出的下一个请求。堆栈跟踪中间件将捕获处理请求时发生的任何异常,并生成堆栈跟踪,如果发生任何异常,则将其作为响应发回。

直接使用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设置为该值。

最后一个组件是打嗝,这使得生成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作者撰写的一些文档的草稿,您可能会发现这些文档很有帮助: hl = en“rel =”noreferrer“> Compojure Doc

还有<!>“Noir <!>”; ( http://www.webnoir.org/ ),这是一个新的Clojure Web框架(所以新的文档还不存在)。来自Django / Rails,我挖掘了简单,直接的语法,而且非常精简。

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

我当前访问的网络图书馆现在是 雅达.

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

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

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

在尝试了各种网络服务器之后,这里是我的优点/缺点列表:

简短回答:看一下 鲁米努斯 为了快速开始,也许随着您的需求的变化转向其他事情(也许是雅达)。

康波朱雷

  • 优点 (1):

    • 简单,有很多模板/示例(例如发光的)
  • 缺点(2):

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

  • 优点 (3):

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

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

阿莱夫

专业 (3):

  • 表现出色
  • 背压
  • 返回流形流时的 Websocket/SSE 支持

缺点(1):

  • 低水平,自己动手风格(即。它只是为您提供了一种让您的处理程序执行某些操作的方法。没有路由器,什么都没有)。并不是真正的缺点,只是要注意这一点。

雅达

专业 (3):

  • 建立在阿莱夫之上
  • 内容谈判
  • 昂首阔步的整合
  • 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、安全、ssl...
  • 独特的功能值得挖掘:邮政

缺点(2):

  • 不完全确定 ct/routes 语法有多令人愉快,以及关于放弃 Ring 规范(据说是为了异步故事,但我认为底座人员修复了这个问题)
  • 不确定如何整合 swagger 等。
  • 当我尝试时,我无法让它立即工作

笔记 :A Clojure Web 服务器的基准测试 如果原始性能是最重要的,则可用。

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

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

Webjure ,Clojure的网络编程框架。

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

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

Compojure是我用来构建一个小型博客应用程序的东西。它以Sinatra为蓝本,它是Ruby的最小,轻量级Web框架。我大多只使用路由,这就像Sinatra的。它看起来像:

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

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

您还可以查看这些框架(摘自 披露/项目):

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

免责声明:我是作者。

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

我会投入我的两分钱 , ,也来自 @weavejester, ,Compojure 和 Ring 的维护者。

它的核心是带来 成分 和同一个屋檐下的环形路由器。我使用管道的原因:

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

主要特点:

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

笔记: 这是不言而喻的,但为了 Web 开发新手的利益,像大多数 Clojurey 事物一样,Duct 需要扎实掌握 Clojure 语言。我还建议首先阅读有关组件的内容。

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

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

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

很容易修补。

Reframe和om.next可能就是你要找的东西。

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

  

Arachne是一个完整的,高度模块化的Web开发框架   Clojure的。它强调轻松,简单,可靠,可扩展   设计。

它有一个 kickstarter广告系列 声称提供<!>“开始<!>”;经验类似于Rails。它是 由Cognitect开发。

此处是 与Luminus(yogthos)的作者就此进行了很好的讨论。

我已经成功地在 Liberator 中使用了一段时间。如果你只想要裸骨,这是一个很棒的框架,例如:如果您正在构建RESTful Web服务或类似的东西。它本质上是ring和compojure的包装器,并在验证传入请求时提供决策图。与其他更庞大的Web框架相比,它也非常快。如果你想快速开始并慢慢建立,那么解放者是一个很好的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top