Недавно я писал в блоге об использовании ClojureScript для нового внутреннего приложения на работе. После некоторых начальных трудностей я наконец-то справился с этим. Я думал, что пришло время, я поделился некоторыми соображениями
Поскольку приложение, которое мы создаем, предлагает REST API для использования несколькими клиентами, мы решили с самого начала съесть собачью еду и заставить веб-интерфейс использовать тот же API. Итак, то, что мы делаем с ClojureScript, является чисто клиентским веб-проектом.
Генерация HTML
Поскольку мы делаем чистое клиентское приложение, нам нужен был какой-то шаблон на стороне клиента. Я не чувствую , что возиться с HTML после привыкания к икать в Compojure , поэтому мы использовали РОМ хелперов имен из TwitterBuzz демо ClojureScript. Теперь мы можем генерировать разметку следующим образом:
(dom/build [:div#content [:h1 title] [:div#messages [:div#message-input [:div [:label "Your name:"] [:input#author-name-input {:type "text"}]] [:textarea#message-textarea] [:button#send-button "Send message"]] [:div#message-list]]]))
В Доме-хелперы в основном хорошая абстракция для манипулирования DOM утилитов Google закупоривающих. Я уверен, что ClojureScript будет включать что-то подобное в будущем.
Как избежать закрытия Google
Зная, что его используют удивительные веб-приложения, такие как Google Docs, я действительно хотел дать Google Closure, который включен в ClojureScript, шанс. Функции утилиты на самом деле довольно удобны, но отсутствие документации делает использование большинства компонентов, например, виджетов пользовательского интерфейса, непростой задачей. Добавьте к этому тот факт, что больше похоже на использование громоздкой инфраструктуры Java, чем на библиотеку JavaScript, я решил по возможности избегать этого. Google Closure технически сложен, но ему не хватает элегантности и удобства.
Здание с Лейнингеном
Когда мы начали использовать ClojureScript, мы создали его из исходного кода и вызвали компилятор ClojureScript из файла Makefile. Я не могу начать говорить вам, как странно это чувствовало. Поскольку мы используем Leiningen для создания бэкэнда, мы решили использовать его и для внешнего интерфейса, поэтому я написал собственный плагин Leiningen, который выполняет необходимые нам задачи, например, вызывает компилятор ClojureScript и упаковывает вывод в файл WAR. Мы не планируем выпускать этот плагин, он довольно сильно привязан к нашим потребностям и не продуман до конца.
Вместо этого я начал вносить свой вклад в lein-clojurescript , сначала заставив его работать со стабильной версией Leiningen. Автору нравятся мои идеи о предложении нескольких режимов для разработки и производства, а также о настройке соответствующих параметров в project.clj, так что это плагин, который вы хотите использовать.
Перспективные вещи
REPL в браузере
Когда ClojureScript был впервые анонсирован некоторое время назад, REPL использовал Rhino для оценки JavaScript, и манипулирование DOM было невозможно. Разработчики ClojureScript решили эту проблему и сделали возможным использование браузера в качестве среды оценки. Это выглядит многообещающе , но я пока не нашел времени поиграть с ним.
Компилирование автоматически
Компиляция без оптимизации довольно быстрая, но при запуске веб-разработки вручную вызывать компилятор перед обновлением браузера все равно не так. cljs-watch пытается решить эту проблему, просматривая исходные коды ClojureScript и перекомпилируя их, как только что-то изменится, например, вы сохраните файл. Я обманул это, но не мог заставить это работать сразу, поэтому я отложил это. Я думаю, что-то подобное можно встроить в lein-clojurescript.
Проблемы
Как я уже говорил вам в начале этого поста, я очень доволен ClojureScript. Нам пришлось приложить дополнительные усилия для настройки среды разработки и построения системы, но теперь мы готовы к ускорению. Однако остается несколько проблем.
Нет модульного тестирования
Я еще не потратил время на то, чтобы выяснить, как выполнять модульные тесты для кода ClojureScript, и, вероятно, теперь будет проще, если мы будем строить с Leiningen. К этому я должен скоро подойти, работать без тестов очень плохо.
Все еще нет релиза
Я действительно не знаю, почему Clojure / основные люди объявили ClojureScript, не имея готового кандидата на выпуск ClojureScript или даже тега. Это не изменилось. Сначала мы разработали проект ClojureScript на GitHub и создали тег для обеспечения воспроизводимых сборок. Теперь, когда мы используем lein-clojurescript, мы используем версию ClojureScript от Clojars, но это не намного лучше — это все еще произвольный снимок.
Вывод
Несмотря на проблемы, ClojureScript произвел очень хорошее первое и второе впечатление. Он оказался очень стабильным (я не сталкивался ни с одной странностью компилятора, которую я много видел в GWT ), что заставило меня снова серьезно относиться к языкам, которые компилируются в JavaScript. Вместо того, чтобы жаловаться на неудобства программиста и незрелые инструменты, я решил внести свой вклад, начиная с lein-clojurescript. Как только он станет достаточно мощным, чтобы заменить наш пользовательский плагин, я посмотрю, смогу ли я помочь с самим ClojureScript, ему действительно нужен первоначальный выпуск.