Yesod - общие типы между сервером и клиентом
Я привык работать с Dart, где совместное использование типов между сервером и клиентом так же просто, как импорт соответствующих пакетов в ваш проект.
Может ли нечто подобное быть достигнуто с помощью Yesod/Haskell? Должен ли я использовать GHCJS для клиента? Может вяза? Цель состоит в том, чтобы не беспокоиться о том, что данные будут искажены при передаче между сервером и клиентом, а также о том, что не нужно писать ни одной строки JS.: О)
Я не смог найти хороших, дружественных для начинающих документов о том, как лучше всего справиться с этой задачей, используя Haskell. Я подозреваю, что просто не смотрел в нужных местах. Любая помощь более чем приветствуется.
1 ответ
Чтобы достичь этого с GHCJS
Вы можете просто построить свой проект из трех основных пакетов следующим образом:
- внешний интерфейс - что-то основанное на ghcjs-dom, мне нравится Reflex-dom
- backend - используйте ваш любимый фреймворк, мне нравится Snap, Yesod должен работать точно так же
- shared - код, общий для внешнего интерфейса и внутреннего интерфейса
Где и фронтэнд и бэкэнд зависят от общего конечно. Фронтенд составлен с GHCJS
, бэкенд с GHC
,
Если вы хотите увидеть полный пример, я настоятельно рекомендую изучить hsnippet. Взгляни на WsApi.hs
где определяется набор восходящих и нисходящих сообщений. Все экземпляры JSON создаются в одном месте и импортируются как во внешний, так и во внутренний.
Hsnippet использует веб-сокеты. Это не требование, конечно. Вы можете использовать обычный XHR в своем собственном приложении. Принцип остается прежним. Вы определяете свой API и экземпляры сериализации (обычно JSON) в общем пакете и импортируете соответствующие модули как во внешнем, так и во внутреннем.
Лично я также делюсь кодом проверки, определениями сущностей базы данных, сгенерированными с помощью persistent и т. Д. Как только вы настроите его, для совместного использования дополнительных материалов, в основном, будет вставлена копия в один из общих модулей, а затем импортирован куда угодно.