Я пытаюсь использовать 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
еще раз - Внесите какое-нибудь бесполезное изменение, например, вставьте новую строку в файл, чтобы запустить новую сборку.
- Подождите ~ 30 секунд, пока файл снова не скомпилируется, так как JVM снова должна «разогреться».
- Во многих случаях в этот момент я получаю еще один stacktrace, после получения которого приходится намыливать, промывать и повторять всю проклятую процедуру
Третье, чего я не понял, это REPL. Из интернета я узнал, как подключить rlwrap lein trampoline cljsbuild repl-listen
к текущей странице. Однако каждая перезагрузка, навигация и синтаксическая ошибка (не дай Бог вам забыть использовать rlwrap
и нажать клавишу со стрелкой) в консоли приводит к полному зависанию REPL. Я должен перезапустить его (~ 10 секунд) и после этого перезагрузить страницу, а затем снова начать пробовать что-то в дружественной среде.
Я думаю, наверное, кто-то во всем этом разобрался и имеет рабочий процесс, который работает. Пожалуйста, помогите мне настроить все это с самого начала, потому что я чувствую себя неудачливым инженером-программистом.