tutorial - ¿Cómo se hace una aplicación web en Clojure?




example js (14)

Supongo que esta es una pregunta extraña para la gran mayoría de los programadores que trabajan diariamente con Java. Yo no. Sé Java-the-language, porque trabajé en proyectos Java, pero no en Java-the-world. Nunca hice una aplicación web desde cero en Java. Si tengo que hacerlo con Python, Ruby, sé dónde ir (Django o Rails), pero si quiero hacer una aplicación web en Clojure, no porque me obliguen a vivir en un mundo Java, sino porque Me gusta el idioma y quiero probarlo. ¿Qué bibliotecas y marcos debo usar?


Answers

Por mucho, el mejor framework web de Clojure que he encontrado es Compojure: http://github.com/weavejester/compojure/tree/master

Es pequeño pero poderoso, y tiene una sintaxis bellamente elegante. (Utiliza Jetty bajo el capó, pero te oculta la API de Servlet a menos que lo desees, lo que no será frecuente). Vaya a README en esa URL, luego descargue una instantánea y comience a jugar.


Arachne es un nuevo framework web. Citando la descripción del sitio:

Arachne es un marco de desarrollo web completo y altamente modular para Clojure. Enfatiza la facilidad, la simplicidad y un diseño sólido y escalable.

Tiene una campaña de arranque que dice ofrecer una experiencia de "inicio" similar a Rails. Está desarrollado por un Cognitect.

Here hay una buena discusión al respecto con el autor de Luminus (yogthos).


@weavejester mis dos centavos por Duct , también de @weavejester , el mantenedor de Compojure y Ring.

En su núcleo, lleva el enrutador de Component y el anillo en un solo techo. Razones por las que uso Duct:

  • Excelente base filosófica: lo alienta a construir su aplicación como una serie de pequeños componentes, y logra un buen equilibrio entre tener pocas opiniones y proporcionar valores predeterminados sanos.
  • Ruta estable: hablo por mí mismo, pero a lo largo de los años he sentido que la comunidad de Clojure ha presentado un marco web poco creíble tras otro. Una pareja simplemente se sintió demasiado experimental (mi experiencia con Om y el pedestal del lado del cliente) para "hacer las cosas" (no es que no sean superiores en el camino). Por otro lado, siento que @weavejester ha traído a Duct la misma estabilidad y progreso medido que él hizo con Compojure y Ring, que han sido magníficamente desarrollados en la comunidad.
  • Es súper liviano y está fuera del alcance de mis componentes.

Características principales:

  • Organiza las rutas por "puntos finales", pequeños componentes que puedes imaginar como mini servidores web (o pequeñas secciones transversales de tus rutas HTTP).
  • Compatibilidad inmediata con el flujo de trabajo recargado .
  • Perfecta integración con anillo y compojure.
  • Configuraciones de desarrollo y producción (algo que encontré notoriamente perdido en otros lugares).
  • Buena documentación con ejemplos.

Nota: No hace falta decirlo, pero en beneficio de los recién llegados al desarrollo web, como la mayoría de las cosas de Clojurey, Duct requiere un conocimiento sólido de Clojure el idioma. También recomiendo leer sobre Componente primero.

En otra nota personal, he estado usando Duct en varias aplicaciones de producción durante más de un año y estoy extremadamente feliz con él.


He estado usando Liberator exitosamente en producción por un tiempo. Es un gran marco de trabajo si solo quiere lo básico, por ejemplo, si está creando un servicio web RESTful o algo similar. Es esencialmente una envoltura para anillo y compojure y proporciona un gráfico de decisión al validar solicitudes entrantes. También es extremadamente rápido en comparación con otros marcos web más voluminosos. Si desea comenzar en un lugar rápido y progresivo, Liberator es una excelente opción.


Descargo de responsabilidad: yo soy el autor.

Armé una plantilla leiningen que combina luminusweb y plantillas de castaño. Así que obtienes algo con lo que puedes construir código de clojure y código de código de código para frontend y backend.
Además, proporciona administración de usuarios más un poco de generación de CRUD simple y otros más pequeños, como https://github.com/sveri/closp


Considere el marco web de Luminus . No tengo afiliación pero he escuchado cosas buenas de amigos que respeto.



Otro servidor web interesante es Http-kit . Tiene un buen rendimiento y es compatible con el anillo, y también es compatible con WebSockets. Se hace principalmente en clojure, y carece de algunas de las cosas extrañas en Jetty / Tomcat.

Es fácil jugar con


Mi biblioteca web actual es ahora yada .

Si recién estás comenzando, el servidor introductorio es Compojure . Lo veo como el apache de los servidores web en el mundo de Clojure (en cuyo caso yada / aleph sería nginx). Podrías usar Luminus como plantilla. Hay variantes de él, como compojure-api .

Pedestal ou Pedestal y quedé satisfecho con todo el mundo. No pretendo dominarlo, pero tiene una sintaxis agradable, se siente muy cohesionado y parece que tiene un gran rendimiento. También está respaldado por Cognitect (la empresa Clojure / Datomic donde trabaja Rich Hickey).

Encontré a Aleph para presentar una abstracción interesante, y la contrapresión incorporada parece interesante. Todavía tengo que jugar con él, pero definitivamente está en mi lista.

Después de jugar un poco con varios servidores web, aquí está mi rápida lista de Pro / Cons:

Respuesta corta: eche un vistazo a Luminus para comenzar rápidamente, tal vez pase a otra cosa a medida que sus necesidades evolucionen (tal vez Yada).

Compojure

  • Pros (1):

    • Fácil, muchas plantillas / ejemplos (ej. Luminoso)
  • Contras (2):

    • Sin rendimiento (un hilo por solicitud), espera un rendimiento ligeramente mejor que los rieles
    • No es sencillo, el modelo de middleware tiene inconvenientes.

Pedestal

  • Pros (3):

    • Modelo de interceptor, sintaxis agradable para agregar interceptores a un subconjunto de rutas
    • enrutador performant
    • admite formularios json / transit / multipart de forma transparente y sin necesidad de pedir nada. Muy genial !
  • Contras (4):

    • no es compatible con websocket (todavía), devolver los canales core.async sería bueno
    • un poco lento para recargar si se lo pone en un componente de Stuart Sierra (creo que se supone que debes usar el interceptor de recarga)
    • no hay instalaciones de prueba para interceptores asíncronos
    • requiere buy-in (?)

Aleph

Pro (3):

  • Performante
  • contrapresion
  • Soporte de Websocket / SSE cuando se devuelve un flujo múltiple

Contras (1):

  • Nivel bajo, hágalo usted mismo al estilo (es decir, solo le da una manera de hacer que sus manejadores hagan algo. Sin enrutador, sin nada). No son realmente contras, solo tenlo en cuenta.

Yada

Pro (3):

  • construido en Aleph
  • negociación de contenido
  • integración arrogante
  • Bidi está bastante bien (aunque me gusta más la sintaxis del enrutador de pedestal)

Contras (1):

  • documentación (aunque no tan mala como nginx-clojure, mejorando rápidamente).

HttpKit

Pro (2):

  • Escrito en clojure! (y Java ...)
  • el rendimiento se ve bien (consulte la publicación de conexiones simultáneas de 600 K)

Contras (2):

  • No hay soporte CORS
  • Bichos Además, no hay muchos compromisos recientes.

Nginx-Clojure

Nota: no he jugado con él, principalmente debido a la falta de documentación. Aunque parece interesante, y muy performante.

Pros (2):

  • Nginx (ejecutante, ssl de descarga, reinicio de trabajadores ...)
  • ¿Podría este modelo permitir actualizaciones de tiempo de inactividad cero? ¡Eso sería tan increíble!

Contras (1):

  • Documentación (mejora). Además, no quiero programar en cadenas incrustadas en un archivo de configuración nginx si esa es la única manera de hacerlo.
  • Probablemente complica un poco el primer despliegue (?)

Inmutante

Nota: no he jugado con eso.

Pros:

  • integrado (almacenamiento en caché, mensajería, programación, despliegue de wildfly)

Contras :

  • no cliente http

Catacumba

Nota: no he jugado con él, aunque la documentación parece excelente. Probablemente voy a intentarlo a continuación. Hay ejemplos de proyectos de chat que parecen interesantes, su uso intensivo de protocolos me desanimó al principio como un desarrollador novato de Clojure.

Pros (6):

  • documentación! Como todos los proyectos de funcool, el documento es muy agradable de leer.
  • sintaxis de enrutamiento tipo pedestal
  • debe ser performant (encima de Ratpack)
  • contrapresion
  • websockets, sse, cors, seguridad, ssl ...
  • Características únicas para cavar: postal.

Contras (2):

  • No estoy completamente seguro de lo agradable que es la sintaxis de ct / route, y de deshacerse de la especificación de Ring (supuestamente para la historia asíncrona, pero pensé que los chicos del pedestal lo arreglaron)
  • No estoy seguro de cómo integrar Swagger, etc.
  • cuando lo probé, no pude hacerlo funcionar de inmediato

Nota : un punto de referencia de los servidores web de Clojure está disponible, si lo que importa es el rendimiento en bruto.



También está "Noir" ( http://www.webnoir.org/ ), que es un nuevo marco web de Clojure (por lo que los documentos nuevos aún no están disponibles). Proveniente de Django / Rails, comprendo la sintaxis simple y directa y es bastante magra.


Compojure es lo que usé para construir una pequeña aplicación de blogs. Está modelado en Sinatra, que es un marco web mínimo y liviano para Ruby. Principalmente utilicé la ruta, que es como la de Sinatra. Parece que:

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

No hay ORM o biblioteca de plantillas, pero tiene funciones que convierten los vectores en HTML.


Webjure , un framework de programación web para Clojure.

Características: El servlet de despacho llama a las funciones de Clojure. Generación dinámica de HTML. Interfaz de consulta SQL (a través de JDBC).

Esta respuesta es un marcador de posición para la información de Webjure.


Mejor primer Clojure IDE: Nightcode

Para concentrarte en Clojure hasta que superes la curva de aprendizaje en IDE y herramientas: obtén Nightcode Inicialmente, se hizo para que las clases para principiantes continuaran sin sonar la mitad del tiempo en emacs, pero cada vez son más útiles. Básicamente, pone las características para que funcione y se ejecute en un paquete simple.

Tiene un CLOCRE REPL general en una esquina de la ventana, y un segundo REPL se activa, en el área del editor, que tendrá acceso a las funciones que ha escrito hasta ahora. Una pulsación rápida ejecuta la línea que acaba de anotar en REPL. Para la edición optimizada con clojure, tiene un botón para activar / desactivar el crédito (paréntesis administrados activamente con pulsaciones de teclas para envolver / desenvolver / etc.). Puede implementar un conjunto de plantillas listas para usar para iniciar su proyecto en un estado listo para codificar. Hay un botón de un solo clic para crear un jar (archivo único ejecutable Java). Tiene integración GIT para extraer y enviar a github sin requerir la instalación de GIT en la máquina.
Estoy seguro de que el JDK (kit de desarrollo de Java) es necesario para hacer el contenedor de forma adecuada; pero he podido descargar Nightcode en cualquier computadora con un tiempo de ejecución de Java reciente y trabajo lejos (es un jar de Java, sin necesidad de instalación).

Utilizará Leinengen y aprenderá más editores; pero para empezar a programar realmente sin la confusión inicial de succión de almas, Nightcode es una herramienta increíble.





clojure