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

216

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

pupeno
источник
1
Мне было интересно, хотите ли вы использовать Java Native API или Clojure Native?
Андер Тернер
Ande: Я действительно не уверен, так как я так мало знаю о мире Java в этом отношении (но я уже использую Java, язык, уже некоторое время на работе).
Пупено
Я думаю, было бы неплохо, если бы этот вопрос закончился списком веб-фреймворков Clojure, по одному ответу на каждый, и каждый мог проголосовать за своего фаворита. Я думаю, что Мередидд, безусловно, ответ Compojure. Я добавлю один для Webjure, и было бы неплохо сравнить.
Пупено
Pupeno! Я прибыл сюда в поисках «веб-приложений с clojure». Эта страница была первым результатом в Google.
Себастьян Гриньоли
2
Посмотрите также на связанный вопрос stackoverflow.com/questions/3325033/…
Петр Гладких

Ответы:

104

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

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


источник
16
Был ли комментарий Ричарда предназначен для этого ответа? Я не понимаю это
Джон Кромарти
26
@ Ричард Ваш аргумент довольно глупый. Да, если вы решите использовать библиотеки Java, во многих случаях вы перестаете быть функциональными. Но смысл этих библиотек в том, что вам никогда не придется делать это снова . Например, Ring - оболочка Clojury для сервлетов, поэтому вам не нужно использовать сервлеты напрямую. Вы бы предложили, чтобы мы заново изобрели колесо веб-разработки, а не делали совершенно хорошие инструменты Java хорошими для использования из Clojure? Где в этом логика? Кроме того, как имеющий вариант использования этих библиотек плохо? ...
Рэйн
15
@Richard Весь ваш аргумент подразумевает, что нефункциональный не Clojure код по своей природе настолько плох, что даже его наличие, скрытое под библиотекой, является загрязнением. Я не понимаю этого рассуждения. Многие библиотеки Java являются полезными и мощными частями кода. Зачем переписывать их с нуля, когда мы можем просто предоставить наши собственные библиотеки-обертки, которые позволяют элегантно и функционально использовать их из Clojure?
Рэйн
10
@Richard, не стесняйтесь сделать http-сервер в чистом виде.
Gtrak
5
В терминах Lisp / Clojure функция не имеет побочных эффектов. (см. gigamonkeys.com/book/… ). Однако, как указано в Лиспе ( landoflisp.com/trade_func.png ), чисто функциональная программа, как правило, не очень полезна, потому что побочные эффекты необходимы для таких действий, как запись записей в базе данных, загрузка файлов, публикация в REST-сервер, генерация изображений и т. Д.
lfalin
179

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

Кольцо обеспечивает основу, абстрагируя процесс 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 может быть утомительной, поэтому 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

Росс Годдард
источник
48

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

elithrar
источник
Webnoir действительно очень полезен! Начать очень легко - вы можете немного его развить, на самом деле немного похоже на разработку php - просто запустите сервер (на этот раз с leiningen), отредактируйте ваши файлы и перезагрузите браузер, чтобы увидеть, что вы получили.
Claj
С тех пор как @elithrar ответил, у Noir теперь есть документы: webnoir.org/docs
Алистер Коллинз
18
Просто для записи, кажется, что Noir устарел и больше не поддерживается ....
SolarBear
20

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

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

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

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

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

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

Compojure

  • Плюсы (1):

    • легко, много шаблонов / примеров (например, Luminous)
  • Минусы (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 ...)
  • производительность выглядит хорошо (см. пост 600K одновременных подключений)

Минусы (2):

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

Nginx-Clojure

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

Плюсы (2):

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

Минусы (1):

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

Immutant

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

Плюсы:

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

Минусы:

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

Catacumba

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

Плюсы (6):

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

Минусы (2):

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

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

Nha
источник
Отличное сравнение. не знаю, как работает метафора nginx :)
matanster,
1
@matanster Я вижу Apache в качестве сервера перехода по умолчанию для многих организаций. Просто, работает для многих. Но он старше nginx и использует другую внутреннюю модель. Compojure является синхронным (это может измениться), в то время как Yada является асинхронным. Еще одно преимущество Yada, о котором я не упомянул, состоит в том, что все является данными, так что гораздо проще составлять / преобразовывать / проверять / генерировать по сравнению с макросами, как в Compojure.
ня
14

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

Другие классные фреймворки - это hoplon.io и Om Дэвида Нолена (на основе React)

claj
источник
11

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

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

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

pupeno
источник
3
Я не уверен, что это хороший пример. В то время как кодовая база кажется поверхностной (хорошей), в Java достаточно написано, что она, кажется, не попадает в цель. Я бы ожидал чисто clojure рамки.
Ричард
8

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

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

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

Джо У.
источник
3

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

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

Свери
источник
3

Я добавлю два цента для Duct , также от @weavejester , хранителя Compojure и Ring.

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

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

Основные характеристики:

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

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

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

KendallB
источник
2

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

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

claj
источник
2

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

ftravers
источник
1

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

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

У него есть кампания на кикстартере, в которой утверждается, что он предлагает «начать работу», аналогичный Rails. Он разработан Cognitect.

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

Мика Эллиотт
источник
1

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

dfbernal
источник