Як зробити веб-додаток у Clojure? [зачинено]


216

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


1
Мені було цікаво, чи бажаєте ви використовувати Java Native API чи Clojure Native?
Ande Turner

Анде: Я насправді не впевнений, оскільки я знаю так мало про світ Java в цьому відношенні (але я вже використовую Java, мовою, вже деякий час на роботі).
pupeno

Я думаю, було б непогано, якби це запитання закінчилося списком веб-рамок Clojure, однією відповіддю на кожного, і кожен міг проголосувати за свого фаворита. Я думаю, що Мередідд - це безумовно відповідь Компоюре. Я додам його для Webjure, і було б непогано провести порівняння.
pupeno

Пупено! Я приїхав сюди в пошуках "веб-додатків із клоджуром". Ця сторінка стала першим результатом в Google.
Себастьян Гріньолі

2
Дивіться також пов’язане питання stackoverflow.com/questions/3325033/…
Петро Гладких

Відповіді:


104

На сьогодні найкраща веб-рамка Clojure, з якою я ще стикалася, - це Compojure: http://github.com/weavejester/compojure/tree/master

Він невеликий, але потужний і має прекрасно елегантний синтаксис. (Він використовує Jetty під кришкою, але він приховує від вас сервлетський API, якщо ви цього не хочете, що буде не часто). Перегляньте README за цією URL-адресою, потім завантажте знімок і почніть грати.


16
Чи мав на увазі коментар Річарда для цієї відповіді? Я цього не розумію.
Джон Кромарті

26
@Richard Ваш аргумент досить дурний. Так, якщо ви вирішили використовувати бібліотеки 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, ім'я сервера та метод запиту. Потім додаток буде обробляти запит і на основі запиту генерувати відповідь. Відповідь представлена ​​у вигляді карти, що містить такі клавіші: статус, заголовки та тіло. Таким простим додатком виглядатиме так:

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

Ще одна частина Кільця - це концепція середнього посуду. Це код, який знаходиться між обробником та вхідним запитом та / або вихідною відповіддю. Деякі вбудовані в середній посуд включають сеанси та стек-трек. Середня частина сеансу додасть ключ: сеанс до карти запиту, який містить всю інформацію про сеанс для користувача, який робить запит. Якщо на карті відповідей присутній ключ: сеанс, він буде зберігатися для наступного запиту, зробленого поточним користувачем. У той час як середнє програмне забезпечення трасування стека буде фіксувати будь-які винятки, що виникають під час обробки запиту, та генеруватиме стежку стека, яка буде відправлена ​​назад як відповідь, якщо трапляються винятки.

Робота безпосередньо з Кільцем може бути втомливою, тому Compojure побудований на вершині Кільця, відводячи деталі. Тепер додаток можна виразити у вигляді маршрутизації, щоб ви могли мати щось подібне:

(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, я копаю простий, простий синтаксис, і він досить худий.


Webnoir насправді дуже корисний! Почати це дуже просто - ви можете розробити його трохи фактично так, як здається, розвивається php - просто запустіть сервер (на цей раз з leiningen), відредагуйте файли та перезавантажте веб-переглядач, щоб побачити, що ви отримали.
claj

Оскільки @elithrar відповів, Ноар тепер має доступні документи: webnoir.org/docs
Алістер Коллінз

18
Тільки для запису, здається, Нуар застарілий і більше не підтримується ....
SolarBear


20

Моя поточна веб-бібліотека, яка зараз переходить, є yada .

Якщо ви тільки починаєте, вступним сервером є Compojure. Я бачу це як apacheвеб-сервери у світі Clojure (у такому випадку yada / aleph буде nginx). Ви можете використовувати Luminusяк шаблон. Є його варіанти, як compojure-api.

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

Мені здалося, що я Alephпредставляю цікаву абстракцію, і вбудований тиск здається цікавим. Мені ще належить з цим пограти, але це безумовно в моєму списку.

Погравши трохи з різними веб-серверами, ось мій швидкий список «Про» та «Мінуси»:

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

Compojure

  • Плюси (1):

    • просто, безліч шаблонів / прикладів (наприклад, Світлий)
  • Мінуси (2):

    • Не виконавець (нитка на запит), очікуйте, що виступи трохи кращі, ніж рейки
    • Непросто, модель проміжного програмного забезпечення має незручності

П'єдестал

  • Плюси (3):

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

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

Алеф

Про (3):

  • Виконавець
  • зворотний тиск
  • Підтримка Websocket / SSE при поверненні потоку колекторів

Мінуси (1):

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

Яда

Про (3):

  • побудований на Алефі
  • змістовне обговорення
  • хитра інтеграція
  • bidi - це цілком нормально (хоча мені подобається синтаксис роутера на п’єдесталі краще)

Мінуси (1):

  • документація (хоча не така погана, як nginx-clojure, швидко вдосконалюється).

HttpKit

Про (2):

  • Написано в Clojure! (і Java ...)
  • продуктивність виглядає добре (див. пост одночасного з'єднання 600K)

Мінуси (2):

  • Немає підтримки CORS
  • Клопи? Крім того, не так багато останніх зобов'язань

Nginx-Clojure

Примітка. Я не грав з цим, головним чином через відсутність документації. Це виглядає цікаво, але дуже ефектно.

Плюси (2):

  • Nginx (виконавець, завантажуйте ssl, перезавантажте працівників ...)
  • Чи може ця модель допускати оновлення часу простою? Це було б так приголомшливо!

Мінуси (1):

  • Документація (удосконалення). Крім того, я не хочу програмувати рядки, вбудовані у конфігураційний файл nginx, якщо це єдиний спосіб зробити це.
  • Можливо, трохи ускладнює перше розгортання (?)

Імутант

Примітка: я не грав з цим.

Плюси:

  • інтегрований (кешування, обмін повідомленнями, планування, розгортання wildfly)

Мінуси:

  • немає http-клієнта

Катакумба

Примітка. Я не грав з цим, хоча документація виглядає чудово. Я, мабуть, збираюся спробувати далі. Є приклади чатових проектів, які виглядають цікавими, їхнє важке використання протоколів спочатку мене відклало як початківця розробника Clojure.

Плюси (6):

  • документація! Як і всі проекти функолу, документ дуже приємно читати.
  • синтаксис маршрутизації, що нагадує п’єдестал
  • повинен бути виконавським (поверх Ratpack)
  • зворотний тиск
  • websockets, sse, cors, безпека, ssl ...
  • унікальні особливості копати: поштовий

Мінуси (2):

  • Не зовсім впевнений у тому, наскільки приємний синтаксис ct / route, а також у відкопуванні специфікації Ring (нібито для історії про асинхронізацію, але я подумав, що п'єдестал хлопці це виправили)
  • Не впевнений, як можна було б інтегрувати шахрайство тощо.
  • коли я спробував це, я не зміг змусити його працювати відразу

Примітка : орієнтир веб-серверів Clojure доступний, якщо важлива лише сира продуктивність.


Чудове порівняння. не впевнений, як працює метафора nginx :)
matanster

1
@matanster Я бачу apache як сервер переходу за замовчуванням для багатьох організацій. Просто, працює для багатьох. Але він старший за nginx і використовує іншу внутрішню модель. Compojure є синхронним (що може змінюватися), а Yada - асинхронним. Ще одна перевага Yada, яку я не згадував, полягає в тому, що все - це дані, тому набагато простіше складати / перетворювати / перевіряти / генерувати порівняно з макросами, як у Compojure.
Nha

14

Сьогодні п’єдестал - це рамка, яку варто подивитися. Це серверна основа, яка будується поверх Ring , але також звільняє вхідний запит від початкового потоку, маючи змогу призупинити та відновити цей конкретний запит (інакше повільний запит фактично блокує цей серверний потік). Можливо, на зразок JavaBean.

Інші круті рамки є hoplon.io та Om David David Nolen (на основі React)


11

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

Особливості: Диспетчерський сервлет викликає функції Clojure. Динамічне генерування HTML. Інтерфейс запитів SQL (через JDBC).

Ця відповідь призначена як заповнювач інформації Webjure.


3
Я не впевнений, що це і хороший приклад. Хоча база даних здається неглибокою (хорошою), на Java написано достатньо, що, здається, не вистачає позначки. Я б очікував чистої рамки приналежності.
Річард

8

Compojure - це те, що я використовував для створення крихітного додатка для ведення блогів. Він моделюється на Sinatra, яка є мінімальною, легкою веб-рамкою для Ruby. Я здебільшого просто використовував маршрутизацію, яка подібно до синатри. Це виглядає як:

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

Не існує ORM або бібліотеки шаблонів, але в ній є функції, які перетворюють вектори в HTML.



3

Відмова: Я - автор.

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


3

Я закину свої два центи за Duct , також від @weavejester , підтримувача Compojure та Ring.

По своїй суті, він підводить компонент і маршрутизатор Ring під одним дахом. Причини, чому я використовую Duct:

  • Відмінна філософська основа: він спонукає вас створювати додаток у вигляді серії невеликих компонентів, і він забезпечує хороший баланс між триманням кількох думок, забезпечуючи розумні за замовчуванням.
  • Стабільний шлях: я говорю сам за себе, але протягом багатьох років я відчував, що громада Clojure представляла один менш надійний веб-рамок за іншим. Пара просто відчула себе занадто експериментальною (мій досвід роботи з Омом та п'єдесталом на стороні клієнта) для того, щоб "робити справи" (не те, що вони не стануть чудовими в дорозі). З іншого боку, я відчуваю, що @weavejester приніс ту саму стабільність і виміряв прогрес Duct, що він зробив для Compojure і Ring, які чудово народилися в громаді.
  • Це супер легкий, і з шляху моїх компонентів.

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

  • Організовує маршрути за "кінцевими точками", невеликими компонентами, які ви можете вважати міні-веб-серверами (або невеликими перерізами HTTP-маршрутів).
  • Нестандартна підтримка оновленого робочого процесу .
  • Ідеальна інтеграція з Ring і Compojure.
  • Конфігурації розробки та виробництва (те, що я помітно пропав деінде).
  • Хороша документація з прикладами.

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

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



2

Ще один цікавий веб-сервер - Http-kit . Він має хороші показники і сумісний з кільцем, а також підтримує WebSockets. Він зроблений здебільшого в клоджурі, і не вистачає деяких дивних речей в Jetty / Tomcat.

З цим легко повозитися.



1

Arachne є новою веб-рамкою. Цитуючи опис сайту:

Arachne - це повноцінна, дуже модульна структура веб-розробки для Clojure. Це підкреслює легкість, простоту та міцний, масштабований дизайн.

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

Ось хороша дискусія про це з автором «Люмінуса» (йогтос).


1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.