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

5
注意:我是一个有一定经验的程序员,熟悉Clojure语言,但从未参与过严肃的Web开发。
我使用Chestnut建立了一个基本的ClojureScript项目,并顺利地完成了“Hello World”的步骤。然而,我真的很想和我的后端进行通信。为此,我重新定义了Reagent代码如下:
(defn greeting []
  [:input {:type "button"
       :value (:text @app-state)
       :on-click #(http/get {})}])

当点击链接时,会得到404响应。所以至少我正在和某人交流。我还可以在服务器日志文件中看到我的get请求的证据。然而,在这个阶段,我正在努力解决一些概念上的问题。

首先,http/get是在clj-http.client中定义的函数,它不是Chestnut设置的一部分。如果我必须去寻找库来发送像get请求这样基本的东西,那么似乎我已经偏离了正轨。

其次,用户命名空间的文件由Chestnut预定义了以下行:

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

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

我看不到任何地方使用 http-handler。所以我不理解那个定义的作用。
此外,据我了解 Figwheel,当我调用“run”时,它将启动一个新的 Web 服务器,然后 a) 提供 index.html,并通过某个 TCP 端口连接到我的浏览器,并开始通过该连接传输新的 JavaScript。这第二部分是我自己的推测。如果实际上是这样发生的,我的下一个问题就是,Figwheel 是否还需要坐在该连接的另一侧,或者浏览器是否具有一些公共 API,允许从外部重新加载代码。
最后,我可以感觉到 mypage/server.clj 文件中定义的环路路由和 http-handler 被某种方式调用,因为修改它们会更改来自 get 请求的错误,但我完全不知道这是如何工作的。据我理解,我从浏览器发送的 get 请求被发送到网站的起源 Figwheel-server。我没有理由相信 Figwheel 知道我在服务器文件中定义的 http-handlers。
(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个回答

1

0

我没有完整的答案,但我有几个可能会有帮助的观点。

  1. Clojurescript 最终会编译成 JavaScript,并且大量使用(并且可以访问)Google Closure 库。因此,如果您真的想要,您可以使用 JavaScript 互操作性来从客户端发起 AJAX 调用,就像在 JS 中一样。Closure 库提供了一个包装器,详情请参见此处的文档 https://developers.google.com/closure/library/docs/xhrio。但是,Clojurescript 还有几个易于使用的 http 和 Ajax 库,为什么不使用它们呢?Clojurescript 的另一个乐趣和魔力的部分是 Google Closure 优化所应用的美妙之处,例如删除死代码,因此我相信(如果我错了,其他人可以纠正我),将一些额外的库放入其中几乎没有(或没有)生产成本。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接