Como você faz uma aplicação web em Clojure? [fechadas]
-
03-07-2019 - |
Pergunta
Eu suponho que esta é uma pergunta estranha para a grande maioria dos programadores que trabalham diariamente com Java. Eu não. Eu sei Java-the-linguagem, porque eu trabalhei em projetos Java, mas não Java-mundo. Eu nunca fiz um aplicativo web a partir do zero em Java. Se eu tiver que fazê-lo com Python, Ruby, eu sei para onde ir (Django ou Rails), mas se eu quiser fazer uma aplicação web em Clojure, não porque eu sou forçado a viver em um mundo Java, mas porque eu como a linguagem e eu quero dar-lhe uma tentativa, o que bibliotecas e frameworks que eu deveria usar?
Solução
De longe o melhor quadro Clojure web ainda tenho encontrado é Compojure: http: // github. com / weavejester / compojure / árvore / master
É pequeno, mas poderoso, e tem uma sintaxe bem elegante. (Ele usa Jetty sob o capô, mas esconde a API Servlet a menos que você quer, o que não será muitas vezes). Go olhada no README nessa URL, em seguida, baixar um instantâneo e começar a jogar.
Outras dicas
Compojure não é mais uma estrutura completa para desenvolvimento de aplicações web. Desde o lançamento 0.4, compojure foi quebrada em vários projetos.
Anel fornece a base abstraindo o pedido HTTP e processo de resposta. Anel irá analisar o pedido recebido e gerar um mapa contendo todas as partes do pedido, tais como uri, do nome do servidor e pedir-método. A aplicação será então lidar com o pedido e com base na solicitação gerar uma resposta. Uma resposta é representado como um mapa contendo as seguintes chaves: estado, cabeçalhos, e corpo. Assim, uma aplicação simples seria algo como:
(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 Anel é o conceito de meio-ware. Este é o código que fica entre o processador e o pedido de entrada e / ou a resposta de saída. Alguns construído no meio-ware incluem sessões e stacktrace. A sessão de meio-ware irá adicionar um: chave de sessão para o mapa solicitação que contém todas as informações de sessão para o usuário que fez a solicitação. Se o: chave de sessão está presente no mapa de resposta, ele será armazenado para a próxima solicitação feita pelo usuário atual. Enquanto o rastreamento de pilha meio-ware irá capturar todas as exceções que ocorrem durante o processamento do pedido e gerar um rastreamento de pilha que é enviado de volta como a resposta, se não ocorrer nenhuma exceção.
Trabalhando diretamente com anel pode ser tedioso, então Compojure é construído em cima do anel abstrair o detalhes. O aplicativo agora pode ser expressa em termos de roteamento de modo que você pode ter algo como isto:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure ainda está trabalhando com o pedido / resposta mapeia assim você sempre pode acessá-los, se necessário:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
Neste caso, a {uri: uri} parte acessa o:. Chave uri no mapa do pedido e conjuntos uri a esse valor
O último componente é Soluço que faz gerar o html mais fácil. As várias tags HTML são representados como vetores com o primeiro elemento que representa o nome da marca e sendo o resto do corpo do tag. "<h2>A header</h2>"
se torna [:h2 "A Header"]
. Os atributos de um tag estão em um mapa opcional. "<a href='/login'>Log In Page</a>"
se torna [: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 escrito pelo autor de compojure que você pode achar útil: Compojure Doc
Há também "Noir" ( http://www.webnoir.org/ ), que é um framework web nova Clojure (tão novo os documentos não estão lá ainda). Vindo de Django / Rails, eu cavar o simples, sintaxe simples e é muito magra.
Considere a Luminus web framework . Eu não tenho nenhuma afiliação, mas tenho ouvido coisas boas de amigos eu respeito.
Meu atual go-to biblioteca web é agora yada .
Se você está apenas começando, o servidor introdutório é Compojure
. Eu vejo isso como o apache
de servidores web no mundo Clojure (caso em que yada / aleph seria nginx). Você pode usar Luminus
como um modelo. Existem variantes do mesmo, como compojure-api
.
Eu tentei OU Pedestal
e foi globalmente satisfeito com ele. Não tenho a pretensão de dominá-lo, mas tem uma sintaxe agradável, sente-se muito coesa, e parece que tem um excelente desempenho. Ele também é apoiado por Cognitect
(o Clojure / empresa Datomic onde rico Hickey funciona).
Aleph
para apresentar uma abstração interessante, e a contrapressão built-in parece interessante. Eu ainda tenho que jogar com ele, mas é definitivamente na minha lista.
Depois de jogar um pouco com vários servidores web, aqui está a minha rápida Pro list / Contras:
Resposta curta: ter um olhar para Luminus para começar rapidamente, talvez passar para outra coisa como o seu necessidades evoluem (Yada talvez).
Compojure
-
Pros (1):
- fácil, lotes de modelos / exemplos (ex. Luminosos)
-
Contras (2):
- Não performance (a thread por pedido), esperar performances ligeiramente melhor do que os trilhos
- Não simples, o modelo de middleware tem inconvenientes
Pedestal
-
Pros (3):
- modelo de interceptor, agradável sintaxe para adicionar interceptadores a um subconjunto de rotas
- performance roteador
- suportes json / trânsito / formulários de várias transparente fora da caixa, sem pedir nada. Muito legal!
-
Contras (4):
- nenhum apoio websocket (ainda), retornando canais core.async seria bom
- um pouco lento para recarregar se de colocá-lo no componente de um Stuart Sierra (eu acho que você deveria usar o interceptor reload)
- nenhuma instalação de testes para interceptores assíncronos
- exige buy-in (?)
Aleph
Pro (3):
- Performant
- contrapressão
- WebSocket / SSE apoio ao retornar um fluxo colector
Contras (1):
- Baixo nível, faça você mesmo estilo (ou seja. Ele só dá-lhe uma maneira de fazer seus manipuladores de fazer alguma coisa. Não roteador, sem nada). Não é realmente um contras, basta estar ciente disso.
Yada
Pro (3):
- construído sobre Aleph
- negociação de conteúdo
- Integração arrogância
- bidi é bastante ok (embora eu como pedestal router sintaxe melhor)
Contras (1):
- documentação (embora não tão ruim quanto nginx-clojure, melhorando rapidamente).
HttpKit
Pro (2):
- Escrito em Clojure! (E Java ...)
- aparência de desempenho bom (ver 600K conexões simultâneas postar)
Contras (2):
- Suporte Sem CORS
- insetos? Além disso, não um monte de commits recentes
Nginx-Clojure
Nota: Eu não tenho jogado com ele, principalmente por causa da falta de documentação. Parece que interessante, e muito alto desempenho.
Pros (2):
- Nginx (performance, SSL offload, trabalhadores reinício ...)
- Poderia este modelo permitirá atualizações em tempo de inatividade? Isso seria tão incrível!
Contras (1):
- Documentação (melhoria). Além disso, eu não quero programa em cordas incorporados em um arquivo de configuração nginx se essa é a única maneira de fazê-lo.
- Probably complica um pouco a primeira implantação (?)
Immutant
Nota:. Eu não tenho jogado com ele
Pros:
- integrada (caching, mensagens, programar, implementar JBoss Application Server)
Contras:
- nenhum cliente http
Catacumba
Nota: Eu não tenho jogado com ele, embora a documentação parece excelente. Eu provavelmente vou experimentar próxima. Há exemplos de projetos de chat que olhar interessante, o seu uso pesado de protocolos colocou-me em primeiro lugar como um novato Clojure desenv.
Pros (6):
- documentação! Como todos os projetos funcool, o doc é muito agradável de ler.
- pedestal-like roteamento sintaxe
- deve ser performance (no topo da Ratpack)
- contrapressão
- websockets, sse, coros, segurança, ssl ...
- características únicas para cavar: postal
Contras (2):
- Não completamente certo sobre quão agradável a sintaxe ct / rotas é, e sobre o afundamento do Anel especificação (supostamente para a história assíncrona, mas achei que os caras pedestal fixo que)
- Não sei como se poderia integrar arrogância etc.
- quando eu tentei, eu não era capaz de fazê-lo funcionar de imediato
Nota ??strong>: a valor de referência de servidores web Clojure está disponível, se o desempenho bruto é tudo o que importa.
Estes dias Pedestal vale um quadro um olhar. É um quadro do lado do servidor que constrói em cima Anel , mas também libera a solicitação de entrada de o fio inicial por ser capaz de interromper e retomar a esse pedido específico (caso contrário uma solicitação lenta efectivamente bloquear que ServerThread). Talvez como uma espécie de JavaBean.
Outros enquadramentos legais são hoplon.io e de David Nolen Om (baseado em Reagir)
Webjure , um quadro de programação web para Clojure.
Características: Despacho servlet chama funções Clojure. geração de HTML dinâmico. SQL interface de consulta (através de JDBC).
Esta resposta é concebida como um espaço reservado para informações Webjure.
Compojure é o que eu usei para construir uma aplicação blogging pequena. É inspirado no Sinatra, que é um mínimo framework web, leve para Ruby. Eu, principalmente, utilizado apenas o roteamento, que é como Sinatra. Parece que:
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
Não há ORM ou templates biblioteca, mas tem funções que tornam vetores em HTML.
Você também pode ter olhar para estas estruturas (retirado disclojure / projectos ):
Há também uma questão mais relacionada no Stack Overflow: frameworks web Clojure Mature
Disclaimer:. Eu sou o autor
Eu coloquei um modelo Leiningen que combina modelos luminusweb e castanheiros.
Então você começa algo que você pode construir código Clojure com e código clojurescript para frente e backend.
Além disso, ele fornece gerenciamento de usuários mais alguns geração CRUD simples e um pouco mais pequeno bom haves: https://github.com/sveri / closp
Eu vou atirar em meus dois centavos para duto , também da @ weavejester , o mantenedor do Compojure e Ring.
No seu núcleo, que traz Component eo roteador Anel sob o mesmo teto. Razões pelas quais eu uso do duto:
- Excelente base filosófica:. Incentiva-lo a construir seu aplicativo como uma série de pequenos componentes, e estabelece um equilíbrio agradável entre dar algumas opiniões, proporcionando padrões sãs
- caminho Estável: Eu falo para mim mesmo, mas ao longo dos anos eu senti que a comunidade Clojure apresentou uma menos-que-credível framework web após o outro. Um casal simplesmente se sentia muito experimental (minha experiência com OM e do lado do cliente Pedestal) para "fazer as coisas" (não que eles não vão provar superiores a estrada). Por outro lado, eu me sinto como @weavejester trouxe a mesma estabilidade e medidas de progresso para duto que ele fez para Compojure e Ring, que foram soberbamente nascida na comunidade.
- do Super leve e fora do caminho dos meus componentes.
características principais:
- Organiza rotas de "endpoints", pequenos componentes que podem você pode pensar como mini servidores web (ou, pequenas seções transversais de suas rotas HTTP).
- Suporte Out-of-the-box para a Reloaded fluxo de trabalho .
- Integração perfeita com anel e Compojure.
- Desenvolvimento e configurações de produção (algo que eu encontrei conspicuamente ausente em outros lugares).
- Uma boa documentação com exemplos.
Nota: Não é preciso dizer, mas para o benefício dos recém-chegados de desenvolvimento web, como a maioria das coisas Clojurey duto requer uma sólida compreensão de Clojure o idioma. Eu também recomendo a leitura sobre primeiro componente.
Em outra nota pessoal, eu estive usando duto em várias aplicações de produção para mais de um ano e estou extremamente feliz com isso.
Você também pode tentar Clojure em Bobinas, http://github.com/zubairq/coils - disclaimer: Eu sou o autor
Outra webserver interessante é Http-kit . Tem o bom desempenho e é compatível anel, e tem suporte para WebSockets também. É feito principalmente em Clojure, e carece de algumas das coisas estranhas em Jetty / Tomcat.
É fácil de mexer.
Reframe e om.next provavelmente o que você está procurando.
Arachne é uma estrutura recém-chegado web. Citando descrição do site:
Arachne é um quadro pleno desenvolvimento, web altamente modular para Clojure. Ele enfatiza a facilidade, simplicidade e um sólido, escalável design.
Tem uma kickstarter campanha alegando a oferecer uma experiência de "introdução" semelhante ao Rails. Isto é desenvolvido por uma Cognitect.
Aqui é uma boa discussão sobre isso com o autor da Luminus (yogthos).
Eu tenho usado Liberator com sucesso na produção por um tempo agora. É um grande quadro se você quer apenas o esqueleto por exemplo se você está construindo um serviço web RESTful ou algo similar. É essencialmente um dispositivo de moldagem para o anel e compojure e fornece um gráfico de decisão quando validar solicitações de entrada. Também é extremamente rápido em comparação com outros frameworks web mais volumosos. Se você quiser começar em algum lugar rápido e lentamente construir fora, então Liberator é uma ótima escolha.