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

StackOverflow https://stackoverflow.com/questions/167262

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Безусловно, лучшая веб-платформа Clojure, с которой я когда-либо сталкивался, - это Compojure: http: // github. ком / weavejester / compojure / дерево / мастер

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

Другие советы

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

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

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

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

Работа напрямую с 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

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

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

Моя текущая веб-библиотека сейчас яда.

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

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

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

Немного поигравшись с различными веб-серверами, вот мой краткий список плюсов и минусов:

Короткий ответ :посмотри на Люминус чтобы начать быстро, возможно, перейдете к чему-то другому по мере развития ваших потребностей (возможно, к Яде).

Compojure

  • Плюсы (1):

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

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

Пьедестал

  • Плюсы (3):

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

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

Алеф

Плюсы (3):

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

Минусы (1):

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

Яда

Плюсы (3):

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

Минусы (1):

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

HttpKit

Плюсы (2):

  • Написано на Clojure!(и Ява...)
  • производительность выглядит хорошей (см. публикацию о 600 тыс. одновременных подключений)

Минусы (2):

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

Nginx-Clojure

Примечание :Я с ним не играл, в основном из-за отсутствия документации.Хотя выглядит это интересно и очень эффектно.

Плюсы (2):

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

Минусы (1):

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

Иммутант

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

Плюсы:

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

Минусы:

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

Катакумба

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

Плюсы (6):

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

Минусы (2):

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

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

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

Другие интересные фреймворки: hoplon.io и Ом (на основе React)

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

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

Этот ответ предназначен для заполнения информации о Webjure.

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

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

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

Вы также можете посмотреть эти фреймворки (взято из раскрытие/проекты):

Есть еще один связанный вопрос о переполнении стека: Зрелые веб-фреймворки Clojure?

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

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

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

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

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

Основные особенности:

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

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

Еще одно личное замечание: я использую Duct в нескольких производственных приложениях уже больше года и очень им доволен.

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

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

С ним легко повозиться.

Перефразируйте и om.next, вероятно, то, что вы ищете.

Arachne - это веб-фреймворк для новичков. Цитирую описание сайта:

  

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top