24

我正在尝试将 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 秒),然后重新加载页面,然后在友好的环境中重新开始尝试。

我想,可能有人已经想通了,并且有一个有效的工作流程。请帮助我从一开始就进行设置,因为我觉得自己是一个失败的软件工程师。

4

5 回答 5

5

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

于 2013-01-27T23:06:19.690 回答
3

看看无花果!这就像类固醇上的重载。
使用 clojurescript 和前端开发从未如此有趣!
自己看看(演示有点过时了——现在更好了!)
它不仅会在文件更改时重新加载页面——它还为您提供Bret Victor 所说的交互式编程(如果您没有,我建议您观看该演讲) t)

于 2015-01-22T23:16:06.433 回答
2

我已经在 Emacs 中尝试过这个工具https://github.com/cemerick/austin并且效果很好,正如您在他的演示和截屏视频中看到的那样。

有一个良好的发展娟

于 2013-10-16T10:25:11.263 回答
2

在开发模式下将:optimizations转为:none时,它​​会产生巨大的差异,它不会改变初始编译时间,但任何额外的更改通常只需要几毫秒。

我的 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
                                   }}]}
于 2015-01-13T17:35:13.460 回答
0

小文件的编译时间太大

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

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

我以前没有遇到过这个问题。它看起来像 cljsbuild 中的一个错误。尝试更改另一个版本。我正在[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

这仍然是一个非常烦人的工作流程。load-file缓慢而脆弱,所以有时我会浏览器进行测试。我希望有人可以提供更好的答案。

于 2014-09-25T16:40:44.580 回答