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

时间:2008-10-03 14:52:58

标签: clojure

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

16 个答案:

答案 0 :(得分:178)

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

Ring通过抽象出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设置为该值。

最后一个组件是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

答案 1 :(得分:103)

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

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

答案 2 :(得分:48)

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

答案 3 :(得分:24)

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

答案 4 :(得分:20)

我现在的首选网络库现在是yada

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

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

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

在玩各种网络服务器之后,这是我的快速Pro / Cons列表:

简短的回答:看看Luminus快速入门,或许随着需求的发展转移到其他地方(Yada也许)。

的Compojure

  • 优点(1):

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

    • 性能不高(每个请求一个帖子),期望性能略好于rails
    • 不简单,中间件模型有不便

立柱

  • 优点(3):

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

    • 没有websocket支持(还),返回core.async频道会很好
    • 如果把它放在Stuart Sierra的组件中(我认为你应该使用重载拦截器),
    • 重新加载有点慢。
    • 没有异步拦截器的测试设施
    • 需要买入(?)

阿莱夫

Pro(3):

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

缺点(1):

  • 低级别,自己做风格(即它只是让你有办法让你的处理程序做一些事情。没有路由器,没有任何东西)。不是一个缺点,只要注意它。

矢田

Pro(3):

  • 建立在Aleph上
  • content negociation
  • swagger integration
  • bidi相当不错(虽然我更喜欢基座路由器语法)

缺点(1):

  • 文档(虽然没有nginx-clojure那么糟糕,但很快就会改进)。

HttpKit

Pro(2):

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

缺点(2):

  • 没有CORS支持
  • 虫子?此外,不是很多最近的提交

的Nginx-Clojure的

注意:我没有玩过它,主要是因为缺乏文档。它虽然看起来很有趣,但性能非常好。

优点(2):

  • Nginx(performant,offload ssl,restart workers ......)
  • 此模型是否允许零停机更新?那真是太棒了!

缺点(1):

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

Immutant

注意:我还没玩过它。

优点:

  • 集成(缓存,消息传递,日程安排,野生动物部署)

缺点:

  • 没有http客户端

Catacumba公园

注意:虽然文档看起来很棒,但我还没有玩过它。我可能会接下来尝试一下。有一些示例聊天项目看起来很有趣,他们大量使用协议使我最初成为新手Clojure dev。

优点(6):

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

缺点(2):

  • 不完全确定ct / routes语法是多么令人愉快,并且放弃了戒指规范(据说是异步故事,但我认为基座的人修好了)
  • 不确定如何整合swagger等。
  • 当我尝试时,我无法让它立即工作

注意:如果原始性能非常重要,则benchmark of Clojure web servers可用。

答案 5 :(得分:14)

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

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

答案 6 :(得分:11)

Webjure,Clojure的Web编程框架。

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

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

答案 7 :(得分:8)

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

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

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

答案 8 :(得分:5)

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

还有一个关于Stack Overflow的相关问题:Mature Clojure web frameworks?

答案 9 :(得分:3)

免责声明:我是作者。

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

答案 10 :(得分:3)

我将docs投入我的两分钱,同样来自Duct,他是Compojure和Ring的维护者。

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

  • 优秀的哲学基础:它鼓励您将应用程序构建为一系列小组件,并且在提供合理的默认值的同时保持少量意见之间取得了很好的平衡。
  • 稳定的道路:我为自己说话,但多年来我一直觉得Clojure社区已经提出了一个又一个不可靠的网络框架。一对夫妇只是感觉太过实验性(我对Om和客户端Pedestal的体验),因为#34;完成任务&#34; (并不是说他们不会在路上获胜)。另一方面,我觉得@weavejester给Duct带来了同样的稳定性和测量进度,他对Compojure和Ring做了很多,这些都是在社区中出生的。
  • 它的超级轻量级,并且不受我的组件影响。

主要特点:

  • 通过&#34;端点&#34;组织路由,您可以将其视为迷你Web服务器(或HTTP路由的小横截面)。
  • Component的开箱即用支持。
  • 与Ring和Compojure完美融合。
  • 开发和生产配置(我在其他地方明显遗漏的东西)。
  • 带有示例的良好文档。

注意:毋庸置疑,但为了网络开发新手的利益,像大多数Clojurey一样,Duct需要扎实掌握Clojure语言。我还建议先阅读有关组件的内容。

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

答案 11 :(得分:2)

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

答案 12 :(得分:2)

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

很容易修补。

答案 13 :(得分:2)

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

答案 14 :(得分:1)

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

  

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

它有一个 kickstarter campaign 声称要提供一个&#34;入门&#34;经验类似于Rails。它是 由Cognitect开发。

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

答案 15 :(得分:1)

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