gpt4 book ai didi

clojure - 无需重启 Web 服务器的 Compojure 开发

转载 作者:行者123 更新时间:2023-12-02 09:35:15 25 4
gpt4 key购买 nike

我之前用 Clojure 编写过一个小型 Swing 应用程序,现在我想创建一个 Ajax 风格的 Web 应用程序。 Compojure 看起来是目前最好的选择,所以这就是我要尝试的。

我想要一个真正的微小编辑/尝试反馈循环,所以我不希望在每次做小的更改后重新启动网络服务器。

实现这一目标的最佳方法是什么?默认情况下,我的 Compojure 设置(带有 ant deps/ant 和 Jetty 的标准内容)似乎不会重新加载我所做的任何更改。我必须重新启动 run-server 才能看到更改。由于 Java 的继承和系统启动的方式等原因,这可能是完全正常的,并且当我从命令行启动系统时应该如此。

不过,必须有一种方法可以在服务器运行时动态地重新加载内容。我应该使用 REPL 中的 Compojure 来实现我的目标吗?如果应该的话,我该如何重新加载我的东西呢?

最佳答案

这是一个相当老的问题,最近发生了一些变化,使这个问题变得更加容易。

您想要的主要有两件事:

  1. 控制权应返回到 REPL,以便您可以继续与服务器交互。这是通过添加 {:join? false} 启动 Jetty 服务器时的选项。
  2. 您希望在文件更改时自动获取某些命名空间中的更改。这可以通过 Ring 的“wrap-reload”中间件来完成。

玩具应用程序如下所示:

(ns demo.core
(:use webui.nav
[clojure.java.io]
[compojure core response]
[ring.adapter.jetty :only [run-jetty]]
[ring.util.response]
[ring.middleware file file-info stacktrace reload])
(:require [compojure.route :as route] view)
(:gen-class))

; Some stuff using Fleet omitted.

(defroutes main-routes
(GET "/" [] (view/layout {:body (index-page)})
(route/not-found (file "public/404.html"))
)

(defn app
[]
(-> main-routes
(wrap-reload '(demo.core view))
(wrap-file "public")
(wrap-file-info)
(wrap-stacktrace)))

(defn start-server
[]
(run-jetty (app) {:port 8080 :join? false}))

(defn -main [& args]
(start-server))

wrap-reload 函数使用检测列出的命名空间中的更改的函数来装饰您的应用程序路由。处理请求时,如果磁盘上的这些命名空间已更改,则会在进一步处理请求之前重新加载它们。 (我的“ View ”命名空间是由 Fleet 动态创建的,因此每当我的模板发生更改时,它也会自动重新加载它们。)

我添加了一些其他我发现始终有用的中间件。包装文件处理静态资源。 wrap-file-info 设置这些静态资源的 MIME 类型。 wrap-stacktrace 有助于调试。

在 REPL 中,您可以使用命名空间并直接调用 start-server 来启动此应用程序。 :gen-class 关键字和 -main 函数意味着应用程序也可以打包为 uberjar,以便从 REPL 外部启动。 (REPL 之外还有一个世界?好吧,无论如何,有些人已经要求了......)

关于clojure - 无需重启 Web 服务器的 Compojure 开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1665760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com