繁体   English   中英

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

[英]How can I communicate with the backend using ClojureScript and 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))

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM