clojure 开发工具
现在我已经对Clojure熟悉了一年多,而我投入的越多,它就越成为一种语言 。 一旦您克服了“括号恐惧症”,其他一切都将有所作为:工具,社区,良好的工程实践。 因此,现在是我说服他人的时候了。 在这篇文章中,我将尝试从头开始研究一个简单的Web应用程序,以展示2015年底用于使用Clojure开发的关键工具和库。
给Clojurian的注意事项 :如果您已经有点了解Clojure,但是从未做过比Hello World应用程序更大的事情,那么此材料是相当基本的,对您可能有用。
Java开发人员注意事项 :该资料显示了如何使用一堆Clojure工具和库以及一些代码来替换Spring,Angular,grunt,live-reload。
- 带有最终代码和各个步骤的回购在这里 。
引导程序
我认为所有人都同意该组件是管理Clojure应用程序生命周期的行业标准。 如果您是Java开发人员,则可以将其视为Spring(DI)的替代品-声明“组件”之间的依赖关系,这些依赖关系在“系统”启动时已解决。 因此,您只是说“我的组件需要一个存储库/数据库池”,而组件库则为您“注入”它。
为了简单起见,我喜欢从风管 Web应用程序模板开始。 遵循12要素原则,这是一个不错的入门组件应用程序。 因此,让我们开始吧:
lein new duct clojure-web-app +example
+example参数告诉管道使用HTTP路由创建示例端点–这将很有帮助。 要完成引导, lein setup在clojure-web-app目录中运行lein setup 。
好的,让我们深入研究代码。 与组件和注入相关的代码应位于system.clj文件中:
(defn new-system [config]
(let [config (meta-merge base-config config)]
(-> (component/system-map
:app (handler-component (:app config))
:http (jetty-server (:http config))
:example (endpoint-component example-endpoint))
(component/system-using
{:http [:app]
:app [:example]
:example []}))))
在第一部分中,实例化没有依赖关系的组件,第二部分中将解决这些组件。 因此,在此示例中,“ http”组件(服务器)需要“ app”(应用抽象),而该应用又注入了“ example”(实际路由)。 如果您的组件需要其他组件,则只需按名称即可获取(准确地说就是:按Clojure关键字)。
要启动系统,您必须启动REPL –在应用程序上下文中运行的交互式环境:
lein repl
看到提示后,键入(go) 。 应用程序应该启动,您可以访问http:// localhost:3000来查看一些示例页面。
使用组件方法的巨大好处是您可以获得完全可重新加载的应用程序。 当您在字面上进行任何更改(配置,端点,实现)时,您都可以在REPL中键入(reset) ,并且您的应用程序是最新的代码。 这是语言的功能,不需要JRebel,不需要重新加载Spring。
添加REST端点
好的,在下一步中,我们添加一些返回JSON的基本REST端点。 我们需要在project.clj文件中添加2个依赖项:
:dependencies
...
[ring/ring-json "0.3.1"]
[cheshire "5.1.1"]
Ring-json为您的路由添加了对JSON的支持(在环上称为中间件),而cheshire是Clojure JSON解析器(例如Java中的Jackson)。 如果需要重启REPL的少数任务之一是修改项目依赖项,那么请按CTRL-C并再次键入lein repl 。
要配置JSON中间件,我们必须在system.clj wrap-defaults之前添加wrap-json-body和wrap-json-response :
(:require
...
[ring.middleware.json :refer [wrap-json-body wrap-json-response]])
(def base-config
{:app {:middleware [[wrap-not-found :not-found]
[wrap-json-body {:keywords? true}]
[wrap-json-response]
[wrap-defaults :defaults]]
最后,在endpoint/example.clj我们必须添加一些带有JSON响应的路由:
(:require
...
[ring.util.response :refer [response]]))
(defn example-endpoint [config]
(routes
(GET "/hello" [] (response {:hello "world"}))
...
在REPL中使用(reset)重新加载应用,并使用curl测试新路线:
curl -v http://localhost:3000/hello
< HTTP/1.1 200 OK
< Date: Tue, 15 Sep 2015 21:17:37 GMT
< Content-Type: application/json; charset=utf-8
< Set-Cookie: ring-session=37c337fb-6bbc-4e65-a060-1997718d03e0;Path=/;HttpOnly
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Content-Length: 151
* Server Jetty(9.2.10.v20150310) is not blacklisted
< Server: Jetty(9.2.10.v20150310)
<
* Connection #0 to host localhost left intact
{"hello": "world"}
有用! 如果有任何问题,您可以在此commit中找到可用的版本。
用Figwheel添加前端
Clojure中的编码后端很棒,但是前端呢? 您可能已经知道,Clojure不仅可以编译为JVM字节码,还可以编译为Javascript。 如果您使用了例如Coffeescript,可能听起来很熟悉。 但是,ClojureScript的理念不仅是提供一些语法功能,而且还通过出色的工具和完全交互式的开发来缩短开发周期。 让我们看看如何实现它。
将ClojureScript引入项目的最佳方法是figweel 。 首先,我们将fighweel插件和配置添加到project.clj :
:plugins
...
[lein-figwheel "0.3.9"]
和cljsbuild配置:
:cljsbuild
{:builds [{:id "dev"
:source-paths ["src-cljs"]
:figwheel true
:compiler {:main "clojure-web-app.core"
:asset-path "js/out"
:output-to "resources/public/js/clojure-web-app.js"
:output-dir "resources/public/js/out"}}]}
简而言之,这告诉ClojureScript编译器从具有figweel支持的src-cljs获取源代码,并将生成JavaScript放入resources/public/js/clojure-web-app.js文件中。 因此,我们需要将此文件包含在一个简单HTML页面中:
<!DOCTYPE html>
<head>
</head>
<body>
<div id="main">
</div>
<script src="js/clojure-web-app.js" type="text/javascript"></script>
</body>
</html>
要提供此静态文件,我们需要更改一些默认值并添加相应的路由。 在system.clj将require部分和base-config函数中的api-defaults更改为site-defaults 。 在example.clj添加以下路由:
(GET "/" [] (io/resource "public/index.html")
再次在REPL窗口中(reset)应重新加载所有内容。
但是我们的ClojureScript源文件在哪里? 让我们在src-cljs/clojure-web-app目录中创建文件core.cljs :
(ns ^:figwheel-always clojure-web-app.core)
(enable-console-print!)
(println "hello from clojurescript")
打开另一个终端并运行lein fighweel 。 它应编译ClojureScript并显示“ Figwheel连接到您的应用程序时将显示提示”。 打开http://localhost:3000 。 Fighweel窗口应提示:
To quit, type: :cljs/quit
cljs.user=>
输入(js/alert "hello") 。 繁荣! 如果一切正常,您应该在浏览器中看到并发出警报。 在浏览器中打开开发人员控制台。 您应该hello from clojurescript打印的hello from clojurescript 。 在core.cljs其更改为(println "fighweel rocks")并保存文件。 在不重新加载页面的情况下,您应该会看到更新的消息。 菲格威岩石! 同样,如果有任何问题,请参考此commit 。
在下一篇文章中,我将展示如何从MongoDB获取数据,如何使用REST将数据提供给broser以及编写ReactJs / Om组件来呈现数据。 敬请关注!
翻译自: https://www.javacodegeeks.com/2015/09/clojure-web-development-state-of-the-art.html
clojure 开发工具
本文介绍了使用Clojure开发Web应用的流程,包括使用组件库来管理应用程序生命周期,通过Ring和Cheshire添加REST端点,以及结合Figwheel实现ClojureScript的前端开发。通过具体的代码示例,展示了如何从头开始创建一个简单的Web应用程序,提供了一个替代Java Spring、Angular等技术的解决方案。

1076

被折叠的 条评论
为什么被折叠?



