Clojure + ClojureScript 動かしてみたのでメモ その2
日記「Clojure + ClojureScript 動かしてみたのでメモ - oknknicの日記」のコードを、
下記チュートリアルを参考に、shoreleave-remote-ring を利用(defremoteおよびremote-callback)して書き換えてみたのでメモ。
追加構成
- shoreleave-remote-ring :Ring/Compojure を well‐behaved にする Clojure ライブラリ。shoreleave-remote を内部で利用する
- shoreleave-remote :様々なリモートコールオペレーションを実装した ClojureScript ライブラリ
実装
project.clj
- :dependencies への追加
[shoreleave/shoreleave-remote-ring "0.3.0"] [shoreleave/shoreleave-remote "0.3.0"]
- :dependencies の変更(バージョン)
[org.clojure/clojure "1.5.1"] [org.clojure/clojurescript "0.0-1586"] [domina "1.0.2-SNAPSHOT"] [compojure "1.1.5"]
- :plugins への追加
[lein-ring "0.6.3"]
- :ring の追加
:ring {:handler client-server.server/app}
server.clj
(ns client-server.server (:require [compojure.core :refer [defroutes GET]] [compojure.route :refer [resources not-found]] [compojure.handler :refer [site]] [ring.util.response :refer [resource-response]] [shoreleave.middleware.rpc :refer [defremote wrap-rpc]])) (defroutes app-routes (GET "/" request (resource-response "public/index.html")) (resources "/") (not-found "Page non found")) (def handler (site app-routes)) (def app (-> (var handler) (wrap-rpc) (site))) (defremote eval-clojure [expr] (-> (try (eval expr) (catch Throwable t (str "ERROR: " t)))))
client.cljs
(ns client-server.client (:require [domina :as dom] [domina.events :as ev] [shoreleave.remotes.http-rpc :refer [remote-callback]] [cljs.reader :refer [read-string]])) (defn ^:export main [] (ev/listen! (dom/by-id "eval-button") :click (fn [event] (let [expr (read-string (dom/value (dom/by-id "eval-expr")))] (remote-callback :eval-clojure ; ★サーバサイドでdefremoteした名前を直接指定★ [expr] #(dom/set-text! (dom/by-id "eval-result") %))))))
ビルド
lein cljsbuild clean lein cljsbuild once
実行
lein ring server-headless