2012-06-12 38 views
27

我对这个看似愚蠢的问题道歉,但我已经和关闭了几个星期,现在玩ClojureScript,我想不通这一个简单的问题:如何调试ClojureScript

如何我要调试ClojureScript吗?

所以这里的问题是:

  1. 我写我的* .cjs文件
  2. 我跑cljsc /建...
  3. 我加载了我的网页。
  4. 发生了一些不好的事情。
  5. 我打开了Firefox的控制台。
  6. 我在生成的 js中找到一行,我觉得这是不可理解的,我不知道它来自哪个原始cljs文件的行。

我的问题:

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

PS我已经看过ClojureScriptOne - 我不喜欢它的是它将所有的技术一起串起来;我宁愿了解如何在链接它们之前单独使用每个作品。

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

UPDATE:事情发生了很大的变化,因为这个问题首次被问到。调试ClojureScript应用这些天的正确方法是使源地图 - http://github.com/clojure/clojurescript/wiki/Source-maps

回答

26

修订:使用编译器是直接明了了。但lein-cljsbuild仍然非常有用。使用lein-cljsbuild。你可以编写不同的构建(测试,开发,发布)。您可以自动查看文件,以便在更改文件时快速重新编译文件。您可以轻松使用浏览器repl直接在浏览器中评估代码。您可以管理依赖关系。

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

3

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

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

[补充说:2013年7月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. 然后打开nrepl在Emacs(我使用的Mx nrepl插孔式)

  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 /警报“我准备好了!”)

4

如果你想使用Chrome调试器,您可以使用以下...

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

(debugger) 

这不能不说是一个黑客,但它会主动铬的调试模式。请记住,Clojure脚本使用命名空间,这意味着如果您创建了一些变量thing,那么它将在Chrome控制台(如预期的)中找到my.namespace.thing

5

ClojureScript调试的最佳实践(例如项目&教程):

https://github.com/shaunlebron/How-To-Debug-CLJS

生态系统仍然是在不断变化,所以我希望能保持这种更新与社区输入缓解新人的过程。目前,它击中的调试的传统方法四:

  • 记录 - 轻松和描述性记录您的应用程序状态
  • 测试 - 快速测试代码,而无需打开Web浏览器
  • 互动 - 在您的网页上运行时玩您的代码
  • 跟踪 - 暂停并逐步完成代码