我想这对于每天使用Java工作的绝大多数程序员来说都是一个奇怪的问题.我不.我知道Java-the-language,因为我从事过Java项目,但不是Java-the-world.我从未在Java中从头开始创建Web应用程序.如果我必须使用Python,Ruby,我知道去哪里(Django或Rails),但如果我想在Clojure中创建一个Web应用程序,不是因为我被迫生活在Java世界中,而是因为我喜欢语言,我想尝试一下,我应该使用哪些库和框架?
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 "Welcome Home
"} {:status 200 :body "Go Home!"}))
Ring的另一部分是中间件的概念.这是位于处理程序与传入请求和/或传出响应之间的代码.一些内置的中间件包括会话和堆栈跟踪.会话中间件将向请求映射添加:会话密钥,其中包含发出请求的用户的所有会话信息.如果:会话密钥存在于响应映射中,则它将被存储以用于当前用户发出的下一个请求.堆栈跟踪中间件将捕获处理请求时发生的任何异常,并生成堆栈跟踪,如果发生任何异常,则将其作为响应发回.
直接使用Ring可能很繁琐,因此Compojure构建在Ring之上,抽象出细节.现在可以用路由表示应用程序,这样你就可以得到这样的东西:
(defroutes my-routes (GET "/" [] "Hello all!
") (GET "/user/:id" [id] (str "Hello " id "
")))
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标记表示为向量,第一个元素表示标记名称,其余元素是标记的主体."
成为A header
"[:h2 "A Header"]
.标记的属性位于可选地图中."Log In Page"
成为[: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
到目前为止,我遇到的最好的Clojure Web框架是Compojure:http://github.com/weavejester/compojure/tree/master
它体积小但功能强大,语法优美.(它在引擎盖下使用Jetty,但除非你需要它,否则它会隐藏你的Servlet API,这不会经常发生).去查看该URL的README,然后下载快照并开始播放.
还有"Noir"(http://www.webnoir.org/),这是一个新的Clojure Web框架(所以新的文档还没有).来自Django/Rails,我挖掘了简单,直接的语法,它非常精简.
考虑Luminus Web框架.我没有任何从属关系,但我听到了我尊重的朋友的好话.
我现在的网络图书馆现在是yada.
如果您刚刚开始,介绍服务器是Compojure
.我认为它是apache
Clojure世界中的Web服务器(在这种情况下,yada/aleph将是nginx).您可以将其Luminus
用作模板.有它的变种,比如compojure-api
.
我试过了,Pedestal
并对它感到满意.我没有声称掌握它,但它具有令人愉快的语法,感觉非常有凝聚力,并且看起来确实具有很好的性能.它也得到了Cognitect
(Rich Hickey工作的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那么糟糕,但很快就会改进).
专业(2):
写在Clojure!(和Java ...)
性能看起来不错(参见600K并发连接帖)
缺点(2):
没有CORS支持
臭虫?此外,最近提交的不是很多
注意:我没有玩过它,主要是因为缺少文档.虽然它看起来很有趣,但性能非常好.
优点(2):
Nginx(高性能,卸载ssl,重启工作人员...)
这种模式可以实现零停机更新吗?那真是太棒了!
缺点(1):
文件(改进).另外,我不想在嵌入在nginx配置文件中的字符串中编程,如果这是唯一的方法.
可能会使第一次部署(?)复杂化
注意:我没玩过它.
优点:
集成(缓存,消息传递,调度,野生动物部署)
缺点:
没有http客户端
注意:虽然文档看起来很棒,但我还没有玩过它.我可能会接下来尝试一下.有一些示例聊天项目看起来很有趣,他们大量使用协议使我最初成为新手Clojure dev.
优点(6):
文档!像所有funcool项目一样,该文档阅读起来非常愉快.
类似基座的路由语法
应该是高性能的(在Ratpack之上)
背压
websockets,sse,cors,security,ssl ...
独特的挖掘功能:邮政
缺点(2):
不完全确定ct/routes语法是多么令人愉快,以及放弃Ring规范(据说是异步故事,但我认为基座的人修复了)
不确定如何整合招摇等.
当我尝试它时,我无法立即使用它
注意:如果原始性能非常重要,可以使用Clojure Web服务器的基准测试.
这些天Pedestal是一个值得一看的框架.它是一个构建在Ring之上的服务器端框架,但也可以通过暂停和恢复该特定请求来释放来自初始线程的传入请求(否则慢速请求实际阻止该serverthread).也许有点像JavaBean.
其他很酷的框架是hoplon.io和David Nolen的Om(基于React)
Webjure,Clojure的Web编程框架.
功能: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的功能.
您还可以查看这些框架(取自disclojure/projects):
级联
变戏法
Stack Overflow上还有一个相关的问题:成熟的Clojure Web框架?