我试图将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)
这些堆栈跟踪(大部分时间与语法错误有关,正如我从实验中所理解的那样)更糟糕而不是没有帮助:不仅它们提供关于错误的零线索,它们还停止自动重新编译。在每次这样的堆栈跟踪之后,我应该做这些事情:
Cmd-C
运行lein cljsbuild auto
lein cljsbuild auto
我无法理解的第三件事是REPL。通过互联网,我了解了如何将rlwrap lein trampoline cljsbuild repl-listen
连接到当前页面。但是,每次重新加载,导航和语法错误(上帝禁止您忘记使用rlwrap
并按箭头键)都会使REPL完全卡住。我必须重新启动它(约10秒)并在此之后重新加载页面,然后再开始在友好的环境中尝试填充。
我认为,可能有人已经全力以赴,并且有一个有效的工作流程。请帮我从一开始就把它全部设置好,因为我觉得自己是一个失败的软件工程师。
答案 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
对此有好处。
我的工作流程是:
rlwrap lein trampoline cljsbuild repl-listen
(repl/connect "http://localhost:9000/repl")
。(my-namespace/my-func a b c)
(load-file "path-to-my-file.cljs")
4
这仍然是一个非常烦人的工作流程。 load-file
缓慢且脆弱,因此有时我会浏览器进行测试。我希望有人能提供更好的答案。