clojure 开发工具_Clojure网站开发–最新技术

本文介绍了使用Clojure开发Web应用的流程,包括使用组件库来管理应用程序生命周期,通过Ring和Cheshire添加REST端点,以及结合Figwheel实现ClojureScript的前端开发。通过具体的代码示例,展示了如何从头开始创建一个简单的Web应用程序,提供了一个替代Java Spring、Angular等技术的解决方案。

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 setupclojure-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-bodywrap-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 开发工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值