Совместное использование кода между сервером и клиентом в Clojurescript / Clojure

StackOverflow https://stackoverflow.com/questions/7830077

  •  27-10-2019
  •  | 
  •  

Вопрос

Скажем, я хотел выделить общий код между моим * .cljs на стороне клиента и * .clj на стороне сервера, напримерразличные структуры данных и общие операции, могу ли я это сделать?Есть ли в этом смысл?

Это было полезно?

Решение

Обновление: начиная с clojure 1.7, ознакомьтесь с условными операторами Clojure reader или cljc . Я с большим успехом использовал cljc, чтобы очень легко разделить большой объем кода между сервером и браузером.

Отличный вопрос! Я тоже много думал об этом в последнее время и написал несколько приложений для экспериментов.

Вот мой список того, чем вы можете поделиться, и плюсы / минусы каждого из них:

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

Надеюсь, эти мысли будут полезными, мне очень интересно, что уже нашли другие!

Другие советы

Я написал плагин cljx Leiningen специально для обработки совместного использования кода Clojure / ClojureScript для библиотеки визуализации данных Clojure.. 95% кода, не связанного с хостом, выглядит одинаково, а cljx позволяет автоматически перезаписывать эти последние 5%, задавая правила перезаписи с помощью core.logic. Однако в большинстве случаев это простая замена символов;clojure.lang.IFn в Clojure - это, например, просто IFn в ClojureScript.

Вы также можете использовать метаданные для аннотирования форм, которые будут включены или исключены при создании кода для конкретной платформы.

Новый плагин lein-cljsbuild для Leiningen имеет встроенный поддержка для обмена чистым кодом Clojure.

Написал небольшой фрагмент кода, чтобы скопировать подмножество кода закрытия моего сервера в мой код clojurescript, переименовав его в .cljs перед сборкой:

родовое слово

Этот вопрос появился раньше, чем cljc, но, поскольку я наткнулся на него, я подумал, что упомяну Clojure условия чтения .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top