2016-06-20 11 views
3

注:私は、一般的には適度に経験豊富なプログラマーで、clojureを使用していますが、深刻なWeb開発を行ったことはありません。ClojureScriptとFigwheelを使用してバックエンドと通信するにはどうすればよいですか?

私はChestnutを使って基本的なClojureScriptプロジェクトをセットアップし、 "Hello World"の手順をうまく歩いていきました。しかし、私は本当に私のバックエンドと話したいと思います。この目的のために私がクリックしたときに404応答を取得

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

する試薬コードを再定義しました。だから少なくとも私は誰かと話している。私はまた、server.logファイルに自分のget-requestの証拠を見ることができます。しかし、この時点で私はいくつかの概念的な点で苦労しています。

最初にhttp/getは、Chestnutセットアップの一部ではないclj-http.clientで定義された関数です。私がライブラリーのために狩りをして取得リクエストのようなものを送る必要があるなら、私はすでにオフトラックのように感じます。

第二に、ユーザーの名前空間のファイルには、栗によってあらかじめ定義され、以下の行を持っています

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

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

私はHTTPハンドラがこれまで使用されている任意の場所を見ることができません。だから私はその定義が何をしているのか理解していない。

また、FIGwheelを理解する方法では、「実行」と呼ぶと新しいWebサーバーを起動し、a)index.htmlを提供し、b)一部のTCPポート経由でブラウザに接続し、新しいその接続を介してJavaScript。この第二の部分は私の側で非常に投機的です。これが実際に起こっているのは、Figwheelもその接続の反対側に座る必要がある場合、またはブラウザに外部からのコードの再読み込みを可能にする共通のAPIがある場合です。

最後に、mypage/server.cljファイル(下記)で定義されているリングルートとhttpハンドラが、何らかの形で呼び出されていることが分かります。これらの変更はget-requestからのエラーを変更するためですが、どのようにこの作品が私に謎です。私がそれを理解する方法は、私がブラウザから送信しているget-requestは、フィギュアサーバに送信され、サイトの起源です。私は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)) 

答えて

0

私は完全な答えはありませんが、私は役立つかもしれないいくつかのポイントがあります。

  1. Clojurescriptは最終的にJavaScriptにコンパイルされ、Google Closureライブラリを大量に使用(アクセス)します。あなたが本当にしたいのであれば、JSと同じように、JavaScriptインタープリタを使ってクライアント側からAJAX呼び出しを行うことができます。クロージャーライブラリは、このためのラッパーを提供しています---ここのドキュメントはhttps://developers.google.com/closure/library/docs/xhrioを見てください。しかし、clojurescript用のいくつかの簡単なhttpとAjaxライブラリもありますので、なぜそれらを使用しないのですか? clojurescriptの喜びと魔法のもう一つの部分は、適用されるGoogle閉包の最適化がデッドコードを取り除くなどの素敵なことをすることです。だから私は間違っていると誰かが私を修正できると思います。 )製造コストはいくつかの余分なライブラリを置くことになります。

  2. Figwheelは本番ではなく最終的に開発されたもので、運用用に設定したhttpサーバに依存しません。確かに、figwheelを使用しているフロントエンドのみのcljsプロジェクトのテンプレートがあります---ここにはone exampleがあります。 Figwheelはブラウザに変更を加えるために独自のサーバーを動かしていますが、どういう仕組みか分かりません。

関連する問題