有一个很好的ClojureScript工作流程吗?

时间:2013-01-27 20:10:37

标签: clojure workflow read-eval-print-loop clojurescript

我试图将ClojureScript用于项目。要成为一个快乐的开发人员,我需要一个快速的反馈循环:编写一些代码并尽快看到它。我也喜欢在当前页面的上下文中使用REPL。

我正在使用lein-cljsbuild并且从我遇到的问题中我认为我未能正确设置它。

首先,即使在" JWM热身"之后,小文件的编译时间也太大了。与:optimizations :simple

Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Successfully compiled "resources/public/js/cljs.js" in 8.233018 seconds.
Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Successfully compiled "resources/public/js/cljs.js" in 5.522989 seconds.
Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Successfully compiled "resources/public/js/cljs.js" in 8.144354 seconds.

其次,我不时会得到这样的东西:

Compiling "resources/public/js/cljs.js" from ["src-cljs"]...
Compiling "resources/public/js/cljs.js" failed.
Exception in thread "main" java.lang.NullPointerException
at java.util.regex.Matcher.getTextLength(Matcher.java:1140)
at java.util.regex.Matcher.reset(Matcher.java:291)
at java.util.regex.Matcher.<init>(Matcher.java:211)
at java.util.regex.Pattern.matcher(Pattern.java:888)
at clj_stacktrace.utils$re_gsub.invoke(utils.clj:6)

# ... many similar useless lines

at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)

这些堆栈跟踪(大部分时间与语法错误有关,正如我从实验中所理解的那样)更糟糕而不是没有帮助:不仅它们提供关于错误的零线索,它们还停止自动重新编译。在每次这样的堆栈跟踪之后,我应该做这些事情:

  • 使用我称之为“#34;伪装成解析器&#34;”的技术找出问题所在。感谢上帝它的Lisp,我唯一应该做的就是仔细计算匹配的括号。
  • Cmd-C运行
  • 的shell中按lein cljsbuild auto
  • 再次运行lein cljsbuild auto
  • 进行一些无用的更改,例如在文件中插入换行符,以触发新版本
  • 等待约30秒直到再次编译文件,因为JVM必须&#34;预热&#34;再次
  • 在很多情况下,在这一点上,我得到另一个堆栈跟踪,在得到我必须起泡,冲洗并重复所有该死的程序后

我无法理解的第三件事是REPL。通过互联网,我了解了如何将rlwrap lein trampoline cljsbuild repl-listen连接到当前页面。但是,每次重新加载,导航和语法错误(上帝禁止您忘记使用rlwrap并按箭头键)都会使REPL完全卡住。我必须重新启动它(约10秒)并在此之后重新加载页面,然后再开始在友好的环境中尝试填充。

我认为,可能有人已经全力以赴,并且有一个有效的工作流程。请帮我从一开始就把它全部设置好,因为我觉得自己是一个失败的软件工程师。

5 个答案:

答案 0 :(得分:5)

对我来说,Catnip目前为ClojureScript提供了最佳的开发体验。

答案 1 :(得分:3)

查看figwheel!它类似于类固醇的活载 使用clojurescript和前端开发从未如此有趣! See for yourself(演示有点过时了 - 现在它变得更好了!)
它不只是在文件更改时重新加载页面 - 它为您提供了交互式编程Bret Victor was talking about(如果您没有,我建议您观看该话题)

答案 2 :(得分:2)

我已经在Emacs内部尝试了这个工具https://github.com/cemerick/austin,并且可以在他的演示和截屏视频中看到效果非常好。

有一个良好的发展 涓

答案 3 :(得分:2)

在开发模式下,将:优化转为:无时,它会产生巨大差异,它不会更改初始编译时间,但任何其他更改只需要几毫秒通常

我的project.clj

中有以下内容
 :cljsbuild {:builds [{;; Directories of interest:
                        :source-paths ["src"]
                        ;; Compiler flags:
                        :compiler {;; Where to save the file:
                                   :output-to "resources/public/js/app.js"
                                   ;; Where to put the output directory
                                   :output-dir "resources/public/js/out"
                                   ;; Optimizations:
                                   :optimizations :none
                                   }}]}

答案 4 :(得分:0)

  

小文件的编译时间太大

试试:optimizations :whitespace。并使用lein cljsbuild auto

  

其次,我不时会得到这样的东西:......

之前我还没有遇到过这个问题。它看起来像cljsbuild中的一个bug。尝试更改另一个版本。我正在[lein-cljsbuild "1.0.2"]使用[org.clojure/clojurescript "0.0-2156"]1.0.3在我的设置中无效。

  

我无法理解的第三件事是REPL

在您的情况下,关键点是找到重新加载名称空间而不重启REPL或重新加载页面的方法。

我发现load-file对此有好处。

我的工作流程是:

  1. 首先开始REPL:rlwrap lein trampoline cljsbuild repl-listen
  2. 确保我的代码中有(repl/connect "http://localhost:9000/repl")
  3. 在浏览器中打开我的页面。
  4. 做一些测试(my-namespace/my-func a b c)
  5. 编辑我的代码。
  6. 在我的REPL中,运行(load-file "path-to-my-file.cljs")
  7. 重复4
  8. 这仍然是一个非常烦人的工作流程。 load-file缓慢且脆弱,因此有时我会浏览器进行测试。我希望有人能提供更好的答案。