有好的ClojureScript工作流吗?
我正试图在一个项目中使用ClojureScript。要成为一名快乐的开发人员,我需要一个快速的反馈循环:编写一些代码并尽快查看。我还希望在当前页面的上下文中使用REPL 我使用的是有好的ClojureScript工作流吗?,clojure,workflow,read-eval-print-loop,clojurescript,Clojure,Workflow,Read Eval Print Loop,Clojurescript,我正试图在一个项目中使用ClojureScript。要成为一名快乐的开发人员,我需要一个快速的反馈循环:编写一些代码并尽快查看。我还希望在当前页面的上下文中使用REPL 我使用的是lein cljsbuild,从我遇到的问题来看,我认为我没有正确设置它 首先,小文件的编译时间太长,即使在使用:优化:simple“JWM预热”之后: Compiling "resources/public/js/cljs.js" from ["src-cljs"]... Successfully compiled
lein cljsbuild
,从我遇到的问题来看,我认为我没有正确设置它
首先,小文件的编译时间太长,即使在使用:优化:simple
“JWM预热”之后:
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)
从[“src cljs”]编译“resources/public/js/cljs.js”。。。
编译“resources/public/js/cljs.js”失败。
线程“main”java.lang.NullPointerException中出现异常
位于java.util.regex.Matcher.getTextLength(Matcher.java:1140)
位于java.util.regex.Matcher.reset(Matcher.java:291)
位于java.util.regex.Matcher。(Matcher.java:211)
位于java.util.regex.Pattern.matcher(Pattern.java:888)
在clj_stacktrace.utils$re_gsub.invoke(utils.clj:6)
# ... 许多类似的无用线路
在clojure.lang.Var.applyTo(Var.java:532)
在clojure.main.main(main.java:37)
这些堆栈跟踪(大部分时间与语法错误有关,正如我从实验中了解到的那样)比没有帮助更糟糕:它们不仅提供了关于错误的零线索,还停止了自动重新编译。在每次这样的跟踪之后,我应该做以下事情:
- 使用一种我称之为“假装你是解析器”的技术,找出问题所在。谢天谢地,这是Lisp,我唯一应该做的就是仔细计算匹配的括号
- 在运行
的shell中按lein cljsbuild auto
Cmd-C
- 再次运行
lein cljsbuild auto
- 进行一些无用的更改,比如在文件中插入换行符,以触发新的构建
- 等待约30秒,直到再次编译该文件,因为JVM必须再次“预热”
- 在很多情况下,在这一点上,我得到了另一个stacktrace,在得到它后,我必须起泡,冲洗和重复所有该死的程序
rlwrap-lein-trampoline-cljsbuild-repl-listen
连接到当前页面。但是,控制台中的每一次重新加载、导航和语法错误(但愿您不会忘记使用rlwrap
并按箭头键)都会使REPL完全卡住。我必须重新启动它(~10秒),然后重新加载页面,然后在友好的环境中再次尝试
我想,也许有人已经把这一切都弄明白了,并且有了一个工作流程。请帮我从一开始就把它设置好,因为我觉得自己像一个失败的软件工程师。为我提供了目前ClojureScript的最佳开发体验。我在Emacs内部尝试过这个工具,效果非常好,你可以在他的演示和屏幕上看到 发展良好 胡安 小文件的编译时间太长 尝试
:优化:空白
。并使用lein cljsbuild auto
第二,我不时会收到这样的东西:
我以前从未遇到过这个问题。它看起来像cljsbuild中的一个bug。试着换个版本。我正在使用[lein cljsbuild“1.0.2”]
和[org.clojure/clojurescript“0.0-2156”]
。1.0.3
在我的设置中不起作用
第三件我不明白的事是REPL
在您的例子中,关键点是找到一种方法,在不重新启动REPL或重新加载页面的情况下重新加载名称空间
我发现加载文件
对此很有好处
我的工作流程是:
rlwrap lein蹦床cljsbuild REPL listen
(repl/connect“http://localhost:9000/repl“”
在我的代码中(我的命名空间/我的函数a b c)
(加载文件“path to my file.cljs”)
4
这仍然是一个相当烦人的工作流程<代码>加载文件速度慢且脆弱,因此有时我需要使用浏览器进行测试。我希望有人能提供一个更好的答案。在开发模式下,将:optimizations转换为:none,这会产生巨大的差异,不会更改初始编译时间,但任何额外的更改通常只需要几毫秒 我的项目中有以下内容。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
}}]}
退房!就像服用类固醇的利弗雷罗德一样。使用clojurescript和前端开发从来没有这么有趣过
(演示版有点过时,现在更好了!)
它不仅在文件更改时重新加载页面–它还为您提供了交互式编程(如果您没有看过,我建议您观看该演讲)嗨,Valya,我的回答对您使用clojure工作流有帮助吗?我认为这个工作流程非常舒适