首页 > 解决方案 > 从调用 CLJS 函数的 CLJ 发出 Hiccup 控件

问题描述

看起来这应该很简单,我认为它是......直到我从运行 Figwheel 切换到运行 JAR 文件并且它停止工作。

这个问题可以简化为一个非常简单的例子:

使用 Leiningen“试剂”模板制作一个名为“buttontest”的新应用程序。

在 core.cljs 中添加一些脚本,就在“ns”声明的正下方:

(defn greet [] (js/alert "Hi!"))

在 handler.clj 中添加一个静态按钮:

(defn loading-page [] (html5 (head) 
 [:body {:class "body-container"} mount-target
  ;v v v INSERTED THIS
  [:button {:onclick "buttontest.core.greet()"} "Say Hello"]
  ;^ ^ ^
  (include-js "/js/app.js")]))

执行“lein cljsbuild once”和“lein figwheel”。浏览网站。单击“Say Hello”按钮将触发警报。

回到 shell,执行“lein uberjar”并使用 Java 运行生成的 .JAR 文件。浏览网站。单击“Say Hello”按钮时不会执行任何操作。控制台显示“buttontest 未定义”。

我已经尝试了各种方法(修补/删除“onclick”属性中的命名空间限定,手动包括其他 .JS 文件等),但没有运气。我觉得我错过了一些明显的东西。

有任何想法吗?谢谢。

标签: clojureclojurescriptleiningenreagent

解决方案


尝试给你的greet函数export元标志:

(defn ^:export greet ...)

我想:advanced编译优化会破坏命名空间/函数名称,并:export禁止它(或类似的东西)。


推荐阅读