Comparando os frameworks Snap e Yesod da Haskell

231

Os dois frameworks web Haskell nas notícias recentemente são Yesod (em 0,8) e Snap (em 0,4).

É bastante óbvio que o Yesod atualmente suporta muito mais recursos do que o Snap. No entanto, não suporto a sintaxe que o Yesod usa para HTML, CSS e Javascript.

Então, eu gostaria de entender o que estaria perdendo se eu fosse com o Snap. Por exemplo, não parece que o suporte ao banco de dados esteja lá. E as sessões? Outras características?

Muchin
fonte
138
Pessoalmente, eu não posso suportar a sintaxe que utiliza html para html;)
Rehno Lindeque
2
o que você não gosta na sintaxe do modelo de hamlet para gerar html?
Mxc #
6
Não gosto que não possa me mover entre o Dreamweaver e o Yesod porque a sintaxe é diferente.
Muchin
6
Em geral, a equipe Yesod é muito aberta a novas idéias. Agora que conheço seu caso de uso, provavelmente posso recomendar uma boa solução para você. Seria melhor se você enviar um email para a lista de desenvolvedores da Web, pois o SO não é o melhor lugar para uma discussão colaborativa.
Michael Snoyman
76
As pessoas ainda usam o Dreamweaver? ;)
JO.

Respostas:

236

Divulgação completa: sou um dos principais desenvolvedores do Snap.

Primeiro de tudo, vamos falar sobre o que é o Snap. No momento, a equipe do Snap mantém cinco projetos diferentes no hackage: snap-core, snap-server, heist, snap e xmlhtml. snap-server é um servidor web que expõe a API definida pelo snap-core. O assalto é um sistema de modelos. xmlhtml é uma biblioteca de análise e renderização XML / HTML usada pelo heist. snap é um projeto abrangente que os une e fornece a poderosa API de snaplets que torna os aplicativos da Web composíveis e modulares.

Yesod tem uma série de projetos sobre hackage. A maioria (todos?) Deles estão listados na categoria Yesod . Alguns dos mais notáveis ​​são yesod-core, warp, persistent e hamlet.

A realidade do desenvolvimento da Web Haskell é que é muito menos uma opção ou exclusividade do que parece ser percebido. Em geral, os projetos são muito pouco acoplados e bastante intercambiáveis. Você pode criar um site usando warp (o servidor da web da equipe Yesod), heist (o sistema de modelos da equipe Snap) e acid-state (o sistema de persistência do projeto Happstack). Você também pode usar o snap-server com hamlet ou persistente.

Dito isto, os dois projetos definitivamente têm algumas diferenças. A maior diferença que posso apontar objetivamente é que os projetos Yesod geralmente fazem uso pesado de Template Haskell e quase quitação para criar DSLs concisas, enquanto os projetos Snap se concentram na construção de bibliotecas combinadoras que favorecem a composição. Praticamente qualquer outra diferença que eu possa pensar será subjetivamente influenciada pelo Snap. Os pacotes guarda-chuva nomeados após os dois projetos obviamente farão escolhas específicas para os componentes mencionados acima, e essas escolhas serão refletidas nas dependências do projeto. Mas isso ainda não significa que você não pode extrair algo diferente e usá-lo também.

O Snap tem sessões e autenticação , interfaces para vários bancos de dados e bom processamento de formulários ( aqui e aqui ) usando digestores-functores que incluem suporte pré -empacotado para listas dinamicamente dimensionáveis ​​aninhadas arbitrariamente. Estes são apenas alguns dos crescentes ecossistemas de cobras conectáveis . As sessões e os snaplets de autenticação são gravados de forma independente do back-end. Portanto, com uma pequena quantidade de código de cola, você poderá usá-lo com praticamente qualquer sistema de persistência em que possa pensar. No futuro, o Snap seguirá essa política o mais rápido possível.

Na maioria das vezes, acho que a escolha do Snap vs Yesod vs Happstack é menos uma questão de recursos e mais uma questão de gosto pessoal. Sempre que alguém disser que um dos frameworks não possui algo que outro possui, na maioria das vezes será muito fácil extrair a funcionalidade ausente do outro framework importando o pacote necessário.

EDIT: Para uma comparação mais detalhada dos três grandes frameworks da Haskell, confira meu post recente no blog . Para uma comparação mais dura (mas possivelmente mais útil) usando algumas generalizações mais amplas, consulte minha Matriz de comparação da estrutura da Web Haskell

mightybyte
fonte
34
A natureza dupla da competição amigável e da combinação e combinação no desenvolvimento da Web Haskell parece muito promissora. Dito isto, eu recomendo obter o snap-auth para hackage o mais rápido possível. Sessões e autenticação são um grande negócio.
Dan Burton
2
O Yesod também possui uma interface ainda não lançada para o mongodb para persistência.
MXC
4
A velocidade do desenvolvimento me influencia, daí esta questão. Parece que Yesod tem impulso para a frente adicionando recursos, enquanto o Snap permanece estagnado. Só não sei de antemão quais são os novos recursos desde que ouvi falar disso há mais de 6 meses.
Muchin
3
O Snap tem um bom momento. Primeiro, foi o framework da Web mais baixado sobre hackage no ano passado, embora o projeto não tenha sido lançado publicamente até maio. Segundo, desde o lançamento do 0.3 em dezembro, vimos um grande aumento na atividade. Todas as bibliotecas para sessões, auth, mongoDB, xmlhtml e mais estão sendo trabalhadas por pessoas que são, em grande parte, novas colaboradoras em 2011. Em geral, você também pode encontrar 30 ou mais pessoas no canal de IRC #snapframework. É definitivamente um projeto ativo.
precisa saber é o seguinte
2
Dos dois, eu pedi pelo Snap simplesmente porque, na época, parecia ter um momento maior. Fiquei extremamente impressionado com a qualidade dos componentes. O Heist tem um design lindamente simples e limpo, que provavelmente é o melhor sistema de modelos que eu já vi em qualquer estrutura da Web em qualquer idioma que eu usei. As mônadas do Snap são fáceis de trabalhar e se comportam da maneira que você esperaria, ou seja, sem surpresas desagradáveis. Eu só queria que eles padronizassem ByteStrings ou Text, pois você está constantemente convertendo entre eles!
Andrew Andrew
223

Aviso justo: eu sou o principal desenvolvedor do Yesod.

Não tenho certeza do que você não gosta na sintaxe do Javascript: é um javascript simples com interpolação variável. Quanto ao CSS, o Yesod agora possui o Lucius, que também permite o uso de CSS simples. Para HTML, você pode usar facilmente qualquer outra biblioteca que desejar, incluindo Heist (o que o Snap usa). Dito isso, é um pouco engraçado pular o Yesod sobre a sintaxe CSS / Javascript, quando o Snap nem sequer tem uma sintaxe para isso. Você é certamente bem-vindo à solução deles apenas de arquivos estáticos.

O Yesod vem com suporte contínuo para autenticação / autorização, URLs com segurança de tipo, widgets, email e um monte de pequenas coisas por todo o lugar (trilhas de navegação, mensagens, destino final). Além disso, o Yesod possui um conjunto bastante rico de pacotes de complementos para itens como comentários e descontos, e algumas grandes bases de códigos do mundo real para escolher, como exemplos. Se alguma dessas opções lhe atrai, você pode verificar se suas alternativas as suportam.

Michael Snoyman
fonte
É muito novo, ainda não tive a chance de atualizar a documentação. Mas, basicamente, basta digitar CSS normal e usar # {...} e @ {...} para interpolação, como Hamlet / Cassius / Julius. O aninhamento também é suportado, mas isso exigirá um pouco mais de espaço para explicar do que este comentário;). Se você enviar um e-mail para web-devel, podemos fornecer mais detalhes enquanto a documentação é atualizada.
Michael Snoyman
Alguma alteração a ser usada Juliussem o código ser compactado? Eu sou usig Google Closuree preciso manter os metadados nos comentários para o compilador.
precisa saber é o seguinte
1
Eu não acho que este seja um bom lugar para discutir isso, mas não há necessidade de compactar o código Julius (ele não o faz por padrão). Se você precisar de mais assistência, uma pergunta SO separada ou uma lista de discussão seria uma aposta melhor.
Michael Snoyman
29

Experimente o hamlet - você pode acabar gostando. Uma reação negativa em um nível superficial não é incomum. No entanto, ninguém que realmente usou hamlet reclama.

Além disso, por que não usar o Happstack? Só porque eles não estão "nas notícias" não significa que eles não têm uma estrutura sólida.

Greg Weber
fonte
21
um mantenedor de yesod sugerindo tentar uma estrutura concorrente. que grande comunidade temos.
mxc 6/09/13
12

Você provavelmente está se referindo à versão antiga do yesod. As versões mais recentes do yesod têm uma sintaxe simples para html, javascript e css.

A sintaxe html do hamlet da biblioteca de modelos do yesod é html simples com tags completas de abertura e fechamento e todos os atributos normais de html. Sim, você pode omitir as tags de fechamento e usar atalhos para atributos de identificação e classe. Mas você não precisa. Você pode continuar escrevendo html simples.

Não apenas isso, mas os modelos html, podem residir em arquivos separados, assim como na biblioteca de modelos do Snap, Heist.

Modelos de script Java (julius) são arquivos javascript simples, também residindo em arquivos separados.

O modelo css realmente tem uma sintaxe diferente, mas a versão recente do yesod agora também fornece uma sintaxe css simples.

Se você optar pelo Heist, não terá URLs de tipo seguro.

No Heist, os modelos html são sempre lidos no disco rígido. O Yesod compila todos os modelos diretamente no executável. Nenhum arquivo é lido do disco rígido. Assim, a resposta é muito mais rápida. Você pode ver os benchmarks você mesmo.

No Yesod, você pode criar widgets que cooperem bem. O Snap não lida com widgets. Você terá que rolar o seu próprio.

Vagif Verdi
fonte
1
Como descrevi acima, seu comentário sobre URLs de tipo seguro está incorreto e ajuda a perpetuar o equívoco mencionado. Seria mais preciso se você dissesse "Heist" em vez de "Snap".
precisa saber é o seguinte
3
URLs seguros de tipo são possíveis devido a uma combinação de mecanismo de modelo E mecanismo de roteamento. Portanto, não é apenas o Heist. Você não receberá URLs de tipo seguro no Snap apenas usando o hamlet.
Vagif Verdi
1
Não estou falando de aldeia. O pacote de rotas da web foi originalmente escrito para o Happstack, que tem essencialmente a mesma interface de roteamento do Snap. Você provavelmente precisará de um pequeno código de cola, mas esse sempre será o caso.
precisa saber é o seguinte
4
Eu não faria um argumento tão pequeno desse "código de cola". O modelo Haskell a que você se refere abaixo é o que torna possível esse "código de cola" de maneira concisa e segura. Eu escrevi um pequeno blog para o endereço que: yesodweb.com/blog/yesod-template-haskell
Michael Snoyman
3
Para aqueles que desejam usar outra abordagem de modelagem (mais fraca, mas mais flexível), o HStringTemplate também funciona bem com todas as estruturas, tanto quanto eu sei, e permite a leitura de modelos dinamicamente para desenvolvimento, armazenando-os em cache para produção e também compilando através de quase-cotação, se desejado. O suporte ao qq tem talvez 13 linhas, e não tenho dúvidas de que o heist poderia adicioná-lo trivialmente, caso houvesse demanda.
SCLV