如何正确设置 shadow-cljs 以进行热重载?

How to properly setup shadow-cljs for hot reload?

我一直在尝试让 shadow-cljs 热重载工作,但我一直无法做到,我在我的 project.clj 文件中尝试了多个设置,但 none 有效.这就是我的 project.clj 的样子:

:shadow-cljs {:nrepl {:port 8777}
                
                :builds {:app {:target :browser
                               :output-dir "resources/public/js/compiled"
                               :asset-path "/js/compiled"
                               :modules {:app {:init-fn my-app.core/init
                                               :preloads [devtools.preload]}}

                               :devtools {:http-root "resources/public"
                                          :http-port 8080
                                          :http-handler my-app.handler/dev-handler
                                          }}}}

:aliases {"watch"        ["with-profile" "dev" "do"
                          ["shadow" "watch" "app"]]}

:profiles
  {:dev
   {:dependencies [[binaryage/devtools "1.0.2"]]
    :source-paths ["dev"]} ;; <- this is the default from the template pointing to "dev", I've tried chaning it multiple times.
  }

当我 运行 lein watch 我明白它只是 运行ning shadow-cljs watch app 应该 运行 我的“应用程序”构建。这是我的开发处理程序的样子(在 :http-handler 中引用):

(def dev-handler (-> api-routes
                     wrap-params
                     wrap-json-response
                     wrap-keyword-params
                     wrap-json-params
                     wrap-multipart-params
                     wrap-reload
                     (wrap-resource "public")
                     (utils/cors-wrapper utils/cors-policy)
                     (utils/wrap-content-type-security)
                     (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))))

我尝试将我的 :dev 配置文件中的源路径 更改为 ["src"],甚至尝试将所有内部文件夹包含在 ["src/clj" "src/cljs" "src/cljc"] 中没有成功。我什至尝试过从头开始创建一个新的应用程序 lein new re-frame 不做任何更改 运行ning lein watch,代码编译并且一切看起来都很好但是每当我在 cljs 文件中更改某些内容时(views.cljs 例如)没有什么是 re-rendered/reloaded,我去了 localhost:9630,它给你一个 shadow-cljs 仪表板列出你的构建并点击“强制编译”按钮并在我的中看到一个 clojurescript 动画应用程序的页面,但又没有 re-rendering/reloading。我注意到当 shadow-cljs 完成编译时,编译了 0 个文件,它是否从其他地方获取源路径配置?这是我尝试测试时的样子:

编辑:也许值得一提的是,我在 MobaXterm 中 运行ning ubuntu 使用 xfce 终端和来自 WSL2 的 emacs,它是否与 code/app 无关热重装?

一切似乎都运行 顺利且符合预期。可能您唯一缺少的是生命周期回调来触发页面的实际重新呈现。

https://shadow-cljs.github.io/docs/UsersGuide.html#_hot_code_reload

在大多数 re-frame/reagent 应用程序中,这将是调用 reagent.dom/render 的函数(如果您使用的是旧版本,则调用 reagent.core)。

我还写了更多关于这一切如何运作的文章here

... is it getting the source-paths config from somewhere else?

shadow-cljs 查看 JVM 类路径,但是它是在启动时构建的。您似乎正在使用 lein,因此只有 project.clj 在这里很重要,类路径是通过添加所有 :source-paths:resource-paths 等构建的。所以如果你有 :source-paths ["src/clj" "src/cljs" "src/cljc"] 就足以让它被拾取,当然假设你正在使用的源文件实际上在那些目录中。

否则无法评论您的设置。我在 WSL2 中使用它很好,但是如果 运行 在容器内(例如 docker)存在已知问题,所以我不排除这里有一些时髦的东西阻止 shadow-cljs 实际上“观看” " 文件。