簡體   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