29

对于这个看似愚蠢的问题,我深表歉意,但我已经断断续续地使用 ClojureScript 几个星期了,我无法弄清楚这个简单的问题:

如何调试 ClojureScript?

所以这里是问题:

  1. 我写我的 *.cjs 文件
  2. 我运行 cljsc/build ...
  3. 我加载我的网页。
  4. 有不好的事情发生。
  5. 我打开 Firefox 控制台。
  6. 我在生成的 js中得到了一行,我觉得难以理解,而且我不知道它来自原始 cljs 文件的哪一行。

我的问题:

开发 ClojureScript 应用程序的正确方法是什么?

PS 我看过 ClojureScriptOne——我不喜欢它的地方是它同时将一堆技术串在一起;而且我更愿意在将它们链接在一起之前了解如何单独使用每个单独的部分。

我对 ring + mustache + compojure 很满意,[主要是因为我可以使用标准的 Clojure 调试技术],但 ClojureScript 是另一种野兽。

更新:自从第一次提出这个问题以来,情况发生了很大变化。现在调试 ClojureScript 应用程序的正确方法是启用源映射 - http://github.com/clojure/clojurescript/wiki/Source-maps

4

5 回答 5

26

更新:现在直接使用编译器很简单。但是 lein-cljsbuild 还是很有用的。

使用lein-cljsbuild。您可以编写不同的构建(测试、开发、发布)。您可以自动监视文件,以便在您更改它们时快速重新编译。您可以轻松地使用浏览器 repl 直接在浏览器中评估代码。您可以管理依赖项。

特别与您的问题相关 - lein-cljsbuild 还将合理的警告默认值传递给编译器,以便您在浏览器中实际运行代码之前获得详细而准确的警告。

于 2012-06-12T15:18:15.130 回答
19

更新:我冒昧地更改了原始答案,因为它已经过时了,我无法取消标记这个答案并标记一个新答案。

要调试 ClojureScript 使用源映射 - https://clojurescript.org/reference/source-maps

于 2012-06-12T04:25:23.350 回答
6

如果要使用 Chrome 调试器,可以使用以下...

(defn debugger []
  (js/eval "debugger"))

(debugger)

这在很大程度上是一个 hack,但它会激活 chrome 的调试模式。

但请记住,Clojure 脚本使用命名空间,这意味着如果您创建了一些变量thing,那么它将my.namespace.thing在 chrome 控制台中找到(如预期的那样)。

于 2013-11-29T05:35:56.207 回答
6

最近(2013 年 10 月 27 日)David Nolen 发布了一篇博客文章,建议使用 ClojureScript 进行紧密的反馈循环和良好的调试体验。

http://swannodette.github.io/2013/10/27/the-essence-of-clojurescript/

“这篇简短的文章将使您从零开始开发源映射 ClojureScript,并在文件保存时立即重新编译。”

希望这也能有所帮助。

于 2013-10-28T15:35:23.967 回答
4

我正在使用piggieback并将我的brepl(浏览器repl)连接到我的nrepl。

这样,您可以在您的 nrepl 实例上测试您的 cljs 代码以获得更快的反馈。您甚至可以在 nrepl 中执行一些 cljs 脚本来更改 dom。至于变量的状态,我使用(js/console.log 变量),就像提到的 Hendekagon 一样。另外,正如 dnolen 所指出的,如果您使用调试模式(:optimization :whitespace)进行编译,那么生成的 javascript 会变得更容易理解,所以我在 chrome js 环境中设置断点。

[添加:2013-07-18] 添加设置 nrepl-brepl 的简要步骤

  1. 我在以下教程的帮助下设置了 brepl 环境。 https://github.com/magomimmo/modern-cljs/blob/master/doc/tutorial-02.md

    简而言之,您需要在 clojurescript 代码中的某处使用以下代码段。

    (repl/connect "http://localhost:9000/repl")
    
  2. 然后在 emacs 中打开 nrepl(我使用的是 Mx nrepl-jack-in)

  3. 在您的 nrepl 中输入以下内容

    (do
     (require 'cljs.repl.browser)
     (cemerick.piggieback/cljs-repl
       :repl-env
       (doto (cljs.repl.browser/repl-env :port 9000)
         cljs.repl/-setup)))
    
  4. 您需要显示在浏览器上运行 cljs 的页面。

  5. 通过在 nrepl 上执行以下命令来测试您的 nrepl 是否正常工作。(js/alert“我准备好了!”)

于 2013-07-17T07:07:31.067 回答