Существует ли хороший рабочий процесс ClojureScript?

Я пытаюсь использовать 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 секунд) и после этого перезагрузить страницу, а затем снова начать пробовать что-то в дружественной среде.

Я думаю, наверное, кто-то во всем этом разобрался и имеет рабочий процесс, который работает. Пожалуйста, помогите мне настроить все это с самого начала, потому что я чувствую себя неудачливым инженером-программистом.


person Valentin Golev    schedule 27.01.2013    source источник
comment
Привет, Валя, помог ли тебе мой ответ с рабочим процессом clojure? Я думаю, что этот рабочий процесс очень удобен   -  person tangrammer    schedule 21.10.2013


Ответы (5)


Проверьте figwheel! Это как перезагрузка на стероидах.
Никогда еще работа с clojurescript и интерфейсной разработкой не была такой увлекательной!
Убедитесь сами (демонстрация немного устарела — теперь она стала еще лучше!)
Он не просто перезагружает страницу при изменении файлов — он предоставляет вам интерактивное программирование Брет Виктор говорил о (рекомендую вам посмотреть это выступление, если вы еще не смотрели)

person t3chn0b0y    schedule 22.01.2015

Для меня Catnip на данный момент обеспечивает лучший опыт разработки для ClojureScript.

person Dimagog    schedule 27.01.2013

Я пробовал внутри Emacs этот инструмент https://github.com/cemerick/austin и работает очень хорошо. как вы можете видеть в его демо и скринкасте.

Удачного развития Хуан

person tangrammer    schedule 16.10.2013

Когда в режиме разработки измените :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
                                   }}]}
person Paul Whelan    schedule 13.01.2015

время компиляции для маленького файла слишком велико

Попробуйте :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 медленный и хрупкий, поэтому иногда я использую браузер для тестирования. Я надеюсь, что кто-то может дать лучший ответ.

person Ming    schedule 25.09.2014