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