Подтвердить что ты не робот

Есть ли хороший рабочий процесс 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)

Эти stacktraces (в большинстве случаев связанные с синтаксическими ошибками, как я понял из экспериментов) хуже, чем не полезно: не только они дают нулевые подсказки об ошибке, но также останавливают автоматическую перекомпиляцию. После каждой такой stacktrace я должен делать следующее:

  • Подумайте, в чем проблема, используя технику, которую я называю "притворяюсь, что вы парсер". Слава богу, это Lisp, и единственное, что я должен сделать, это тщательно подсчитать совпадающие круглые скобки.
  • Нажмите Cmd-C в оболочке, где выполняется lein cljsbuild auto
  • Запустите lein cljsbuild auto снова
  • Сделайте несколько бесполезных изменений, таких как вставка новой строки, в файл, чтобы запустить новую сборку
  • Подождите ~ 30 секунд, пока файл не будет скомпилирован снова, так как JVM снова должен "разогреться"
  • Во многих случаях на этом этапе я получаю еще один стек, после получения которого я должен намыться, ополоснуть и повторить всю проклятую процедуру.

Третья вещь, которую я не понял, - REPL. Из interwebs я узнал, как подключить rlwrap lein trampoline cljsbuild repl-listen к текущей странице. Тем не менее, каждая перезагрузка, навигация и синтаксическая ошибка (не дай бог, чтобы вы забыли использовать rlwrap и нажмите клавишу со стрелкой) в консоли делает REPL полностью застрявшим. Я должен перезапустить его (~ 10 секунд) и перезагрузить страницу после этого, а затем начать снова пробовать вещи в дружественной среде.

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Хорошее развитие Juan

Ответ 4

Когда в режиме разработки оберните : оптимизация до : 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
                                   }}]}

Ответ 5

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

Попробуйте :optimizations :whitespace. И используйте lein cljsbuild auto

Во-вторых, время от времени я получаю такие вещи:......

Я раньше не встречал эту проблему. Это похоже на ошибку в cljsbuild. Попытайтесь изменить другую версию. Я использую [lein-cljsbuild "1.0.2"] с [org.clojure/clojurescript "0.0-2156"]. 1.0.3 не работает в моей настройке.

Третья вещь, которую я не понял, - REPL

В вашем случае ключевым моментом является поиск способа перезагрузки пространств имен без перезапуска REPL или перезагрузки страницы.

Я считаю, что load-file хорош для этого.

Мой рабочий процесс:

  • Первый запуск REPL: rlwrap lein trampoline cljsbuild repl-listen
  • Убедитесь, что в моем коде есть (repl/connect "http://localhost:9000/repl").
  • Откройте мою страницу в браузере.
  • Сделайте несколько тестов (my-namespace/my-func a b c)
  • Изменить мои коды.
  • В моем REPL запустите (load-file "path-to-my-file.cljs")
  • Повторить 4

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