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 и т. Д. Как только вы настроите его, для совместного использования дополнительных материалов, в основном, будет вставлена ​​копия в один из общих модулей, а затем импортирован куда угодно.

Другие вопросы по тегам