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