Como você cria um aplicativo da Web no Clojure? [fechadas]

216

Suponho que essa seja uma pergunta estranha para a grande maioria dos programadores que trabalham diariamente com Java. Eu não. Conheço Java, a linguagem, porque trabalhei em projetos Java, mas não em Java, o mundo. Eu nunca criei um aplicativo Web do zero em Java. Se eu tiver que fazer isso com Python, Ruby, eu sei para onde ir (Django ou Rails), mas se eu quiser criar um aplicativo da Web no Clojure, não porque sou forçado a viver em um mundo Java, mas porque eu como a linguagem e eu quero experimentá-lo, quais bibliotecas e estruturas devo usar?

pupeno
fonte
1
Eu queria saber se você deseja usar Java Native API ou Clojure Native?
Ande Turner 5/10/08
Ande: Eu realmente não tenho certeza, pois sei muito pouco sobre o mundo Java a esse respeito (mas estou usando Java, a linguagem, já há algum tempo no trabalho).
pupeno
Eu acho que seria bom se essa pergunta terminasse com uma lista de frameworks da Web Clojure, uma resposta cada, e qualquer um pudesse votar no seu favorito. Eu acho que Meredydd's é definitivamente a resposta do Compojure. Vou adicionar um para o Webjure e seria bom fazer uma comparação.
pupeno
Pupeno! Cheguei aqui procurando por "aplicativos da web com clojure". Esta página foi o primeiro resultado no Google.
Sebastián Grignoli
2
Veja também a questão relacionada stackoverflow.com/questions/3325033/…
Petr Gladkikh

Respostas:

104

De longe, o melhor framework da Web Clojure que eu já encontrei é o Compojure: http://github.com/weavejester/compojure/tree/master

É pequeno, mas poderoso e possui uma sintaxe lindamente elegante. (Ele usa o Jetty sob o capô, mas oculta a API do Servlet, a menos que você queira, o que não será frequente). Vá para o LEIA-ME no URL, faça o download de um instantâneo e comece a jogar.


fonte
16
O comentário de Richard foi feito para essa resposta? Eu não entendo isso
precisa
26
@ Richard Seu argumento é bem bobo. Sim, se você decidir usar bibliotecas java, estará desistindo de ser funcional em muitos casos. Mas o objetivo dessas bibliotecas é que você nunca precise fazer isso novamente . Por exemplo, Ring é um wrapper Clojury em torno de servlets, para que você não precise usá-los diretamente. Você propõe que reinventemos a roda de desenvolvimento da Web do zero, em vez de tornar as ferramentas Java perfeitamente boas agradáveis ​​de usar no Clojure? Onde está a lógica nisso? Além disso, como é ruim ter a opção de usar essas bibliotecas? ...
Rayne
15
@ Richard Todo o seu argumento implica que o código não-funcional não-Clojure é inerentemente tão ruim que até a presença dele oculta sob uma biblioteca é uma contaminação. Eu não entendo esse raciocínio. Muitas bibliotecas Java são partes úteis e poderosas de código. Por que reescrever aqueles desde o início, quando podemos simplesmente fornecer nossas próprias bibliotecas de wrapper que tornam possível usá-las de forma elegante e funcional a partir do Clojure?
Rayne
10
@ Richard, sinta-se à vontade para criar um servidor http com clojura pura.
Gtrak
5
Em termos Lisp / Clojure, uma função não tem efeitos colaterais. (consulte gigamonkeys.com/book/… ). No entanto, como apontado no Land of Lisp ( landoflisp.com/trade_func.png ), um programa puramente funcional geralmente não é muito útil porque são necessários efeitos colaterais para realmente fazer coisas, como gravar registros de bancos de dados, baixar arquivos, postar em um servidor REST, gerar imagens, etc ...
lfalin
179

O Compojure não é mais uma estrutura completa para o desenvolvimento de aplicativos da web. Desde o lançamento do 0.4, o compojure foi dividido em vários projetos.

O Ring fornece a base abstraindo o processo de solicitação e resposta HTTP. O Ring analisará a solicitação recebida e gerará um mapa contendo todas as partes da solicitação, como uri, server-name e request-method. O aplicativo manipulará a solicitação e, com base na solicitação, gerará uma resposta. Uma resposta é representada como um mapa que contém as seguintes chaves: status, cabeçalhos e corpo. Portanto, um aplicativo simples se pareceria com:

(def app [req]
  (if (= "/home" (:uri req))
    {:status 200
     :body "<h3>Welcome Home</h3>"}
    {:status 200 
     :body "<a href='/home'>Go Home!</a>"}))

Uma outra parte do Ring é o conceito de middleware. Este é o código que fica entre o manipulador e a solicitação de entrada e / ou a resposta de saída. Alguns embutidos no middleware incluem sessões e stacktrace. O middleware da sessão adicionará uma chave: session ao mapa da solicitação que contém todas as informações da sessão para o usuário que está fazendo a solicitação. Se a chave: session estiver presente no mapa de resposta, ela será armazenada para a próxima solicitação feita pelo usuário atual. Enquanto o middleware do rastreio da pilha captura todas as exceções que ocorrem durante o processamento da solicitação e gera um rastreio da pilha que é enviado de volta como resposta, se ocorrer alguma exceção.

Trabalhar diretamente com o Ring pode ser entediante, então o Compojure é construído sobre o Ring, abstraindo os detalhes. O aplicativo agora pode ser expresso em termos de roteamento, para que você possa ter algo assim:

(defroutes my-routes
  (GET "/" [] "<h1>Hello all!</h1>")
  (GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))

O Compojure ainda está trabalhando com os mapas de solicitação / resposta para que você sempre possa acessá-los, se necessário:

(defroutes my-routes
  (GET "*" {uri :uri} 
           {:staus 200 :body (str "The uri of the current page is: " uri)}))

Nesse caso, a parte {uri: uri} acessa a chave: uri no mapa de solicitação e define uri para esse valor.

O último componente é o Hiccup, que facilita a geração do html. As várias tags html são representadas como vetores, com o primeiro elemento representando o nome da tag e o restante sendo o corpo da tag. "<h2>A header</h2>"torna-se [:h2 "A Header"]. Os atributos de uma tag estão em um mapa opcional. "<a href='/login'>Log In Page</a>"torna-se [:a {:href "/login"} "Log In Page"]. Aqui está um pequeno exemplo usando um modelo para gerar o html.

(defn layout [title & body]
  (html
    [:head [:title title]]
    [:body [:h1.header title] body])) 

(defn say-hello [name]
  (layout "Welcome Page" [:h3 (str "Hello " name)]))

(defn hiccup-routes
  (GET "/user/:name" [name] (say-hello name)))

Aqui está um link para um rascunho de alguma documentação atualmente sendo escrita pelo autor do compojure que você pode achar útil: Documento Compojure

Ross Goddard
fonte
48

Há também o "Noir" ( http://www.webnoir.org/ ), que é uma nova estrutura da Web Clojure (portanto, os documentos ainda não estão lá). Vindo do Django / Rails, eu gosto da sintaxe simples e direta e é bem enxuta.

elithrar
fonte
Webnoir é realmente muito útil! É muito fácil começar - você pode desenvolvê-lo um pouco como se parece desenvolver php - basta iniciar um servidor (desta vez com leiningen), editar seus arquivos e recarregar o navegador para ver o que você conseguiu.
claj
Como @elithrar respondeu, Noir agora tem os documentos disponíveis: webnoir.org/docs
Alistair Collins
18
Apenas para o registro, parece Noir foi preterido e não é mais mantido ....
SolarBear
25

Considere a estrutura da web Luminus . Não tenho afiliação, mas ouvi coisas boas de amigos que respeito.

Michael Easter
fonte
20

Agora, minha biblioteca da web go-to atual é yada .

Se você está apenas começando, o servidor introdutório é Compojure. Eu o vejo como o apachedos servidores da Web no mundo Clojure (nesse caso, yada / aleph seria nginx). Você pode usar Luminuscomo modelo. Existem variantes, como compojure-api.

Eu tentei ou Pedestalestava globalmente satisfeito com isso. Não pretendo dominá-lo, mas tem uma sintaxe agradável, parece muito coesa e parece ter um ótimo desempenho. Também é apoiado pela Cognitect(empresa Clojure / Datomic onde Rich Hickey trabalha).

Descobri Alephapresentar uma abstração interessante, e a contrapressão interna parece interessante. Ainda tenho que brincar com isso, mas definitivamente está na minha lista.

Depois de jogar um pouco com vários servidores da web, aqui está minha rápida lista de Pro / Contras:

Resposta curta: dê uma olhada no Luminus para começar rapidamente, talvez mude para outra coisa à medida que suas necessidades evoluem (talvez Yada).

Compojure

  • Prós (1):

    • fácil, muitos modelos / exemplos (ex. Luminous)
  • Contras (2):

    • Sem desempenho (um encadeamento por solicitação), espera desempenhos um pouco melhores que os trilhos
    • Não é simples, o modelo de middleware possui inconvenientes

Pedestal

  • Prós (3):

    • modelo interceptador, sintaxe agradável para adicionar interceptores a um subconjunto de rotas
    • roteador de alto desempenho
    • suporta formulários json / transit / multipart de forma transparente, sem pedir nada. Muito legal !
  • Contras (4):

    • ainda não há suporte para websocket, o retorno dos canais core.async seria bom
    • um pouco lento para recarregar se colocá-lo no componente de Stuart Sierra (acho que você deveria usar o interceptor de recarga)
    • nenhuma instalação de teste para interceptores assíncronos
    • requer adesão (?)

Aleph

Pro (3):

  • Desempenho
  • contrapressão
  • Suporte Websocket / SSE ao retornar um fluxo de manifold

Contras (1):

  • Nível baixo, faça você mesmo estilo (isto é, apenas fornece uma maneira de fazer com que seus manipuladores façam alguma coisa. Sem roteador, sem nada). Não é realmente um contras, apenas esteja ciente disso.

Yada

Pro (3):

  • construído em Aleph
  • negociação de conteúdo
  • integração arrogante
  • bidi é bastante ok (embora eu prefira a sintaxe do roteador de pedestal)

Contras (1):

  • documentação (embora não tão ruim quanto o nginx-clojure, melhorando rapidamente).

HttpKit

Pro (2):

  • Escrito em Clojure! (e Java ...)
  • o desempenho parece bom (consulte a publicação sobre conexões simultâneas de 600K)

Contras (2):

  • Sem suporte a CORS
  • Insetos ? Além disso, não há muitos commits recentes

Nginx-Clojure

Nota: Eu não brinquei com isso, principalmente por causa da falta de documentação. Parece interessante e muito bem-sucedido.

Prós (2):

  • Nginx (desempenho, descarregar ssl, reiniciar trabalhadores ...)
  • Esse modelo poderia permitir atualizações de tempo de inatividade zero? Isso seria tão incrível!

Contras (1):

  • Documentação (aprimorando). Além disso, não quero programar em strings incorporadas em um arquivo de configuração nginx, se essa for a única maneira de fazê-lo.
  • Provavelmente complica um pouco a primeira implantação (?)

Imutante

Nota: Eu não brinquei com isso.

Prós:

  • integrado (armazenamento em cache, sistema de mensagens, agendamento, implantação de wildfly)

Contras:

  • nenhum cliente http

Catacumba

Nota: Eu não brinquei com ele, embora a documentação pareça excelente. Provavelmente vou tentar a seguir. Existem exemplos de projetos de bate-papo que parecem interessantes, seu uso pesado de protocolos me deixou inicialmente como um desenvolvedor novato do Clojure.

Prós (6):

  • documentação! Como todos os projetos do funcool, o documento é muito agradável de ler.
  • sintaxe de roteamento tipo pedestal
  • deve ter desempenho (em cima do Ratpack)
  • contrapressão
  • websockets, sse, cors, segurança, ssl ...
  • recursos exclusivos para cavar: postal

Contras (2):

  • Não tenho certeza absoluta de quão agradável é a sintaxe ct / routes e de abandonar a especificação Ring (supostamente para a história assíncrona, mas achei que o pessoal do pedestal resolveu isso)
  • Não tenho certeza de como integrar o arrogância etc.
  • quando tentei, não consegui fazê-lo funcionar imediatamente

Nota : uma referência dos servidores da Web Clojure está disponível, se o desempenho bruto for o que importa.

nha
fonte
Ótima comparação. não sei como a metáfora nginx funciona embora :)
matanster
1
@matanster Eu vejo o apache como o servidor padrão para muitas organizações. Simples, funciona para muitos. Mas também é mais antigo que o nginx e usa um modelo interno diferente. O compospo é síncrono (que pode mudar) enquanto o Yada é assíncrono. Outro benefício do Yada que não mencionei é que tudo são dados, por isso é muito mais fácil compor / transformar / inspecionar / gerar em comparação com macros como no Compojure.
Nha
14

Atualmente, o Pedestal é uma estrutura que vale a pena dar uma olhada. É uma estrutura do lado do servidor que se baseia no Ring , mas também libera a solicitação recebida do encadeamento inicial, podendo pausar e retomar essa solicitação específica (caso contrário, uma solicitação lenta realmente bloqueia essa passagem do servidor). Talvez como um JavaBean.

Outras estruturas legais são hoplon.io e Om de David Nolen (baseado em React)

claj
fonte
11

Webjure , uma estrutura de programação web para Clojure.

Recursos: O servlet de despacho chama as funções Clojure. Geração dinâmica de HTML. Interface de consulta SQL (através do JDBC).

Esta resposta pretende ser um espaço reservado para informações da Webjure.

pupeno
fonte
3
Também não tenho certeza de que este seja um bom exemplo. Embora a base de código pareça superficial (boa), há bastante escrito em java que parece errar o alvo. Eu esperava uma estrutura clojure pura.
Richard
8

Compojure é o que eu costumava criar um pequeno aplicativo de blog. Ele é modelado no Sinatra, que é uma estrutura da Web mínima e leve para Ruby. Eu principalmente apenas usei o roteamento, que é como o de Sinatra. Parece que:

(GET "/post/:id/:slug"
  (some-function-that-returns-html :id :slug))

Não há ORM ou biblioteca de modelos, mas possui funções que transformam vetores em HTML.

Joe W.
fonte
3

Disclaimer: Eu sou o autor.

Montei um modelo de leiningen que combina modelos luminusweb e castanha. Assim, você obtém algo com o qual pode criar código clojure e código clojurescript para front-end e back-end.
Além disso, ele fornece gerenciamento de usuários, além de uma geração simples de CRUD e um pouco mais agradável de ter: https://github.com/sveri/closp

sveri
fonte
3

Vou jogar meus dois centavos por Duct , também de @weavejester , mantenedor de Compojure e Ring.

No seu núcleo, ele traz o Component e o roteador Ring sob o mesmo teto. Razões pelas quais eu uso o Duct:

  • Excelente fundamento filosófico: incentiva você a criar seu aplicativo como uma série de pequenos componentes e atinge um bom equilíbrio entre manter poucas opiniões e fornecer padrões saudáveis.
  • Caminho estável: eu falo por mim mesmo, mas ao longo dos anos senti que a comunidade Clojure apresentou uma estrutura da web menos do que credível após a outra. Um casal simplesmente se sentiu muito experimental (minha experiência com Om e Pedestal do lado do cliente) para "fazer as coisas" (não que elas não se mostrem superiores no futuro). Por outro lado, sinto que o @weavejester trouxe a mesma estabilidade e mediu o progresso em Duct que ele fez em Compojure e Ring, que foram soberbamente nascidos na comunidade.
  • É super leve e está fora do caminho dos meus componentes.

Principais características:

  • Organiza rotas por "pontos de extremidade", pequenos componentes que você pode imaginar como mini servidores da Web (ou pequenas seções transversais de suas rotas HTTP).
  • Suporte pronto para uso para o fluxo de trabalho recarregado .
  • Integração perfeita com Ring e Compojure.
  • Configurações de desenvolvimento e produção (algo que encontrei conspicuamente ausente em outro lugar).
  • Boa documentação com exemplos.

Nota: Escusado será dizer, mas para o benefício dos recém-chegados ao desenvolvimento da Web, como a maioria das coisas Clojurey, o Duct exige uma compreensão sólida da linguagem Clojure. Também recomendo ler primeiro sobre o Componente.

Em outra nota pessoal, eu uso o Duct em várias aplicações de produção há mais de um ano e estou extremamente feliz com isso.

KendallB
fonte
2

você também pode experimentar o Clojure on Coils, http://github.com/zubairq/coils - isenção de responsabilidade: eu sou o autor

Yazz.com
fonte
2

Outro servidor web interessante é o Http-kit . Ele tem bom desempenho e é compatível com anel, além de ter suporte para WebSockets. É feito principalmente em clojure, e não possui algumas das coisas estranhas no Jetty / Tomcat.

É fácil mexer.

claj
fonte
2

Renomeie e om.next provavelmente o que você está procurando.

ftravers
fonte
1

Arachne é um framework web para iniciantes. Citando a descrição do site:

Arachne é uma estrutura de desenvolvimento web altamente modular e completa para Clojure. Ele enfatiza a facilidade, a simplicidade e um design sólido e escalável.

Ele tem uma campanha Kickstarter reivindicando oferecer uma experiência de "introdução" semelhante ao Rails. É desenvolvido por um Cognitect.

Aqui está uma boa discussão sobre isso com o autor de Luminus (iogues).

Micah Elliott
fonte
1

Estou usando o Liberator com sucesso na produção há um tempo. É uma excelente estrutura se você quiser apenas os ossos, por exemplo, se estiver criando um serviço da Web RESTful ou algo semelhante. É essencialmente um invólucro para anel e compojura e fornece um gráfico de decisão ao validar solicitações recebidas. Também é extremamente rápido em comparação com outros frameworks da web mais volumosos. Se você quer começar em algum lugar rápido e construir lentamente, o Liberator é uma ótima opção.

dfbernal
fonte