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?

Foi útil?

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 : 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top