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

如何使用ClojureScript和Figwheel与后端通信?,clojure,clojurescript,ring,figwheel,Clojure,Clojurescript,Ring,Figwheel,注意:一般来说,我是一名经验丰富的程序员,使用clojure,但从未进行过认真的web开发 我使用Chestnut建立了一个基本的ClojureScript项目,并很好地完成了“Hello World”的步骤。然而,我真的很想谈谈我的后端以及。为此,我将试剂代码重新定义为 (defn greeting [] [:input {:type "button" :value (:text @app-state) :on-click #(http/get {})}])

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

我使用Chestnut建立了一个基本的ClojureScript项目,并很好地完成了“Hello World”的步骤。然而,我真的很想谈谈我的后端以及。为此,我将试剂代码重新定义为

(defn greeting []
  [:input {:type "button"
       :value (:text @app-state)
       :on-click #(http/get {})}])
单击时会得到404响应。所以至少我在和某人说话。我还可以在server.log文件中看到get请求的证据。然而,在这一点上,我正在与一些概念上的观点作斗争

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

其次,用户名称空间的文件具有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处理程序正在以某种方式被调用,因为修改它们会改变get请求中的错误,但是这对我来说完全是个谜。按照我的理解,我从浏览器发送的get请求被发送到Figwheel服务器,即站点的来源。我没有理由相信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最终编译成JavaScript,并大量使用(并且可以访问)Google闭包库。因此,如果您真的愿意,可以使用JavaScript互操作从客户端发出AJAX调用,就像在JS中一样。闭包库为此提供了一个包装器——请参见此处的文档。但是clojurescript还有几个简单的http和Ajax库,为什么不使用它们呢?clojurescript的另一个乐趣和魔力是,应用的Google闭包优化可以做一些可爱的事情,比如去除死代码,所以我相信(如果我错了,其他人可以纠正我),在其中添加一些额外的库几乎没有(没有?)生产成本

  • Figwheel最终是开发人员,而不是生产人员,它不依赖于为生产使用而设置的http服务器。事实上,对于仍然使用figwheel的仅前端cljs项目,有一些模板。Figwheel通过自己的服务器将更改推送到浏览器,我不太清楚它是如何工作的

  • 对于ClojureScript项目(即非Clojure),我相信您希望: