5

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

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

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

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

首先,http/get 是一个在 clj-http.client 中定义的函数,它不是 Chestnut 设置的一部分。如果我不得不去寻找图书馆来发送像获取请求这样基本的东西,那感觉就像我已经偏离了轨道。

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

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

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

我看不到任何使用过 http-handler 的地方。所以我不明白这个定义到底是做什么的。

也是我理解 Figwheel 的方式,当我调用“运行”时,它会启动一个新的 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))
4

2 回答 2

1

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

于 2018-03-14T22:59:17.033 回答
0

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

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

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

于 2016-06-20T22:30:29.517 回答