Seb*_*off 5 clojure ring clojurescript figwheel
注意:我是一个一般经验丰富的程序员,使用 clojure,但从未做过认真的 web 开发。
我使用 Chestnut 设置了一个基本的 ClojureScript 项目,并很好地完成了“Hello World”步骤。但是,我也很想与我的后端交谈。为此,我将试剂代码重新定义为
(defn greeting []
[:input {:type "button"
:value (:text @app-state)
:on-click #(http/get {})}])
Run Code Online (Sandbox Code Playgroud)
单击时会收到 404 响应。所以至少我在和某人说话。我还可以在 server.log 文件中看到我的获取请求的证据。然而,在这一点上,我正在努力解决一些概念上的问题。
首先,http/get 是在 clj-http.client 中定义的一个函数,它不是 Chestnut 设置的一部分。如果我必须去寻找图书馆来发送像 get-request 这样基本的东西,感觉就像我已经偏离了轨道。
其次,用户命名空间的文件具有以下由 Chestnut 预定义的行:
(def http-handler
(wrap-reload #'mypage.server/http-handler))
(defn run []
(figwheel/start-figwheel!))
Run Code Online (Sandbox Code Playgroud)
我看不到任何使用过 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))
Run Code Online (Sandbox Code Playgroud)
我没有完整的答案,但我确实有几点可能会有所帮助。
Clojurescript 最终编译为 JavaScript,并大量使用(并可以访问)Google Closure 库。因此,如果您确实愿意,可以使用 JavaScript 互操作从客户端进行 AJAX 调用,就像在 JS 中一样。闭包库为此提供了一个包装器——请参阅此处的文档https://developers.google.com/closure/library/docs/xhrio。但是 clojurescript 也有几个简单的 http 和 Ajax 库,那么为什么不使用它们呢?clojurescript 的乐趣和魔力的另一部分是,应用的 Google 闭包优化可以做一些可爱的事情,比如删除死代码,所以我相信(如果我错了,其他人可以纠正我)几乎没有(不是? )放入一些额外库的生产成本。
Figwheel 最终是开发版,而不是生产版,并且不依赖于您为生产使用而设置的 http 服务器。事实上,有一些针对仅前端 cljs 项目的模板仍然使用Figwheel——这里有一个例子。Figwheel 旋转它自己的服务器来将更改推送到浏览器,我不太确定它是如何工作的。
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |