【问题标题】:Reloading Clojure Code/Routes - Issue with using the symbol vs. var重新加载 Clojure 代码/路由 - 使用符号与 var 的问题
【发布时间】:2015-04-14 17:50:43
【问题描述】:

我是 Clojure 的新手,正在尝试设置一些简单的网络路由。我希望路由在开发中重新加载所有相关代码,但不是在生产中。

我只能使用 var 的路由而不是实际的符号来让它工作。如果我做错了,有人可以解释一下吗?如果不是,为什么需要 var?

(def app-handler
  (let [formats [:json-kw :edn :yaml-kw :yaml-in-html :transit-json :transit-msgpack]
        wrapped-api (wrap-restful-format #'routes/api-routes :formats formats)
        combined-routes (compojure.core/routes wrapped-api #'routes/html-routes)
        with-defaults (wrap-defaults combined-routes api-defaults)]
    (if (is-dev?)
      ; Development
      (wrap-reload with-defaults)
      ; Production
      with-defaults)))

(请注意上面的#'routes/api-routes#'routes/html-routes)。

【问题讨论】:

  • 这是因为 app-handler 关闭了您的路由功能,如果您不使用 var,则提供您的 app-handler 作为参数的服务器实例无法查看更新。有关更完整的说明和演示,请参阅this answer
  • @noisesmith 感谢您的快速回复!另一个答案很好,我只是不知道要搜索什么。与使用取消引用值的其他方法相比,使用 var 会对性能产生任何有意义的影响吗?
  • var 被认为是执行此操作的标准方法(至少在开发期间)。
  • 如果你想回答我会接受:)

标签: clojure reload compojure


【解决方案1】:

in another answer 更详细描述的方式,服务器最终会在传入路由函数时捕获它们,如果您提供 var,这将确保服务器使用任何更新的定义。

这被认为是在开发过程中提供路由或处理程序函数的正常方式,因此您无需重新启动 Web 服务器进程即可查看更新的定义。

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多