我正在尝试在ClojureScript中为客户端MVC选择一个库.这是我到目前为止找到的ClojureScript库:
我该如何在它们之间做出选择?此外,他们将如何与使用ClojureScript的AngularJS或Backbone进行比较?
I have recently inherited a non-finished web app written in Clojure, based on compojure and hiccup basically. It's a bad attempt to model some sort of MVC with OO style not in the FP style as seen here . So I bet to re-start the project almost from the scratch reusing the useful parts. I consider these alternatives:
The least breaking alternative would be Compojure+Enlive+jquery-pjax
Using a clojure web framework like Pedestal Any experiences about this?
The initial idea was …
可以推荐使用clojure生态系统中的哪些技术来开发独立的桌面应用程序?我正在寻找的技术应该得到支持
我想到了以下替代方案:
Clojure的/跷跷板:
clojurescript/HTML5/CSS:
座
我正在尝试创建一个非常基本的基座应用程序来显示项目列表,或者如果列表为空则创建一条短信.
我以为我想要的是:
[node-create [] :map] 通过做......什么都没有?[node-create [:root] :map] 通过渲染整页的模板[node-create [:root :items] :map] 通过添加空列表的模板要清楚,我最终想要展示的是(没有元素)
<html>
<div>My list</div>
<p>There is nothing in the list</p>
</html>
Run Code Online (Sandbox Code Playgroud)
当列表中有东西时:
<html>
<div>My list</div>
<ul>
<li>item1</li>
<li>item2</li>
</ul>
</html>
Run Code Online (Sandbox Code Playgroud)
我在这里走在正确的轨道上吗?
我坚持初始化数据模型是我想要的.我得到的最接近的是:
;; behavior.clj
(defn init-root-transform [old-value message]
{})
(defn init-items-transform [old-value message]
[])
(def example-app
{:version 2
;; :transform [[:set-value [:greeting] set-value-transform]]})
:transform [[:bootstrap [:root] init-app-transform]
[:bootstrap-systems [:root :items] init-items-transform]
]})
;; start.cljs
... skipped...
(app/begin app)
(p/put-message …Run Code Online (Sandbox Code Playgroud) 我试图在Pedestal 0.5.1中托管静态资产和服务.我使用::file-path指向一个目录来托管文件.如果我直接导航到文件http:// localhost:8888/index.html,这可以正常工作,但如果我转到站点的根目录http:// localhost:8888,它将提供文件application/octet-stream而不是text/html.我调整了Hello World Sample并且它具有相同的行为.
SRC /程序hello_world/server.clj
(ns hello-world.server
(:require [io.pedestal.http :as http]
[io.pedestal.http.route :as route])
(:gen-class))
(def routes
(route/expand-routes [[]]))
(def service
{:env :prod
::http/join? false
::http/routes routes
::http/file-path "/tmp/www"
::http/type :jetty
::http/allowed-origins {:creds true :allowed-origins (constantly true)}
::http/port 8888})
(defonce runnable-service (http/create-server service))
(defn -main
"The entry-point for 'lein run'"
[& args]
(println "\nCreating your server...")
(http/start runnable-service))
Run Code Online (Sandbox Code Playgroud)
开始 lein run
$ curl …Run Code Online (Sandbox Code Playgroud) 我被引导相信Pedestal是Ring的替代品但是从我看到Pedestal实际上使用Ring的所有例子.这是最令人困惑的!我是否需要了解并了解Ring的工作原理才能有效地使用Pedestal.从本质上讲,Pedestal"站在Ring的肩膀上"还是打算完全取代它?
阅读基座演示文稿(并阅读示例源代码) - 我看到了一个基于变换和操作的模型.
Pedestal是否真的使用类似于Google Wave中使用的操作转换(在这里和这里看)?
clojure google-wave clojurescript operational-transform pedestal
在Pedestal Docs中,它讨论了基座数据流中的以下步骤:
在Pedestal的一位作者的重要项目中,我们看到了以下要素
我的问题是 - 是否得出数据流的未记录的功能?它是联合收割机的新名称吗?这仅仅是基座文档过时的问题吗?
我很欣赏一个基本的 Pedestal 示例,说明如何 (1) 设置在服务器重启后仍然存在的 cookie 和 (2) 使用基于 cookie 的会话;特别是如何获取和设置值。
我有点惊讶没有找到一个使用的例子ring.middleware.session/wrap-session(源代码在这里:https : //github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/session.clj) .
根据这个使用 Ring 中间件的 Pedestal 示例代码,有两个关键的东西要添加到你的service.clj. 首先,定义会话拦截器:
; aliases for namespace :require
[io.pedestal.http.ring-middlewares :as middlewares]
[ring.middleware.session.cookie :as cookie]
(definterceptor session-interceptor
(middlewares/session {:store (cookie/cookie-store)}))
Run Code Online (Sandbox Code Playgroud)
但是,示例代码有这个警告:
在此示例代码中,我们没有指定会话数据在发送回浏览器之前使用的加密密钥。这有两个后果,第一个是我们需要在整个服务中使用相同的拦截器实例,以便会话数据对所有路径都是可读和可写的。第二个后果是当服务器进程结束时会话数据将变得不可恢复。即使浏览器保留了 cookie,它也不是不可恢复的密文,会话拦截器会将其视为不存在。
如何克服上述限制?
其次,添加session-interceptor到您的路线(以下是我的示例代码):
(defroutes routes
[[["/"
{:get [:root root/index]}
^:interceptors [session-interceptor
(body-params/body-params)
bootstrap/html-body]]]]
Run Code Online (Sandbox Code Playgroud)
我知道上面的设置步骤会导致 Ring 中间件向:session请求映射添加一个键。所以获取很容易:(:session request). 但是我如何以及在哪里添加到会话中?一个例子将不胜感激。
我正在使用 Clojure 设置 lacinia-pedestal graphql 服务器,并尝试使用 apollo 使用客户端 javascript 代码访问它。但是,我无法访问本地主机上的 /graphql 端点,因为我试图从 COR 不允许的本地主机源 (localhost:3000) 访问它。如何使用 lacinia-pedestal 设置 COR?
这是服务器端代码(使用 lacinia 教程https://lacinia.readthedocs.io/en/latest/tutorial/component.html 进行设置)
(ns project.server
(:require [com.stuartsierra.component :as component]
[com.walmartlabs.lacinia.pedestal :as lp]
[io.pedestal.http :as http]))
(defrecord Server [schema-provider server]
component/Lifecycle
(start [this]
(assoc this :server (-> schema-provider
:schema
(lp/service-map {:graphiql true})
http/create-server
http/start)))
(stop [this]
(http/stop server)
(assoc this :server nil)))
(defn new-server
[]
{:server (-> {}
map->Server
(component/using [:schema-provider]))})
Run Code Online (Sandbox Code Playgroud)
客户端代码超级简单(使用 Apollo):
const client = new ApolloClient({
uri: …Run Code Online (Sandbox Code Playgroud) 我已将数据发布到基座端点“/my-post。我已按如下方式路由该端点:
[[["/" {:get landing} ^:interceptors [(body-params/body-params) ...]
["/my-post {:post mypost-handler}
....
Run Code Online (Sandbox Code Playgroud)
所以在我看来,这意味着 body-params 拦截器也会针对 /my-post 触发。
在我的后处理程序中我有:
(defn mypost-handler
[request]
****HOW TO ACCESS THEN FORM DATA HERE ****
)
Run Code Online (Sandbox Code Playgroud)
我现在如何访问此处的表单数据?我可以从打印请求中看到我有一个 #object[org.eclipse.jetty.sever.HttpInputOverHTTP..] ,它显然需要进一步处理才能对我有用。
(我必须说,Pedestal 的文档充其量只是相当粗略......)
我正在讨论Pedestal文档
https://github.com/pedestal/pedestal/tree/master/guides/documentation
Run Code Online (Sandbox Code Playgroud)
没有关于如何从模板渲染html的示例.基座甚至有这个功能吗?如果是这样,任何人都可以通过一个例子解释这是如何工作的......
pedestal ×13
clojure ×12
ring ×2
angularjs ×1
backbone.js ×1
compojure ×1
cors ×1
enlive ×1
google-wave ×1
graphql ×1
liberator ×1
middleware ×1
server ×1
session ×1