Jak tworzysz aplikację internetową w Clojure? [Zamknięte]

216

Przypuszczam, że jest to dziwne pytanie dla ogromnej większości programistów, którzy codziennie pracują z Javą. Ja nie. Znam język Java, ponieważ pracowałem nad projektami Java, ale nie Java-the-world. Nigdy nie tworzyłem aplikacji internetowej od zera w Javie. Jeśli muszę to zrobić w Pythonie, Ruby, wiem gdzie iść (Django lub Rails), ale jeśli chcę stworzyć aplikację internetową w Clojure, nie dlatego, że jestem zmuszony żyć w świecie Java, ale dlatego, że lubię ten język i chcę go wypróbować, jakich bibliotek i ram powinienem użyć?

pupeno
źródło
1
Zastanawiałem się, czy chcesz użyć Java Native API czy Clojure Native?
Ande Turner,
Ande: Naprawdę nie jestem pewien, ponieważ tak mało wiem o świecie Java pod tym względem (ale już od jakiegoś czasu korzystam z języka Java, języka).
pupeno
Myślę, że byłoby miło, gdyby to pytanie zakończyło się listą frameworków internetowych Clojure, po jednej odpowiedzi i każdy mógłby głosować na swojego faworyta. Myślę, że odpowiedź Meredydda jest zdecydowanie odpowiedzią Compojure. Dodam jeden dla Webjure i miło byłoby mieć porównanie.
pupeno
Pupeno! Przybyłem tutaj, szukając „aplikacji internetowych z clojure”. Ta strona była pierwszym wynikiem w Google.
Sebastián Grignoli
2
Zobacz także powiązane pytanie stackoverflow.com/questions/3325033/...
Petr Gladkikh

Odpowiedzi:

104

Zdecydowanie najlepszym frameworkiem Clojure, z jakim się zetknąłem, jest Compojure: http://github.com/weavejester/compojure/tree/master

Jest mały, ale mocny i ma pięknie elegancką składnię. (Używa Jetty pod maską, ale ukrywa przed sobą API serwletów, chyba że tego chcesz, co nie będzie często). Przejrzyj plik README pod tym adresem URL, a następnie pobierz migawkę i zacznij grać.


źródło
16
Czy komentarz Richarda był przeznaczony do tej odpowiedzi? Nie rozumiem tego
John Cromartie,
26
@Richard Twój argument jest dość głupiutki. Tak, jeśli zdecydujesz się na użycie bibliotek Java, w wielu przypadkach rezygnujesz z bycia funkcjonalnym. Ale celem tych bibliotek jest to, że nigdy więcej nie musisz tego robić . Na przykład, Ring jest opakowaniem Clojury wokół serwletów, więc nie musisz używać serwletów bezpośrednio. Czy zaproponowałbyś, abyśmy na nowo wymyślili koło programowania od zera, zamiast uczynić z Clojure doskonale dobre narzędzia Java? Gdzie jest w tym logika. Ponadto, jak się o możliwość korzystania z tych bibliotek złe? ...
Rayne
15
@Richard Cały twój argument sugeruje, że niefunkcjonalny, nie-Clojure kod jest z natury tak zły, że nawet jego obecność ukryta pod biblioteką jest skażeniem. Nie rozumiem tego rozumowania. Wiele bibliotek Java to przydatne i potężne fragmenty kodu. Po co przepisywać te od podstaw, skoro możemy po prostu zapewnić własne biblioteki opakowań, które umożliwiają ich eleganckie i funkcjonalne korzystanie z Clojure?
Rayne,
10
@Richard, nie krępuj się i stwórz serwer http w czystym stylu.
gtrak
5
W kategoriach Lisp / Clojure funkcja nie ma skutków ubocznych. (patrz gigamonkeys.com/book/… ). Jednak, jak wskazano w Land of Lisp ( landoflisp.com/trade_func.png ), czysto funkcjonalny program zazwyczaj nie jest zbyt przydatny, ponieważ efekty uboczne są niezbędne do robienia rzeczy, takich jak pisanie rekordów bazy danych, pobieranie plików, wysyłanie do Serwer REST, generowanie obrazów itp.
lfalin
179

Compojure nie jest już kompletnym środowiskiem do tworzenia aplikacji internetowych. Od wydania wersji 0.4 komponowanie zostało podzielone na kilka projektów.

Pierścień stanowi podstawę, wyodrębniając proces żądania i odpowiedzi HTTP. Pierścień przeanalizuje przychodzące żądanie i wygeneruje mapę zawierającą wszystkie części żądania, takie jak nazwa użytkownika, nazwa serwera i metoda żądania. Aplikacja obsłuży następnie żądanie i na podstawie żądania wygeneruje odpowiedź. Odpowiedź jest reprezentowana jako mapa zawierająca następujące klucze: status, nagłówki i treść. Prosta aplikacja wyglądałaby następująco:

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

Inną częścią Ringa jest koncepcja oprogramowania pośredniego. Jest to kod umieszczony między modułem obsługi i przychodzącym żądaniem i / lub odpowiedzią wychodzącą. Niektóre z wbudowanych programów pośrednich obejmują sesje i stacktrace. Oprogramowanie sesji doda klucz: sesja do mapy żądań, która zawiera wszystkie informacje o sesji dla użytkownika wysyłającego żądanie. Jeśli klucz sesji: jest obecny na mapie odpowiedzi, zostanie zapisany dla następnego żądania złożonego przez bieżącego użytkownika. Podczas gdy oprogramowanie pośredniczące śledzenia stosu przechwytuje wszelkie wyjątki występujące podczas przetwarzania żądania i generuje dane śledzenia stosu, które są odsyłane jako odpowiedź, jeśli wystąpią jakiekolwiek wyjątki.

Bezpośrednia praca z Pierścieniem może być żmudna, dlatego Compojure jest zbudowany na Pierścieniu , który usuwa szczegóły. Aplikacja może być teraz wyrażona w kategoriach routingu, dzięki czemu możesz mieć coś takiego:

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

Compojure nadal pracuje z mapami zapytań / odpowiedzi, więc zawsze możesz uzyskać do nich dostęp w razie potrzeby:

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

W tym przypadku część {uri: uri} uzyskuje dostęp do klucza: uri w mapie żądań i ustawia wartość uri na tę wartość.

Ostatnim komponentem jest czkawka, która ułatwia generowanie html. Różne znaczniki html są reprezentowane jako wektory, przy czym pierwszy element reprezentuje nazwę znacznika, a pozostała część jest znacznikiem. "<h2>A header</h2>"staje się [:h2 "A Header"]. Atrybuty znacznika znajdują się na opcjonalnej mapie. "<a href='/login'>Log In Page</a>"staje się [:a {:href "/login"} "Log In Page"]. Oto mały przykład użycia szablonu do wygenerowania 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)))

Oto link do wstępnego szkicu pewnej dokumentacji obecnie pisanej przez autora kompozycji, która może być dla Ciebie pomocna: Dokument Compojure

Ross Goddard
źródło
48

Istnieje również „Noir” ( http://www.webnoir.org/ ), który jest nowym frameworkiem sieciowym Clojure (więc nowych dokumentów jeszcze nie ma). Pochodząc z Django / Rails, kopie prostą składnię i jest dość uboga.

elithrar
źródło
Webnoir jest naprawdę bardzo przydatny! Rozpoczęcie pracy z programem jest bardzo łatwe - możesz go trochę rozwinąć, tak jak na przykład php - po prostu uruchom serwer (tym razem z leiningen), edytuj pliki i załaduj ponownie przeglądarkę, aby zobaczyć, co masz.
claj
Odkąd @elithrar odpowiedział, Noir ma teraz dostępne dokumenty: webnoir.org/docs
Alistair Collins
18
Tylko dla porządku, wydaje Noir jest przestarzała i nie jest już aktualizowany ....
SolarBear
25

Zastanów się nad strukturą internetową Luminus . Nie mam przynależności, ale słyszałem dobre rzeczy od przyjaciół, których szanuję.

Michael Easter
źródło
20

Moja obecna biblioteka internetowa to yada .

Jeśli dopiero zaczynasz, serwerem wprowadzającym jest Compojure. Widzę to jako apacheserwer WWW w świecie Clojure (w takim przypadku yada / aleph to nginx). Możesz użyć Luminusjako szablonu. Istnieją jego warianty compojure-api.

Próbowałem ou Pedestali byłem z tego globalnie zadowolony. Nie twierdzę, że go opanowałem, ale ma przyjemną składnię, wydaje się bardzo spójny i wygląda na świetną wydajność. Jest również wspierany przez Cognitect(firmę Clojure / Datomic, w której pracuje Rich Hickey).

Okazało się, Alephże prezentuję interesującą abstrakcję, a wbudowane przeciwciśnienie wydaje się interesujące. Jeszcze się nim nie bawiłem, ale zdecydowanie jest na mojej liście.

Po krótkiej grze z różnymi serwerami internetowymi, oto moja szybka lista Pro / Cons:

Krótka odpowiedź: spójrz na Luminusa, aby szybko zacząć, być może przejdź do czegoś innego w miarę ewolucji twoich potrzeb (może Yada).

Compojure

  • Plusy (1):

    • łatwe, wiele szablonów / przykładów (np. Luminous)
  • Minusy (2):

    • Nie wydajne (wątek na żądanie), oczekuj wydajności nieco lepszej niż szyny
    • Nie jest to proste, model oprogramowania pośredniego ma niedogodności

Piedestał

  • Plusy (3):

    • model przechwytywacza, przyjemna składnia, aby dodać przechwytywacze do podzbioru tras
    • wydajny router
    • obsługuje formaty json / tranzyt / wieloczęściowe w przejrzysty sposób, bez pytania. Bardzo fajny !
  • Minusy (4):

    • brak wsparcia dla websocket (jeszcze), dobrze byłoby zwrócić kanały core.async
    • nieco powolny do przeładowania, jeśli umieścisz go w komponencie Stuarta Sierra (myślę, że powinieneś użyć przechwytywacza przeładowania)
    • brak możliwości testowania dla przechwytywaczy asynchronicznych
    • wymaga wpisowego (?)

Aleph

Pro (3):

  • Performant
  • ciśnienie zwrotne
  • Obsługa Websocket / SSE podczas zwracania strumienia z rozmaitości

Minusy (1):

  • Niski poziom, zrób to sam styl (tzn. Daje to po prostu sposób na zmuszenia twoich handlerów do zrobienia czegoś. Bez routera, bez niczego). Nie jest to naprawdę wada, po prostu bądź tego świadomy.

Yada

Pro (3):

  • zbudowany na Aleph
  • negocjacja treści
  • integracja swagger
  • bidi jest całkiem w porządku (chociaż bardziej podoba mi się składnia routera na cokole)

Minusy (1):

  • dokumentacja (choć nie tak zła jak nginx-clojure, szybko się poprawia).

HttpKit

Pro (2):

  • Napisane w Clojure! (i Java ...)
  • wydajność wygląda dobrze (zobacz wpis o jednoczesnych połączeniach 600 000)

Minusy (2):

  • Brak obsługi CORS
  • Robaki ? Ponadto niewiele ostatnich zmian

Nginx-Clojure

Uwaga: nie grałem z tym, głównie z powodu braku dokumentacji. Wygląda jednak interesująco i bardzo wydajnie.

Plusy (2):

  • Nginx (performant, odciążenie ssl, restart pracowników ...)
  • Czy ten model może pozwolić na aktualizacje o zerowym czasie przestoju? To byłoby tak niesamowite !

Minusy (1):

  • Dokumentacja (poprawa). Ponadto nie chcę programować w ciągach znaków osadzonych w pliku konfiguracyjnym nginx, jeśli jest to jedyny sposób, aby to zrobić.
  • Prawdopodobnie komplikuje to nieco pierwsze wdrożenie (?)

Odporny

Uwaga: nie grałem z tym.

Plusy:

  • zintegrowane (buforowanie, przesyłanie wiadomości, planowanie, wdrażanie wildfly)

Cons :

  • brak klienta http

Catacumba

Uwaga: nie grałem z tym, chociaż dokumentacja wygląda doskonale. Prawdopodobnie zamierzam spróbować później. Istnieją przykładowe projekty czatów, które wyglądają interesująco, ich intensywne wykorzystanie protokołów zniechęciło mnie na początku jako początkującego programistę Clojure.

Plusy (6):

  • dokumentacja! Jak wszystkie projekty funcool, dokument jest bardzo przyjemny do czytania.
  • składnia routingu podobna do cokołu
  • powinien być wydajny (na szczycie Ratpack)
  • ciśnienie zwrotne
  • websockets, sse, cors, security, ssl ...
  • unikalne funkcje do kopania: pocztowe

Minusy (2):

  • Nie jestem całkowicie pewien, jak przyjemna jest składnia ct / trasy, a także porzucenie specyfikacji Ring (podobno do historii asynchronicznej, ale myślałem, że naprawili to faceci z piedestału)
  • Nie jestem pewien, jak zintegrować swagger itp.
  • kiedy spróbowałem, nie byłem w stanie sprawić, by działał od razu

Uwaga : dostępny jest test porównawczy serwerów sieciowych Clojure , jeśli liczy się tylko wydajność.

nha
źródło
Świetne porównanie. nie jestem pewien, jak działa metafora nginx :)
Matanster
1
@matanster Widzę apache jako domyślny serwer go-to dla wielu organizacji. Prosty, działa dla wielu. Ale jest też starszy niż nginx i używa innego modelu wewnętrznego. Compojure jest synchroniczny (może się zmienić), podczas gdy Yada jest asynchroniczny. Inną zaletą Yady, o której nie wspomniałem, jest to, że wszystko jest danymi, więc o wiele łatwiej jest komponować / przekształcać / sprawdzać / generować w porównaniu do makr takich jak w Compojure.
nha
14

W dzisiejszych czasach Cokół jest strukturą wartą obejrzenia. Jest to platforma po stronie serwera, która opiera się na Ring , ale także uwalnia przychodzące żądanie z początkowego wątku, ponieważ jest w stanie wstrzymać i wznowić to konkretne żądanie (w przeciwnym razie wolne żądanie faktycznie blokuje ten wątek serwera). Może trochę jak JavaBean.

Inne fajne frameworki to hoplon.io i Om Davida Nolena (na podstawie React)

claj
źródło
11

Webjure , framework do programowania stron internetowych dla Clojure.

Cechy: Wywołanie serwletu wywołuje funkcje Clojure. Dynamiczne generowanie HTML. Interfejs zapytań SQL (przez JDBC).

Ta odpowiedź ma być symbolem zastępczym dla informacji o Webjure.

pupeno
źródło
3
Nie jestem też pewien, czy to dobry przykład. Podczas gdy podstawa kodu wydaje się płytka (dobra), w Javie jest napisanych wystarczająco dużo, że wydaje się, że brakuje znaku. Oczekiwałbym czystych ram clojure.
Richard
8

Compojure to to, co kiedyś tworzyłem małą aplikację do blogowania. Jest wzorowany na Sinatrze, która jest minimalną, lekką platformą internetową dla Ruby. Przeważnie korzystałem z routingu, podobnie jak Sinatry. To wygląda jak:

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

Nie ma biblioteki ORM ani szablonów, ale ma funkcje, które przekształcają wektory w HTML.

Joe W.
źródło
3

Oświadczenie: Jestem autorem.

Złożyłem szablon leiningen, który łączy szablony luminusweb i kasztanowe. Otrzymujesz więc coś, z czego możesz zbudować kod clojure i kod clojurescript dla frontonu i backendu.
Dodatkowo zapewnia zarządzanie użytkownikami oraz proste generowanie CRUD i kilka innych małych i przyjemnych: https://github.com/sveri/closp

sveri
źródło
3

Wrzucę moje dwa centy za Duct , również od @weavejester , opiekuna Compojure i Ring.

U ich podstaw leży Component i router Ring pod jednym dachem. Powody, dla których używam Duct:

  • Doskonały fundament filozoficzny: zachęca do zbudowania aplikacji jako serii małych elementów i zapewnia dobrą równowagę między utrzymywaniem niewielu opinii i zapewnianiem rozsądnych ustawień domyślnych.
  • Stabilna ścieżka: mówię za siebie, ale przez lata czułem, że społeczność Clojure prezentowała jedną mniej wiarygodną platformę internetową za drugą. Para po prostu poczuła się zbyt eksperymentalna (moje doświadczenie z Omem i postumentem po stronie klienta), aby „załatwić sprawy” (nie żeby nie okazały się lepsze na drodze). Z drugiej strony wydaje mi się, że @weavejester wniósł do Duct taką samą stabilność i mierzył postęp, jak w przypadku Compojure i Ring, które doskonale się urodziły w społeczności.
  • Jest bardzo lekki i nie przeszkadza moim komponentom.

Główne cechy:

  • Organizuje trasy według „punktów końcowych”, małych elementów, które można traktować jak mini-serwery sieciowe (lub małe przekroje tras HTTP).
  • Gotowe wsparcie dla Przeładowanego przepływu pracy .
  • Idealna integracja z Ring i Compojure.
  • Konfiguracje rozwojowe i produkcyjne (coś, czego wyraźnie brakowało gdzie indziej).
  • Dobra dokumentacja z przykładami.

Uwaga: To oczywiste, ale z korzyścią dla początkujących twórców stron internetowych, podobnie jak większość rzeczy Clojurey, Duct wymaga solidnej znajomości języka Clojure. Polecam również najpierw przeczytać o komponencie.

Z innej osobistej uwagi, korzystałem z Duct w kilku aplikacjach produkcyjnych od ponad roku i jestem z tego bardzo zadowolony.

Kendall B.
źródło
2

możesz także wypróbować Clojure na cewkach, http://github.com/zubairq/coils - wyłączenie odpowiedzialności: Jestem autorem

Yazz.com
źródło
2

Innym interesującym serwerem internetowym jest zestaw HTTP . Ma dobrą wydajność i jest zgodny z pierścieniem, a także obsługuje WebSockets. Jest produkowany głównie w clojure i brakuje niektórych dziwnych rzeczy w Jetty / Tomcat.

Łatwo go majstrować.

claj
źródło
2

Odśwież i om. Prawdopodobnie to, czego szukasz.

wędrowcy
źródło
1

Arachne to platforma internetowa dla początkujących. Cytując opis strony:

Arachne to pełne, wysoce modułowe środowisko programistyczne dla Clojure. Podkreśla łatwość, prostotę oraz solidny, skalowalny design.

Ma kampanię typu kickstarter, która twierdzi, że oferuje „pierwsze kroki” podobne do Railsów. Jest rozwijany przez Cognitect.

Oto dobra dyskusja na ten temat z autorem Luminusa (yogthos).

Micah Elliott
źródło
1

Od dłuższego czasu z powodzeniem używam Liberatora w produkcji. Jest to świetny framework, jeśli chcesz tylko gołe kości, np. Jeśli budujesz usługę internetową RESTful lub coś podobnego. Zasadniczo jest to opakowanie dla pierścienia i komponentu i zapewnia wykres decyzji podczas sprawdzania poprawności przychodzących żądań. Jest także niezwykle szybki w porównaniu z innymi bardziej nieporęcznymi strukturami sieciowymi. Jeśli chcesz zacząć gdzieś szybko i powoli budować, Liberator to świetny wybór.

dfbernal
źródło