Сравнение веб-фреймворков Haskell Snap и Yesod

Два веб-фреймворка Haskell в новостях в последнее время Yesod (в 0.8) и Snap (на 0.4).

Совершенно очевидно, что Yesod в настоящее время поддерживает гораздо больше функций, чем Snap. Однако я не могу выдержать синтаксис, используемый Yesod для его HTML, CSS и Javascript.

Итак, я хотел бы понять, чего бы мне не хватало, если бы я пошел с Snap. Например, похоже, что поддержка базы данных отсутствует. Как насчет сеансов? Другие функции?

Ответ 1

Полное раскрытие: я являюсь одним из ведущих разработчиков Snap.

Прежде всего, расскажите, что такое Snap. В настоящее время команда Snap поддерживает пять различных проектов по хаке: snap-core, snap-server, heist, snap и xmlhtml. snap-server - это веб-сервер, который предоставляет API, определенный snap-core. heist - система шаблонов. xmlhtml - это библиотека XML и HTML-анализа и рендеринга, используемая функцией heist. snap - это зонтичный проект, который склеивает их все вместе и предоставляет мощный API-интерфейс snaplets, который делает веб-приложения составными и модульными.

У Yesod есть множество проектов по хакерству. Большинство (все?) Из них перечислены в категории Yesod. Некоторые из известных - это ядро-ядро, warp, persistent и hamlet.

Реальность веб-разработки Haskell заключается в том, что она намного меньше исключительного или выбора, чем кажется воспринимаемым. В целом проекты очень слабо связаны и довольно взаимозаменяемы. Вы можете создать веб-сайт, используя warp (веб-сервер команды Yesod), heist (система шаблонов Snap) и кислотное состояние (система сохранения проекта Happstack). Вы также можете использовать snap-сервер с деревом или постоянным.

Тем не менее, эти два проекта определенно имеют некоторые отличия. Самое большое различие, которое я могу отметить объективно, заключается в том, что проекты Yesod, как правило, активно используют Template Haskell и quasiquoting для создания сжатых DSL, а проекты Snap - к созданию библиотек-комбайнов, которые способствуют компоновке. Почти любые другие различия, о которых я могу думать, будут субъективно предвзяты к Snap. Предполагается, что пакеты зонтов, названные в честь обоих проектов, будут делать конкретные варианты для вышеупомянутых компонентов, и эти варианты будут отражены в зависимостях проекта. Но это все еще не означает, что вы не можете втягивать что-то другое и использовать его также.

У Snap есть сеансы и аутентификация, интерфейсы к нескольким базам данных и хорошая обработка формы (здесь и здесь), используя digestive-functors, который включает предварительно упакованная поддержка для произвольно вложенных динамически значимых списков. Это лишь некоторые из растущей экосистемы подключаемых snaplets. Сеансы и проверки подлинности записываются таким образом, что это агностик. Поэтому с небольшим количеством кода клея вы сможете использовать его практически с любой системой сохранения, о которой вы можете думать. В будущем Snap будет придерживаться этой политики как можно чаще.

По большей части, я думаю, что выбор Snap vs Yesod vs Happstack - это менее проблема особенностей и более личного вкуса. Всякий раз, когда кто-то говорит, что у одной из фреймворков нет чего-то другого, большую часть времени довольно легко вывести недостающую функциональность из другой структуры, импортировав необходимый пакет.

EDIT: для более подробного сравнения трех основных веб-фреймворков Haskell ознакомьтесь с моим недавним сообщением . Для более грубого (но, возможно, более полезного) сравнения с использованием более общих обобщений см. Мою Матрицу сравнения веб-макетов Haskell

Ответ 2

Яркое предупреждение: я ведущий разработчик Yesod.

Я не уверен, что вам не нравится в синтаксисе Javascript: это простой javascript с переменной интерполяцией. Что касается CSS, в Yesod теперь есть Lucius, который позволяет вам использовать простой CSS. Для HTML вы можете легко использовать любую другую библиотеку, которую хотите, включая Heist (что использует Snap). Тем не менее, это немного смешно, чтобы пропустить Yesod над синтаксисом CSS/Javascript, когда Snap даже не имеет синтаксиса для него. Вы, безусловно, приветствуете их решение только статических файлов.

Yesod поставляется с бесшовной поддержкой аутентификации/авторизации, безопасных по типу URL-адресов, виджетов, электронной почты и кучей мелочей повсюду (сухари, сообщения, конечный пункт назначения). Кроме того, Yesod имеет довольно богатый набор дополнительных пакетов для таких вещей, как комментарии и уценки, а также несколько крупных базовых кодов для реального мира, которые можно найти для примеров. Если какой-либо из них привлекателен для вас, вы можете проверить, поддерживаются ли ваши альтернативы.

Ответ 3

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

Кроме того, почему бы не использовать Happstack? Просто потому, что они не "в новостях", не означает, что у них нет прочной основы.

Ответ 4

Вы, вероятно, ссылаетесь на старую версию Yesod. Последние версии yesod имеют простой синтаксис для html, javascript и css.

Синтаксис html шаблона библиотеки шаблонов Yesod - это простой html с полными открывающими и закрывающими тегами и всеми нормальными атрибутами html. Да, вы можете опустить закрывающие теги и использовать ярлыки для атрибутов id и class. Но вам это не нужно. Вы можете продолжать писать простой html.

Не только те, но html-шаблоны могут находиться в отдельных файлах, как в библиотеке шаблонов Snap.

Java script templates (julius) - это простые файлы javascript, также находящиеся в отдельных файлах.

Шаблон css действительно имеет другой синтаксис, но последняя версия yesod теперь обеспечивает также простой синтаксис css.

Если вы поедете с Heist, у вас не будет типа безопасных URL-адресов.

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

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