如何使用ClojureScript和Figwheel与后端进行通信?

时间:2016-06-20 15:57:09

标签: clojure clojurescript ring figwheel

注意:我是一名经验丰富的程序员,使用clojure但从未进行过严肃的Web开发。

我使用Chestnut设置了一个基本的ClojureScript项目,并且完成了“Hello World”步骤。但是,我真的想和我的后端交谈。为此,我重新定义了试剂代码

(defn greeting []
  [:input {:type "button"
       :value (:text @app-state)
       :on-click #(http/get {})}])

单击时获得404响应。所以至少我和某个人说话。我还可以在server.log文件中看到我的get-requests的证据。然而,在这一点上,我正在努力解决一些概念问题。

首先,http / get是clj-http.client中定义的函数,它不是Chestnut设置的一部分。如果我不得不去寻找图书馆发送基本内容作为获取请求,我觉得我已经偏离了轨道。

其次,用户名称空间的文件具有Chestnut预定义的以下行:

(def http-handler
  (wrap-reload #'mypage.server/http-handler))

(defn run []
  (figwheel/start-figwheel!))

我看不到任何使用http处理程序的地方。所以我不明白这个定义是什么。

另外我理解Figwheel的方式,当我调用“run”时它会启动一个新的web服务器,然后a)服务index.html和b)通过一些TCP端口连接到我的浏览器并开始抽取新的JavaScript通过这种联系。第二部分对我来说非常具有推测性。如果这实际发生了什么,我的下一个问题是,如果Figwheel还需要坐在该连接的另一端,或者浏览器是否有一些允许从外部重新加载代码的通用API。

最后我可以告诉我们以某种方式调用mypage / server.clj文件(下面)中定义的环路由和http-handler,因为修改这些会改变get-request中的错误,但这是一个完全的谜告诉我这是如何工作的。我理解它的方式是我从浏览器发送的get-request被发送到Figwheel-server,即站点的起源。我没有理由相信Figwheel知道我在服务器文件中定义的http处理程序。

(defroutes routes
  (GET "/" _
    {:status 200
     :headers {"Content-Type" "text/html; charset=utf-8"}
     :body (io/input-stream (io/resource "public/index.html"))})
  (resources "/"))

(def http-handler
  (-> routes
      (wrap-defaults api-defaults)
      wrap-with-logger
      wrap-gzip))

2 个答案:

答案 0 :(得分:1)

对于 ClojureScript 项目(即不是Clojure),我相信你想要这样:https://github.com/r0man/cljs-http

答案 1 :(得分:0)

我没有完整的答案,但我确实有几点可能会有所帮助。

  1. Clojurescript最终编译成JavaScript,并大量使用(并且可以访问)Google Closure库。因此,如果您真的想要,可以使用JavaScript互操作来从客户端进行AJAX调用,就像在JS中一样。闭包库为此提供了一个包装器 - 请参阅此处的文档https://developers.google.com/closure/library/docs/xhrio。但是clojurescript也有几个简单的http和Ajax库,为什么不使用它们? clojurescript的喜悦和魔力的另一部分是,应用的Google闭包优化做了一些可爱的事情,比如删除死代码,所以我相信(如果我错了,别人可以纠正我)没有?)增加一些额外库的生产成本。

  2. Figwheel最终是dev,而不是生产,并且不依赖于您为生产使用而设置的http服务器。事实上,有一些模板可用于仅使用figwheel的前端cljs项目---这里one example。 Figwheel旋转自己的服务器以将更改推送到浏览器,我不太确定它是如何工作的。

相关问题