Как сделать веб-приложение в Clojure?

Полагаю, это странный вопрос для огромного большинства программистов, работающих ежедневно с Java. Я не. Я знаю Java-язык, потому что я работал над Java-проектами, но не с Java-the-world. Я никогда не делал веб-приложение с нуля на Java. Если мне нужно это сделать с Python, Ruby, я знаю, куда идти (Django или Rails), но если я хочу сделать веб-приложение в Clojure, не потому, что я вынужден жить в мире Java, но потому что мне нравится язык, и я хочу попробовать, какие библиотеки и фреймворки следует использовать?

Ответ 1

На сегодняшний день лучшей веб-картой Clojure, с которой я столкнулся, является Compojure: http://github.com/weavejester/compojure/tree/master

Он маленький, но мощный, и имеет красиво элегантный синтаксис. (Он использует Jetty под капотом, но он скрывает API сервлета от вас, если вы этого не хотите, что не будет часто). Перейдите к README по этому URL-адресу, затем загрузите снимок и начните воспроизведение.

Ответ 2

Compojure больше не является полной основой для разработки веб-приложений. Начиная с выпуска 0,4, compojure был разорван на несколько проектов.

Ring обеспечивает основу, абстрагируя процесс HTTP-запроса и ответа. Ring будет анализировать входящий запрос и создать карту, содержащую все части запроса, такие как uri, имя сервера и метод запроса. Затем приложение обработает запрос и на основе запроса генерирует ответ. Ответ представлен как карта, содержащая следующие ключи: статус, заголовки и тело. Таким образом, простое приложение будет выглядеть так:

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

Еще одна часть Кольца - это концепция среднего класса. Это код, который находится между обработчиком и входящим запросом и/или исходящим ответом. Некоторые встроенные средние предметы включают сеансы и стек. Средство сеанса добавит: ключ сеанса к карте запроса, содержащий всю информацию о сеансе для пользователя, делающего запрос. Если ключ сеанса присутствует на карте ответа, он будет сохранен для следующего запроса, сделанного текущим пользователем. В то время как промежуточное средство трассировки стека будет захватывать любые исключения, возникающие при обработке запроса, и генерировать трассировку стека, которая отправляется обратно в качестве ответа, если происходят какие-либо исключения.

Работа непосредственно с Ring может быть утомительной, поэтому Compojure построена поверх Ring, абстрагируя детали. Теперь приложение можно выразить в терминах маршрутизации, чтобы вы могли иметь что-то вроде этого:

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

Compojure все еще работает с картами запроса/ответа, поэтому вы всегда можете получить к ним доступ, если необходимо:

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

В этом случае часть {uri: uri} обращается к ключу: uri в карте запроса и устанавливает uri для этого значения.

Последний компонент Hiccup, который упрощает создание html. Различные теги html представлены в виде векторов с первым элементом, представляющим имя тега, а остальное - телом тега. "<h2>A header</h2>" становится [:h2 "A Header"]. Атрибуты тега находятся в дополнительной карте. "<a href='/login'>Log In Page</a>" становится [:a {:href "/login"} "Log In Page"]. Вот небольшой пример использования шаблона для генерации 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)))

Вот ссылка на черновик какой-либо документации, написанной автором compojure, которая может вам пригодиться: Compojure Doc

Ответ 3

Там также "Noir" (http://www.webnoir.org/), который представляет собой новую веб-инфраструктуру Clojure (так что новые документы не там еще). Исходя из Django/Rails, я копаю простой, простой синтаксис, и он довольно скудный.

Ответ 4

Рассмотрим веб-инфраструктуру Luminus. У меня нет привязанности, но я слышал хорошие вещи от друзей, которых я уважаю.

Ответ 5

Моя текущая веб-библиотека теперь yada.

Если вы только начинаете, вводный сервер Compojure. Я рассматриваю его как apache веб-серверов в мире Clojure (в этом случае yada/aleph будет nginx). Вы можете использовать Luminus в качестве шаблона. Существуют варианты, такие как compojure-api.

Я попробовал ou Pedestal и был в целом удовлетворен этим. Я не претендую на то, чтобы овладеть им, но он имеет приятный синтаксис, чувствует себя очень сплоченным и выглядит так, как будто у него отличная производительность. Он также поддерживается Cognitect (компанией Clojure/Datomic, где работает Rich Hickey).

Я нашел Aleph, чтобы представить интересную абстракцию, и встроенное противодавление кажется интересным. Мне еще предстоит сыграть с ним, но это определенно в моем списке.

После небольшого разговора с различными веб-серверами, вот мой быстрый список Pro/Cons:

Краткий ответ: посмотрите Luminus, чтобы быстро начать работу, возможно, перейти к чему-то еще по мере того, как ваши потребности эволюционируют (возможно, Yada).

Compojure

  • Плюсы (1):

    • легко, множество шаблонов/примеров (например, светящиеся)
  • Минусы (2):

    • Не работает (поток за запрос), ожидайте, что показатели немного лучше, чем рельсы.
    • Непростая модель промежуточного программного обеспечения имеет неудобства

Пьедестал

  • Плюсы (3):

    • модель перехватчика, приятный синтаксис для добавления перехватчиков в подмножество маршрутов.
    • маршрутизатор производительности
    • поддерживает json/transit/multipart формы прозрачно из коробки, не спрашивая ничего. Очень круто!
  • Минусы (4):

    • поддержка websocket (пока), возвращение каналов core.async было бы приятным
    • немного медленнее перезагружать, если поместить его в компонент Stuart Sierra (я думаю, вы должны использовать перехватчик перезагрузки)
    • нет средств тестирования для асинхронных перехватчиков
    • требует бай-ин (?)

Алеф

Pro (3):

  • производительным
  • противодавление
  • Поддержка Websocket/SSE при возврате потока коллектора

Минусы (1):

  • Низкий уровень, сделай сам стиль (т.е. он просто дает вам способ заставить обработчиков что-то сделать. Нет маршрутизатора, ничего нет). Не совсем минусы, просто имейте это в виду.

Яд

Pro (3):

  • построено на Алефе
  • Конфликт контента
  • интеграция трюков
  • bidi вполне нормально (хотя мне лучше нравится синтаксис маршрутизатора пьедестала)

Минусы (1):

  • (хотя и не так плохо, как nginx- clojure, быстро улучшается).

HttpKit

Pro (2):

  • Написано в Clojure! (и Java...)
  • производительность выглядит неплохо (см. столбец параллельных соединений 600 КБ)

Минусы (2):

  • Поддержка CORS
  • Ошибки? Кроме того, не так много недавних коммитов

Nginx- Clojure

Примечание. Я не играл с ним, главным образом из-за отсутствия документации. Он выглядит интересным, хотя и очень впечатляющим.

Плюсы (2):

  • Nginx (исполнитель, offload ssl, перезапуск рабочих...)
  • Может ли эта модель разрешить обновления с нулевым временем простоя? Это было бы так здорово!

Минусы (1):

  • Документация (улучшение). Кроме того, я не хочу программировать строки, встроенные в конфигурационный файл nginx, если это единственный способ сделать это.
  • Вероятно, немного усложняет первое развертывание (?)

Immutant

Примечание. Я не играл с ним.

Плюсы:

  • интегрированный (кэширование, обмен сообщениями, планирование, развертывание wildfly)

Минусы:

  • нет http-клиента

Catacumba

Примечание. Я не играл с ним, хотя документация выглядит превосходно. Вероятно, я попытаюсь это сделать дальше. Есть примеры чат-проектов, которые выглядят интересными, их интенсивное использование протоколов сначала отключает меня как новичка Clojure dev.

Плюсы (6):

  • документация! Как и все проекты funcool, документ очень приятно читать.
  • синтаксис маршрутизации, подобный пьедесталу
  • должен быть исполнен (поверх Ratpack)
  • противодавление
  • websockets, sse, cors, security, ssl...
  • уникальные возможности для копания: почтовый

Минусы (2):

  • Не совсем уверен в том, насколько приятен синтаксис ct/routes, и о том, чтобы отбросить спецификацию Ring (предположительно для асинхронной истории, но я думал, что ребята из пьедестала исправили это)
  • Не уверен, как можно интегрировать swagger и т.д.
  • Когда я попробовал, я не смог заставить его работать сразу.

Примечание: ориентир веб-серверов Clojure доступен, если важна сырая производительность.

Ответ 6

В наши дни Pedestal - это рамка, заслуживающая внимания. Это серверная структура, которая строится поверх Ring, но также освобождает входящий запрос из начального потока, будучи в состоянии приостановить и возобновить этот конкретный запрос (в противном случае медленный запрос фактически блокирует этот серверный файл). Может быть, вроде JavaBean.

Другие классные рамки hoplon.io и David Nolen Om (на основе Реагирования)

Ответ 7

Webjure, структура веб-программирования для Clojure.

Особенности: диспетчер сервлета вызывает функции Clojure. Динамическое генерирование HTML. Интерфейс запросов SQL (через JDBC).

Этот ответ подразумевается как заполнитель для информации Webjure.

Ответ 8

Сопоставьте, что я использовал для создания крошечного приложения для ведения блога. Он смоделирован на Sinatra, который представляет собой минимальную, легкую веб-структуру для Ruby. В основном я использовал маршрутизацию, которая, как и Синатра. Это выглядит так:

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

Там нет библиотеки ORM или templating, но у нее есть функции, которые превращают векторы в HTML.

Ответ 10

Отказ от ответственности: я автор.

Я собрал шаблон leiningen, в котором сочетаются шаблоны luminusweb и каштановые. Таким образом, вы получаете что-то, что вы можете построить код clojure с кодом и clojurescript для front и backend.
Кроме того, он обеспечивает управление пользователями, а также некоторое простое создание CRUD и еще несколько небольших приятных возможностей: https://github.com/sveri/closp

Ответ 11

вы также можете попробовать Clojure on Coils, http://github.com/zubairq/coils - отказ от ответственности: я автор

Ответ 12

Другим интересным веб-сервером является Http-kit. Он имеет хорошую производительность и совместим с кольцом, а также поддерживает WebSockets. Он сделан главным образом в clojure, и ему не хватает некоторых странных вещей в Jetty/Tomcat.

Легко возиться с.

Ответ 13

Я запишу два цента за Duct, также из @weavejester, сопровождающий Compojure и Ring.

В этом ядре он приносит Component и кольцевой маршрутизатор под одной крышей. Причины, по которым я использую Канал:

  • Отличная философская основа: она побуждает вас создавать свое приложение в виде серии небольших компонентов, и оно поражает хороший баланс между тем, чтобы придерживаться нескольких мнений, обеспечивая при этом разумные значения по умолчанию.
  • Стабильный путь: я говорю сам за себя, но на протяжении многих лет я чувствовал, что сообщество Clojure представило одну менее чем заслуживающую доверия веб-структуру за другим. Пара просто чувствовала себя слишком экспериментально (мой опыт работы с Om и клиентским пьедесталом) для "выполнения дела" (не то, чтобы они не оказались выше по дороге). С другой стороны, я чувствую, что @weavejester принес такую ​​же стабильность и измеренный прогресс в Канал, что он сделал с Compojure и Ring, которые были великолепно рождены в сообществе.
  • Это суперлегкий вес и из-за моих компонентов.

Основные возможности:

  • Организует маршруты по "конечным точкам", небольшим компонентам, которые можно рассматривать как мини-веб-серверы (или небольшие поперечные сечения ваших HTTP-маршрутов).
  • Встроенная поддержка Перезагруженный рабочий процесс.
  • Идеальная интеграция с Ring и Compojure.
  • Конфигурации разработки и производства (что-то, что я обнаружил, пропавших без вести в другом месте).
  • Хорошая документация с примерами.

Примечание.. Само собой разумеется, но в интересах новичков веб-разработки, таких как большинство вещей Clojurey. Duct требует четкого понимания языка Clojure. Я также рекомендую сначала прочитать о компоненте.

В другой личной заметке я уже более года использую канал в нескольких производственных приложениях и очень доволен им.

Ответ 14

Reframe и om.next, вероятно, то, что вы ищете.

Ответ 15

Arachne - это новая веб-среда. Цитирование описания сайта:

Arachne - это полная, высоко модульная структура веб-разработки для Clojure. Он подчеркивает легкость, простоту и прочную, масштабируемую дизайн.

Он имеет кампания kickstarter заявив, что предложит "начальный" опыт, похожий на Rails. это разработанный Cognitect.

Здесь хорошее обсуждение об этом с автором Luminus (yogthos).

Ответ 16

Я уже давно использовал Liberator в производстве. Это отличная структура, если вы хотите только голые кости, например. если вы создаете веб-службу RESTful или что-то подобное. Это, по сути, обертка для кольца и компоновки и предоставляет граф решений при проверке входящих запросов. Это также очень быстро по сравнению с другими более громоздкими веб-фреймами. Если вы хотите начать где-то быстро и медленно строить, то Liberator - отличный выбор.