如何解决如何正确设置 shadow-cljs 以进行热重载?
我一直试图让 shadow-cljs 热重载工作,但我一直没能成功,我在我的 project.clj 文件中尝试了多个设置,但都没有奏效。这是我的 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
时,我知道它只是在运行 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
从头开始创建一个新应用程序,不做任何更改并运行 lein watch,代码编译,一切似乎都很好,但是每当我更改 cljs 文件(例如views.cljs)中的某些内容时,什么都没有重新渲染/重新加载,我去了 localhost:9630,它为您提供了一个 shadow-cljs 仪表板,其中列出了您的构建并单击“强制编译”按钮并在我的应用程序页面中看到 clojurescript 动画,但没有重新渲染/重新加载再次。我注意到当 shadow-cljs 完成编译时,编译了 0 个文件,它是否从其他地方获取源路径配置?这是我尝试测试时的样子:
编辑:也许值得说的是,我在 MobaXterm 中使用 xfce 终端和来自 WSL2 的 emacs 运行 ubuntu,这可能与代码/应用程序不热重载有关吗?
解决方法
一切似乎都按预期顺利运行。可能您唯一缺少的是生命周期回调来触发页面的实际重新呈现。
见https://shadow-cljs.github.io/docs/UsersGuide.html#_hot_code_reload
在大多数重新构建/试剂化应用程序中,这将是调用 reagent.dom/render
(如果您使用的是旧版本,则为 reagent.core
)的函数。
我还写了更多关于这一切如何运作的文章here。
...是否从其他地方获取源路径配置?
shadow-cljs
查看在启动时构建的 JVM 类路径。您似乎在使用 lein
,因此只有 project.clj
在这里很重要,并且类路径是通过添加所有 :source-paths
、:resource-paths
等来构建的。因此,如果您有 :source-paths ["src/clj" "src/cljs" "src/cljc"]
就足够了,当然假设您正在使用的源文件实际上在这些目录中。
否则无法评论您的设置。我在 WSL2 中很好地使用了它,但是如果在容器(例如 docker)内运行会出现已知问题,所以我不排除这里有一些时髦的东西会阻止 shadow-cljs
实际“观看”文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。