我为这个看似愚蠢的问题道歉,但我现在已经玩了几个星期的ClojureScript,我无法弄清楚这个简单的问题:
如何调试ClojureScript?
所以这就是问题所在:
我的问题:
开发ClojureScript应用程序的正确方法是什么?
PS我看过ClojureScriptOne - 我不喜欢的是它将所有技术同时串联在一起;而且我更愿意在将它们链接在一起之前了解如何自己使用每个个人作品。
我对ring + mustache + compojure很满意,[主要是因为我可以使用我的标准Clojure调试技术]但是ClojureScript是另一种野兽。
更新:自首次提出此问题以来,情况发生了很大变化。这些天调试ClojureScript应用程序的正确方法是启用源映射 - http://github.com/clojure/clojurescript/wiki/Source-maps
答案 0 :(得分:26)
更新:直接使用编译器现在很简单。但lein-cljsbuild仍然非常有用。
使用lein-cljsbuild。您可以编写不同的构建(测试,开发,发布)。您可以自动监视文件,以便在更改文件时快速重新编译。您可以轻松使用浏览器repl直接在浏览器中评估代码。您可以管理依赖项。
与您的问题特别相关 - lein-cljsbuild还将合理的警告默认值传递给编译器,以便在您在浏览器中实际运行代码之前获得详细且准确的警告。
答案 1 :(得分:18)
更新:我冒昧地改变原来的答案,因为它已经过时了,我无法取消标记这个答案并标记一个新答案。
调试ClojureScript使用源地图 - http://github.com/clojure/clojurescript/wiki/Source-maps
答案 2 :(得分:6)
最近(2013年10月27日)David Nolen发布了一篇博文,建议使用ClojureScript进行严密的反馈循环和良好的调试体验。
http://swannodette.github.io/2013/10/27/the-essence-of-clojurescript/
“这篇简短的帖子将让您从零到开发源映射的ClojureScript,并在文件保存时即时重新编译。”
希望这也有帮助。
答案 3 :(得分:6)
ClojureScript调试最佳做法(示例项目和教程):
<强> https://github.com/shaunlebron/How-To-Debug-CLJS 强>
生态系统仍然处于不稳定状态,所以我希望通过社区意见来更新,以便为新手提供便利。它目前有四种传统的调试方法:
答案 4 :(得分:5)
如果您想使用Chrome调试器,可以使用以下内容...
(defn debugger []
(js/eval "debugger"))
(debugger)
这非常黑客,但它会激活chrome的调试模式。
请记住,Clojure脚本使用名称空间,这意味着如果您创建了一些变量thing
,那么它将在Chrome控制台的my.namespace.thing
中找到(正如预期的那样)。
答案 5 :(得分:4)
我正在使用piggieback并将我的brepl(浏览器代表)连接到我的nrepl。
这样,您可以在nrepl实例上测试cljs代码,以获得更快的反馈。 你甚至可以在nrepl中执行一些cljs脚本来更改dom。 至于变量状态,我使用像Hendekagon所提到的(js / console.log变量)。 另外,正如dnolen指出的那样,如果你使用调试模式(:optimization:whitespace)进行编译,那么生成的javascript就会变得更容易理解,所以我在chrome js环境中做了断点。
[添加:2013年7月18日] 添加简要步骤来设置nrepl-brepl
我在下面的教程的帮助下设置了brepl环境。 https://github.com/magomimmo/modern-cljs/blob/master/doc/tutorial-02.md
简而言之,您需要在clojurescript代码中的某个地方使用以下代码段。
(repl/connect "http://localhost:9000/repl")
然后在emacs中打开nrepl(我正在使用M-x nrepl-jack-in)
在你的nrepl
中输入以下内容(do
(require 'cljs.repl.browser)
(cemerick.piggieback/cljs-repl
:repl-env
(doto (cljs.repl.browser/repl-env :port 9000)
cljs.repl/-setup)))
您需要在浏览器上显示已运行clj的页面。
通过在nrepl上执行以下来测试你的nrepl是否正常工作。 (js / alert“我准备好了!”)