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

pup*_*eno 215 clojure

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

Ros*_*ard 178

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

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>"}))
Run Code Online (Sandbox Code Playgroud)

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

直接使用Ring可能很繁琐,因此Compojure构建在Ring之上,抽象出细节.现在可以用路由表示应用程序,这样你就可以得到这样的东西:

(defroutes my-routes
  (GET "/" [] "<h1>Hello all!</h1>")
  (GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Run Code Online (Sandbox Code Playgroud)

Compojure仍然使用请求/响应映射,因此您可以随时访问它们:

(defroutes my-routes
  (GET "*" {uri :uri} 
           {:staus 200 :body (str "The uri of the current page is: " uri)}))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,{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)))
Run Code Online (Sandbox Code Playgroud)

以下是一篇关于compojure作者目前正在撰写的一些文档草稿的链接,您可能会发现这些文档很有帮助:Compojure Doc


小智 103

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

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

  • @Richard你的论点非常愚蠢.是的,如果您决定使用Java库,那么您在许多情况下都放弃了功能.但是这些库的重点是你永远不必再做*.例如,Ring是围绕servlet的Clojury包装器,因此您不必直接使用servlet.您是否建议我们从头开始重新构建Web开发轮,而不是使用Clojure中非常好的Java工具?其中的逻辑在哪里.那么,如何使用*选项*使用这些库是件坏事?... (26认同)
  • 理查德的评论意味着这个答案吗?我不明白. (16认同)
  • @Richard你的整个论点暗示非功能性非Clojure代码本质上是如此糟糕,甚至隐藏在库下的它的存在也是一种污染.我不明白这个推理.许多Java库都是有用且功能强大的代码片段.当我们可以简单地提供我们自己的包装库时,为什么要从头开始重写那些可以在Clojure中优雅地和功能性地使用它们? (15认同)
  • @Richard,随意制作一个纯粹的clojure http服务器. (10认同)
  • 在Lisp/Clojure术语中,函数没有副作用.(见http://www.gigamonkeys.com/book/they-called-it-lisp-for-a-reason-list-processing.html).然而正如Land of Lisp(http://landoflisp.com/trade_func.png)所指出的那样,纯功能程序通常不是很有用,因为副作用对于实际做事是必要的,比如写数据库记录,下载文件,发布到REST服务器,生成图像等... (5认同)
  • @Ifalin - 爱因斯坦应该说,"让程序尽可能实用 - 但没有功能!". (2认同)

eli*_*rar 48

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

  • 仅仅为了记录,似乎Noir已被弃用,不再维护.... (17认同)

Mic*_*ter 25

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


nha*_*nha 20

我现在的网络图书馆现在是yada.

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

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

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

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

简短的回答:看看Luminus快速入门,或许随着你的需求的变化继续前进(Yada也许).

的Compojure

  • 优点(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配置文件中的字符串中编程,如果这是唯一的方法.
  • 可能会使第一次部署(?)复杂化

Immutant

注意:我没玩过它.

优点:

  • 集成(缓存,消息传递,调度,野生动物部署)

缺点:

  • 没有http客户端

Catacumba公园

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

优点(6):

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

缺点(2):

  • 不完全确定ct/routes语法是多么令人愉快,以及放弃Ring规范(据说是异步故事,但我认为基座的人修复了)
  • 不确定如何整合招摇等.
  • 当我尝试它时,我无法立即使用它

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


cla*_*laj 14

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

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


pup*_*eno 11

Webjure,Clojure的Web编程框架.

功能:Dispatch servlet调用Clojure函数.动态HTML生成.SQL查询接口(通过JDBC).

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

  • 我不确定这是一个很好的例子.虽然代码库看起来很浅(好)但是在java中写的足够多,似乎错过了标记.我原本期望一个纯粹的clojure框架. (3认同)

小智 8

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

(GET "/post/:id/:slug"
  (some-function-that-returns-html :id :slug))
Run Code Online (Sandbox Code Playgroud)

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


mni*_*cky 5

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

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