Обновление: начиная с версии 1.7, проверьте Условия чтения Clojure или cljc . Я с большим успехом использовал cljc, чтобы очень легко обмениваться большим количеством кода между сервером и браузером.
Отличный вопрос! В последнее время я тоже много думал об этом и написал несколько приложений для экспериментов.
Вот мой список типов вещей, которыми вы можете поделиться и плюсы / минусы каждого:
- Большинство моих клиентских файлов cljs содержат код, который манипулирует dom. Поэтому не имеет смысла делиться этим с сервером
- Большая часть серверной части имеет дело с вызовами файловой системы и базы данных. Я полагаю, вы можете вызвать базу данных с клиента (особенно если вы используете одну из баз данных no-sql, поддерживающих вызовы javascript). Но даже тогда я чувствую, что вы должны либо выбрать вызов db из клиента, либо вызов db с сервера, и поэтому нет смысла делиться кодом db.
- Одной из областей, где совместное использование, безусловно, является ценным, является возможность совместного использования и передачи структур данных clojure (вложенных комбинаций списков, векторов, наборов и т. Д.) Между клиентом и сервером. Не нужно конвертировать в json (или xml) и обратно. Например, возможность передавать представления типа hiccup в стиле «назад-вперед» очень удобна. В gwt я использовал gilead для обмена моделями между клиентом и сервером. Но в clojure вы можете просто передавать структуры данных, так что на самом деле нет необходимости делиться определениями классов, как в gwt.
- Одна область, в которой мне нужно больше экспериментировать, - это совместное использование состояния между клиентом и сервером. На мой взгляд, существует несколько стратегий: сохранение состояния на клиенте (одностраничные приложения типа ajax) или сохранение состояния на сервере (например, унаследованные приложения jsp) или их комбинация. Возможно, код, отвечающий за обновление состояния (атомы, ссылки, агенты или что-то еще), может быть разделен, а затем состояние может передаваться взад и вперед по запросу и ответу, чтобы синхронизировать два уровня? До сих пор простое написание сервера с использованием лучших методик REST, а затем сохранение состояния на клиенте, кажется, работает довольно хорошо. Но я мог видеть, как могут быть преимущества совместного использования состояния между клиентом и сервером.
- Мне еще не нужно было делиться константами и / или свойствами, но это может быть полезно для повторного использования. Если вы поместите все глобальные константы вашего приложения в файл clj, а затем напишите сценарий для его копирования в cljs всякий раз, когда вы скомпилируете clojurescript, это должно работать нормально и может сэкономить немного дублирования кода.
Надеюсь, что эти мысли полезны, мне очень интересно, что уже нашли другие!