我正在尝试将 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)
这些堆栈跟踪(大部分时间与语法错误有关,正如我从实验中了解到的那样),比没有帮助更糟糕:它们不仅提供有关错误的零线索,而且还会停止自动重新编译。在每次这样的堆栈跟踪之后,我应该做这些事情:
- 找出问题所在,使用我称之为“假装你是解析器”的技术。感谢上帝,这是 Lisp,我唯一应该做的就是仔细计算匹配的括号。
- 按下运行
Cmd-C
的外壳lein cljsbuild auto
lein cljsbuild auto
再次运行- 进行一些无用的更改,例如在文件中插入换行符以触发新构建
- 等待约 30 秒,直到文件再次编译,因为 JVM 必须再次“预热”
- 在许多情况下,此时我会得到另一个堆栈跟踪,在得到它之后我必须起泡、冲洗并重复所有该死的过程
我不明白的第三件事是 REPL。从互联网上,我学会了如何连接rlwrap lein trampoline cljsbuild repl-listen
到当前页面。然而,控制台中的每一次重新加载、导航和语法错误(上帝保佑你忘记使用rlwrap
并按下箭头键)都会使 REPL 完全卡住。我必须重新启动它(约 10 秒),然后重新加载页面,然后在友好的环境中重新开始尝试。
我想,可能有人已经想通了,并且有一个有效的工作流程。请帮助我从一开始就进行设置,因为我觉得自己是一个失败的软件工程师。