Clojure'da nasıl web uygulaması yapıyorsunuz? [kapalı]


216

Sanırım bu, Java ile günlük çalışan programcıların büyük çoğunluğu için garip bir soru. Yapmıyorum. Java dilini biliyorum, çünkü Java projelerinde çalıştım, ancak Java dünyasında çalışmadım. Java ile sıfırdan hiç bir web uygulaması yapmadım. Python, Ruby ile yapmam gerekirse, nereye gideceğimi biliyorum (Django veya Rails), ama Clojure'da bir web uygulaması yapmak istersem, Java dünyasında yaşamak zorunda olduğum için değil, çünkü dil gibi ve denemek istiyorum, hangi kütüphaneleri ve çerçeveleri kullanmalıyım?


1
Java Native API veya Clojure Native olanları kullanmak isteyip istemediğinizi merak ediyordum.
Ande Turner

Ande: Bu konuda Java dünyası hakkında çok az şey bildiğimden gerçekten emin değilim (ama bir süredir iş başında olan Java'yı kullanıyorum).
pupeno

Bu sorunun Clojure web çerçevelerinin bir listesi, her biri bir cevapla sonuçlanması ve herkesin en sevdiği oyu vermesi güzel olurdu. Bence Meredydd kesinlikle Compojure'un cevabı. Webjure için bir tane ekleyeceğim ve bir karşılaştırma yapmak güzel olurdu.
pupeno

Pupeno! Buraya "clojure ile web uygulamaları" aramaya geldim. Bu sayfa Google'daki ilk sonuçtu.
Sebastián Grignoli

2
Ayrıca, ilgili soruya da bakın stackoverflow.com/questions/3325033/…
Petr Gladkikh

Yanıtlar:


104

Şimdiye kadar karşılaştığım en iyi Clojure web çerçevesi Compojure: http://github.com/weavejester/compojure/tree/master

Küçük ama güçlü ve güzel zarif sözdizimine sahip. (Kaputun altında Jetty kullanır, ancak istemediğiniz sürece Servlet API'sını sizden gizler, ki bu genellikle olmayacaktır). Gidip o URL'deki README'ye bakın, ardından bir anlık görüntü indirin ve oynamaya başlayın.


16
Richard'ın yorumu bu cevap için miydi? Anlamıyorum.
John Cromartie

26
@Richard Argümanınız oldukça aptalca. Evet, java kütüphanelerini kullanmaya karar verirseniz, birçok durumda işlevsel olmaktan vazgeçersiniz. Ancak bu kütüphanelerin amacı, onu bir daha asla yapmak zorunda kalmamanızdır . Örneğin, Ring, sunucu uygulamaları etrafında bir Clojury sarmalayıcısıdır, böylece sunucu uygulamalarını doğrudan kullanmanız gerekmez. Clojure'dan mükemmel şekilde güzel Java araçlarını kullanmaktan ziyade web geliştirme tekerleğini sıfırdan yeniden keşfetmemizi önerir misiniz? Mantık bunun neresinde. Dahası, bu kütüphaneleri kullanma seçeneği nasıl kötü bir şeydir? ...
Rayne

15
@Richard Tüm argümanınız, işlevsel olmayan Clojure kodunun doğası gereği o kadar kötü olduğunu, bir kütüphanenin altında gizli bile olsa bir kontaminasyon olduğunu ima eder. Bu muhakemeyi anlamıyorum. Birçok Java kütüphanesi yararlı ve güçlü kod parçalarıdır. Clojure'dan zarif ve işlevsel olarak kullanmayı mümkün kılan kendi sarmalayıcı kütüphanelerimizi sağlayabildiğimizde neden bunları baştan yeniden yazalım?
Rayne

10
@Richard, saf bir clojure http sunucusu yapmaktan çekinmeyin.
gtrak

5
Lisp / Clojure terimlerinde, bir işlevin yan etkisi yoktur. (bkz. gigamonkeys.com/book/… ). Ancak Lisp Diyarı'nda ( landoflisp.com/trade_func.png ) belirtildiği gibi, tamamen işlevsel bir program genellikle çok yararlı değildir, çünkü veritabanı kayıtları yazmak, dosya indirmek, posta göndermek gibi şeyleri yapmak için yan etkiler gereklidir. Sunucuyu
RESTE

179

Compojure artık web uygulamaları geliştirmek için eksiksiz bir çerçeve değil. 0.4 sürümünden bu yana, pek çok projeye ayrıldı.

Ring , HTTP isteğini ve yanıt sürecini soyutlayarak temeli sağlar. Ring, gelen isteği ayrıştırır ve isteğin uri, sunucu adı ve request-method gibi tüm bölümlerini içeren bir harita oluşturur. Uygulama daha sonra isteği işleyecek ve isteğe bağlı olarak bir yanıt oluşturacaktır. Yanıt, şu anahtarları içeren bir harita olarak temsil edilir: durum, başlıklar ve gövde. Yani basit bir uygulama şöyle görünecektir:

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

Ring'in bir diğer parçası ise orta eşya kavramıdır. Bu, işleyici ile gelen istek ve / veya giden yanıt arasında bulunan koddur. Bazı orta eşya yerleşik oturumları ve yığın izini içerir. Oturum orta donanımı, istek haritasına, isteği yapan kullanıcının tüm oturum bilgilerini içeren bir: oturum anahtarı ekler. Yanıt haritasında: oturum anahtarı varsa, geçerli kullanıcı tarafından yapılan bir sonraki istek için saklanır. Yığın izleme orta eşyası, istek işlenirken oluşan tüm özel durumları yakalayacak ve herhangi bir özel durum oluşursa yanıt olarak geri gönderilen bir yığın izleme oluşturacaktır.

Doğrudan Ring ile çalışmak sıkıcı olabilir, bu nedenle Compojure , Ring'in üzerine detayları soyutlayarak inşa edilmiştir. Uygulama şimdi yönlendirme olarak ifade edilebilir, böylece böyle bir şeye sahip olabilirsiniz:

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

Compojure hala istek / yanıt haritalarıyla çalışıyor, böylece gerektiğinde bunlara her zaman erişebilirsiniz:

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

Bu durumda, {uri: uri} bölümü istek haritasındaki: uri anahtarına erişir ve uri değerini bu değere ayarlar.

Son bileşen, html oluşturmayı kolaylaştıran Hıçkırıktır . Çeşitli html etiketleri, etiket adını temsil eden ilk öğe ve geri kalan kısmı etiketin gövdesi olmak üzere vektörler olarak temsil edilir. "<h2>A header</h2>"olur [:h2 "A Header"]. Bir etiketin özellikleri isteğe bağlı bir haritadadır. "<a href='/login'>Log In Page</a>"olur [:a {:href "/login"} "Log In Page"]. Html oluşturmak için bir şablon kullanan küçük bir örnek.

(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)))

Kompozit yazarı tarafından şu anda yararlı bulabileceğiniz bazı belgelerin kaba bir taslağının bağlantısı: Compojure Doc


48

Ayrıca yeni bir Clojure web çerçevesi olan "Noir" ( http://www.webnoir.org/ ) var (bu kadar yeni olan dokümanlar henüz yok). Django / Rails'ten gelince, basit, basit sözdizimini kazıyorum ve oldukça yalın.


Webnoir aslında gerçekten kullanışlı! Başlamak çok kolay - biraz php geliştiriyormuş gibi biraz geliştirebilirsiniz - sadece bir sunucu başlatın (bu sefer leiningen ile), dosyalarınızı düzenleyin ve ne olduğunu görmek için tarayıcınızı yeniden yükleyin.
claj

@Elithrar cevap verdiğinden beri, Noir şu anda mevcut belgelere sahip: webnoir.org/docs
Alistair Collins

18
Sadece kayıt için, Noir onaylanmamış ve artık
korunmuyor


20

Şu anki go-to web kütüphanem artık yada .

Yeni başlıyorsanız, tanıtım sunucusu Compojure. Bunu apacheClojure dünyasındaki web sunucuları olarak görüyorum (bu durumda yada / aleph nginx olurdu). LuminusŞablon olarak kullanabilirsiniz . Bunun gibi varyantları var compojure-api.

Ou denedim Pedestalve küresel olarak memnun kaldım. Usta olduğunu iddia etmiyorum, ama hoş bir sözdizimi var, çok uyumlu hissediyor ve harika bir performansa sahip gibi görünüyor. Ayrıca Cognitect(Rich Hickey'in çalıştığı Clojure / Datomic şirketi) tarafından desteklenmektedir .

Alephİlginç bir soyutlama buldum ve dahili geri basınç ilginç görünüyor. Henüz onunla oynamadım, ama kesinlikle listemde.

Çeşitli web sunucularıyla biraz oynadıktan sonra, hızlı Pro / Eksileri listem:

Kısa cevap: Hızlı bir şekilde başlamak için Luminus'a bir göz atın , belki ihtiyaçlarınız geliştikçe başka bir şeye geçin (Yada belki).

Compojure

  • Artıları (1):

    • kolay, çok sayıda şablon / örnek (örn. Aydınlık)
  • Eksileri (2):

    • Performans değil (istek başına bir iplik), performansların raylardan biraz daha iyi olmasını bekleyin
    • Basit değil, ara katman yazılımı modeli rahatsız edici

kaide

  • Artıları (3):

    • önleme modeli, rota alt kümesine önleme eklemek için hoş sözdizimi
    • performant yönlendirici
    • json / transit / multipart formlarını hiçbir şey sormadan şeffaf bir şekilde kutudan çıkarır. Çok havalı !
  • Eksileri (4):

    • hiçbir websocket desteği (henüz), core.async kanalları döndürmek güzel olurdu
    • Stuart Sierra'nın bileşenine koyarsanız yeniden yüklemek biraz yavaş (bence yeniden yükleme önleyicisini kullanmanız gerekiyor)
    • zaman uyumsuz kesiciler için test olanağı yok
    • buy-in gerektirir (?)

Aleph

Profesyonel (3):

  • performant
  • geri basınç
  • Manifold akışı döndürülürken websocket / SSE desteği

Eksileri (1):

  • Düşük seviye, kendiniz stil yapın (yani, sadece işleyicilerinize bir şey yapmaları için bir yol sağlar. Yönlendirici yok, hiçbir şey yok). Gerçekten eksilerini değil, sadece farkında olun.

yada

Profesyonel (3):

  • Aleph üzerine inşa edilmiş
  • içerik tartışması
  • havalı entegrasyon
  • bidi oldukça iyi (Ben kaide yönlendirici sözdizimini daha iyi seviyorum)

Eksileri (1):

  • belgeler (nginx-clojure kadar kötü olmasa da, hızla gelişiyor).

HttpKit

Profesyonel (2):

  • Clojure'da yazıldı! (ve Java ...)
  • performans iyi görünüyor (bkz. 600K eşzamanlı bağlantı direği)

Eksileri (2):

  • CORS desteği yok
  • Hatalar? Ayrıca, çok fazla yeni taahhüt yok

Nginx-Clojure

Not: Esas olarak dokümantasyon eksikliği nedeniyle oynamadım. Yine de ilginç görünüyor ve çok performanslı.

Artıları (2):

  • Nginx (performans, boşaltma ssl, çalışanları yeniden başlat ...)
  • Bu model sıfır kesinti güncellemelerine izin verebilir mi? Bu harika olurdu!

Eksileri (1):

  • Belgeler (iyileştirme). Ayrıca, bunu yapmanın tek yolu bir nginx yapılandırma dosyasına katıştırılmış dizelerde programlamak istemiyorum.
  • Muhtemelen ilk konuşlandırmayı biraz zorlaştırıyor (?)

Immutant

Not: Onunla oynamadım.

Artıları:

  • entegre (önbellek, mesajlaşma, zamanlama, wildfly dağıtımı)

Eksileri :

  • http istemcisi yok

Catacumba

Not: Belgeler mükemmel görünse de onunla oynamadım. Muhtemelen bir daha deneyeceğim. İlginç görünen örnek sohbet projeleri var, protokollerin yoğun kullanımı beni acemi bir Clojure dev.

Artıları (6):

  • belgeler! Tüm funcool projeleri gibi, doktor okumak da çok hoş.
  • kaide benzeri yönlendirme sözdizimi
  • performans göstermelidir (Ratpack'in üstünde)
  • geri basınç
  • websockets, sse, cors, güvenlik, ssl ...
  • kazmak için benzersiz özellikler: posta

Eksileri (2):

  • Ct / route sözdiziminin ne kadar hoş olduğundan ve Ring spesifikasyonunu atmaktan tamamen emin değilim (sözde async hikayesi için, ancak kaide adamlarının bunu düzelttiğini düşündüm)
  • Swagger'ı nasıl entegre edeceğinden emin değilim.
  • denediğimde hemen çalışmasını sağlayamadım

Not : Ham performans önemli olan tek şey, Clojure web sunucularının bir karşılaştırmasıdır .


Harika bir karşılaştırma. nginx metaforu nasıl olsa emin değilim :)
matanster

1
@matanster Apache'yi birçok kuruluş için varsayılan go-sunucu olarak görüyorum. Basit, birçok kişi için çalışır. Ancak nginx'ten daha eskidir ve farklı bir dahili model kullanır. Yada eşzamansızken bileşik eşzamanlıdır (değişebilir). Bahsetmediğim Yada'nın bir başka yararı da her şeyin veri olduğudur, bu nedenle Compojure'daki makrolara kıyasla oluşturmak / dönüştürmek / incelemek / oluşturmak çok daha kolaydır.
nha

14

Bu günlerde Kaideye bakmaya değer bir çerçeve var. Ring'in üzerine kurulan bir sunucu tarafı çerçevesidir , ancak belirli bir isteği duraklatarak ve devam ettirerek gelen isteği ilk iş parçacığından serbest bırakır (aksi takdirde yavaş bir istek aslında bu sunucu dişini engeller). Belki bir JavaBean gibi.

Diğer harika çerçeveler hoplon.io ve David Nolen's Om (React tabanlı)


11

Webjure , Clojure için bir web programlama çerçevesi.

Özellikler: Servlet çağrıları Clojure işlevlerini gönderir. Dinamik HTML oluşturma. SQL sorgu arayüzü (JDBC üzerinden).

Bu yanıt Webjure bilgileri için bir yer tutucu anlamına gelir.


3
Bunun da iyi bir örnek olduğundan emin değilim. Kod temeli sığ (iyi) gibi görünse de java'da işareti kaçırmış gibi görünüyor. Saf bir clojure çerçevesi beklerdim.
Richard

8

Küçük bir blog uygulaması oluşturmak için kullandığım şey Compojure. Ruby için minimal, hafif bir web çerçevesi olan Sinatra'da modellenmiştir. Çoğunlukla Sinatra'nınki gibi olan rotayı kullandım. Şöyle görünüyor:

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

ORM veya şablon kitaplığı yoktur, ancak vektörleri HTML'ye dönüştüren işlevlere sahiptir.



3

Feragatname: Ben yazarım.

Luminusweb ve kestane şablonlarını birleştiren bir leiningen şablonunu bir araya getirdim. Böylece, ön ve arka uç için clojure kodu ve clojurescript kodu oluşturabileceğiniz bir şey elde edersiniz.
Buna ek olarak, kullanıcı yönetimi ve bazı basit CRUD oluşturma ve sahip olması gereken daha küçük hoş şeyler de sunar: https://github.com/sveri/closp


3

Ben benim iki kuruş atmak Duct dan da, @weavejester , Compojure ve Yüzük sürdürme.

Özünde, Bileşeni ve Halka yönlendiriciyi tek bir çatı altına getirir . Duct kullanmamın nedenleri:

  • Mükemmel felsefi temel: uygulamanızı bir dizi küçük bileşen olarak oluşturmanıza teşvik eder ve aklı başında varsayılanlar sağlarken birkaç görüş tutma arasında hoş bir denge kurar.
  • Kararlı yol: Kendim için konuşuyorum, ancak yıllar içinde Clojure topluluğunun birbiri ardına güvenilir olmayan bir web çerçevesi sunduğunu hissettim. Bir çift "işleri halletmek" için çok deneysel hissettim (Om ve müşteri tarafı Pedestal ile yaşadığım) (yolda üstün olmadığını kanıtlamak için değil). Öte yandan, @weavejester, Topluluğa mükemmel bir şekilde doğmuş olan Compojure ve Ring'e yaptığı aynı istikrarı ve ilerlemeyi ölçtüğünü hissediyorum.
  • Bu var süper hafif ve benim bileşenlerinin yoldan.

Başlıca özellikleri:

  • Rotaları "uç noktalara", mini web sunucuları olarak düşünebileceğiniz küçük bileşenlere (veya HTTP rotalarınızın küçük kesitlerine) göre düzenler.
  • Yeniden Yüklenen İş Akışı için hazır destek .
  • Ring ve Compojure ile mükemmel entegrasyon.
  • Geliştirme ve üretim yapılandırmaları (başka bir yerde dikkat çekici bir şekilde eksik bulduğum bir şey).
  • Örneklerle iyi dokümantasyon.

Not: Söylemeye gerek yok, ancak web geliştirme yararına yeni başlayanlar, çoğu Clojurey gibi Kanal, Clojure'un dilini sağlam bir şekilde kavramasını gerektirir. Öncelikle Bileşen hakkında da bilgi edinmenizi öneririm.

Bir başka kişisel notta, Duct'ı bir yıldan fazla bir süredir çeşitli üretim uygulamalarında kullanıyorum ve bundan çok memnunum.



2

Bir başka ilginç web sunucusu Http-kit . İyi bir performansa sahiptir ve halka uyumludur ve WebSockets'i de destekler. Çoğunlukla clojure'da yapılır ve İskele / Tomcat'teki bazı garip şeylerden yoksundur.

Tamir etmek kolaydır.



1

Arachne yeni gelen bir web çerçevesi. Sitenin açıklamasından alıntı:

Arachne, Clojure için eksiksiz, oldukça modüler bir web geliştirme çerçevesidir. Kolaylığı, sadeliği ve sağlam, ölçeklenebilir bir tasarımı vurgular.

Rails'e benzer bir "başlangıç" deneyimi sunduğunu iddia eden bir başlangıç kampanyası var . Bir Cognitect tarafından geliştirilmiştir.

İşte Luminus (yogthos) yazarı ile bu konuda iyi bir tartışma.


1

Liberator'ı bir süredir üretimde başarıyla kullanıyorum . Sadece çıplak kemikleri istiyorsanız harika bir çerçeve, örneğin RESTful bir web hizmeti veya benzeri bir şey inşa ediyorsanız. Temelde halka ve kompost için bir sargıdır ve gelen istekleri doğrularken bir karar grafiği sağlar. Ayrıca diğer daha hacimli web çerçevelerine kıyasla son derece hızlı. Bir yere hızlı ve yavaş bir şekilde başlamak istiyorsanız, Liberator mükemmel bir seçimdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.