2016-07-29 18 views
0

Я привык работать с Dart, где совместное использование типов между сервером и клиентом так же просто, как импорт соответствующих пакетов в ваш проект.Yesod - общие типы между сервером и клиентом

Может ли нечто подобное быть выполнено с помощью Yesod/Haskell? Должен ли я использовать GHCJS для клиента? Может быть, Элм? Цель состоит не в том, чтобы беспокоиться о том, что данные становятся искаженными в пути между сервером и клиентом, - а также не нужно писать одну строку JS. : o)

Я не смог найти ни одного хорошего, начинающего дружественного документа о том, как лучше всего решить эту проблему, используя Haskell. Я подозреваю, что просто не посмотрел в нужные места. Любая помощь более чем приветствуется.

+2

Проект [elm-export] (https://github.com/krisajenkins/elm-export), который создает типы и декодеры на основе типов Haskell. Это похоже на самую последнюю версию этой группы. –

+0

Существует также [haste.app] (https://hackage.haskell.org/package/haste-compiler-0.4/docs/Haste-App.html), «безопасная для типа клиент-сервер среда связи». Я не знаю, будет ли он хорошо интегрироваться с Йесодом. –

ответ

1

Для достижения этой цели с GHCJS вы можете просто создать свой проект из трех основных пакетов таким образом:

  • фронтэнда - что-то на основе ghcjs-дом, мне нравится Reflex-dom
  • бэкенд - использовать свой любимый рамки, мне нравится Snap, Йесод должен работать точно так же
  • общие - код распределяется между внешним и внутренним

Там, где интерфейс и бэкэнд зависят от общего курса. Фронтмен составлен с помощью GHCJS, бэкэнд с GHC.

Если вы хотите увидеть полный пример, я очень рекомендую изучить hsnippet. Взгляните на WsApi.hs, где определяется набор сообщений вверх и вниз. Все экземпляры JSON выводятся в одном месте и импортируются как в frontend, так и в backend.

Hsnippet использует websockets. Конечно, это не обязательно. Вы можете использовать обычный XHR в своем приложении. Принцип остается неизменным. Вы определяете свои API и экземпляры сериализации (обычно JSON) в общем пакете и импортируете соответствующие модули как в интерфейсе, так и в бэкэнд.

Лично я также передаю код проверки, определения сущностей базы данных, сгенерированные с постоянным и т. Д. После того, как вы настроили его, общий доступ к материалам - это в основном скопировать копию в один из разделяемых модулей, а затем импортировать где угодно.

Смежные вопросы