Bagaimana Anda membuat aplikasi web di Clojure? [Tutup]

216

Saya kira ini adalah pertanyaan aneh bagi sebagian besar programmer yang bekerja setiap hari dengan Java. Bukan saya. Saya tahu bahasa Jawa, karena saya bekerja di proyek Java, tetapi bukan Java-the-world. Saya tidak pernah membuat aplikasi web dari awal di Jawa. Jika saya harus melakukannya dengan Python, Ruby, saya tahu ke mana harus pergi (Django atau Rails), tetapi jika saya ingin membuat aplikasi web di Clojure, bukan karena saya dipaksa untuk hidup di dunia Jawa, tetapi karena saya suka bahasa dan saya ingin mencobanya, perpustakaan dan kerangka kerja apa yang harus saya gunakan?

pupeno
sumber
1
Saya ingin tahu apakah Anda ingin menggunakan Java Native API atau Clojure Native?
Ande Turner
Ande: Saya benar-benar tidak yakin, karena saya tahu sedikit tentang dunia Jawa dalam hal ini (tapi saya sudah menggunakan Java, bahasa itu, untuk beberapa waktu sudah bekerja).
pupeno
Saya pikir akan lebih baik jika pertanyaan ini berakhir dengan daftar kerangka kerja web Clojure, masing-masing satu jawaban, dan siapa pun dapat memilih favorit mereka. Saya pikir Meredydd jelas merupakan jawaban Compojure. Saya akan menambahkan satu untuk Webjure dan akan menyenangkan jika memiliki perbandingan.
pupeno
Pupeno! Saya tiba di sini mencari "aplikasi web dengan clojure". Halaman ini adalah hasil pertama di Google.
Sebastián Grignoli
2
Lihat juga pada pertanyaan terkait stackoverflow.com/questions/3325033/...
Petr Gladkikh

Jawaban:

104

Sejauh ini kerangka kerja web Clojure terbaik yang belum saya temui adalah Compojure: http://github.com/weavejester/compojure/tree/master

Ini kecil tapi kuat, dan memiliki sintaks yang indah elegan. (Ini menggunakan Jetty di bawah tenda, tetapi menyembunyikan API Servlet dari Anda kecuali Anda menginginkannya, yang tidak akan sering). Lihat README di URL itu, lalu unduh snapshot dan mulai mainkan.


sumber
16
Apakah komentar Richard dimaksudkan untuk jawaban ini? Saya tidak mengerti.
John Cromartie
26
@ Richard Argumen Anda cukup konyol. Ya, jika Anda memutuskan untuk menggunakan perpustakaan java, Anda menyerah menjadi fungsional dalam banyak kasus. Tetapi inti dari perpustakaan ini adalah agar Anda tidak perlu melakukannya lagi . Misalnya, Ring adalah pembungkus Clojury di sekitar servlet sehingga Anda tidak harus menggunakan servlets secara langsung. Apakah Anda menyarankan kami menemukan kembali roda pengembangan web dari awal daripada membuat alat Java yang sangat bagus dan bagus untuk digunakan dari Clojure? Di mana logika itu. Selain itu, bagaimana memiliki opsi menggunakan perpustakaan ini adalah hal yang buruk? ...
Rayne
15
@Richard Seluruh argumen Anda menyiratkan bahwa kode non-fungsional non-Clojure secara inheren sangat buruk sehingga bahkan keberadaannya tersembunyi di bawah perpustakaan adalah kontaminasi. Saya tidak mengerti alasan ini. Banyak perpustakaan Java adalah potongan kode yang berguna dan kuat. Mengapa menulis ulang mereka dari bawah ke atas ketika kita bisa menyediakan perpustakaan pembungkus kita sendiri yang memungkinkan untuk menggunakannya secara elegan dan fungsional dari Clojure?
Rayne
10
@ Richard, silakan membuat server http murni-clojure.
gtrak
5
Dalam istilah Lisp / Clojure, suatu fungsi tidak memiliki efek samping. (lihat gigamonkeys.com/book/… ). Namun seperti yang ditunjukkan di Tanah Lisp ( landoflisp.com/trade_func.png ), program yang murni fungsional biasanya tidak terlalu berguna karena efek samping diperlukan untuk benar-benar melakukan sesuatu, seperti menulis catatan basis data, mengunduh file, mengirim ke SISA server, hasilkan gambar, dll ...
lfalin
179

Compojure tidak lagi merupakan kerangka kerja yang lengkap untuk mengembangkan aplikasi web. Sejak rilis 0.4, compojure telah dipecah menjadi beberapa proyek.

Ring menyediakan fondasi dengan mengabstraksi permintaan HTTP dan proses respons. Dering akan menguraikan permintaan yang masuk dan menghasilkan peta yang berisi semua bagian permintaan seperti uri, nama server dan metode permintaan. Aplikasi kemudian akan menangani permintaan dan berdasarkan permintaan menghasilkan respons. Respons direpresentasikan sebagai peta yang berisi kunci berikut: status, header, dan tubuh. Jadi aplikasi sederhana akan terlihat seperti:

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

Satu bagian lain dari Ring adalah konsep middle-ware. Ini adalah kode yang berada di antara pawang dan permintaan masuk dan / atau respons keluar. Beberapa perangkat bawaan yang dibangun termasuk sesi dan stacktrace. Perangkat tengah sesi akan menambahkan: kunci sesi ke peta permintaan yang berisi semua info sesi untuk pengguna yang membuat permintaan. Jika kunci: sesi ada di peta respons, itu akan disimpan untuk permintaan berikutnya yang dibuat oleh pengguna saat ini. Sementara stack stack middle-ware akan menangkap setiap pengecualian yang terjadi saat memproses permintaan dan menghasilkan jejak stack yang dikirim kembali sebagai respons jika ada pengecualian yang terjadi.

Bekerja secara langsung dengan Ring bisa membosankan, jadi Compojure dibangun di atas Ring yang mengaburkan detailnya. Aplikasi sekarang dapat diekspresikan dalam hal perutean sehingga Anda dapat memiliki sesuatu seperti ini:

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

Compojure masih bekerja dengan peta permintaan / respons sehingga Anda selalu dapat mengaksesnya jika diperlukan:

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

Dalam hal ini bagian {uri: uri} mengakses kunci: uri di peta permintaan dan menetapkan uri ke nilai itu.

Komponen terakhir adalah Hiccup yang membuat menghasilkan html lebih mudah. Berbagai tag html direpresentasikan sebagai vektor dengan elemen pertama yang mewakili nama tag dan sisanya menjadi badan tag. "<h2>A header</h2>"menjadi [:h2 "A Header"]. Atribut tag ada di peta opsional. "<a href='/login'>Log In Page</a>"menjadi [:a {:href "/login"} "Log In Page"]. Berikut ini adalah contoh kecil menggunakan templat untuk menghasilkan 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)))

Berikut ini tautan ke draf kasar beberapa dokumentasi yang saat ini sedang ditulis oleh penulis compojure yang mungkin berguna bagi Anda: Compojure Doc

Ross Goddard
sumber
48

Ada juga "Noir" ( http://www.webnoir.org/ ), yang merupakan kerangka kerja web Clojure baru (jadi baru dokumennya belum ada di sana). Berasal dari Django / Rails, saya menggali sintaksis yang sederhana dan langsung dan sangat ramping.

elithrar
sumber
Webnoir sebenarnya sangat berguna! Sangat mudah untuk memulai - Anda dapat mengembangkannya sedikit sebenarnya agak seperti mengembangkan php - mulai saja server (kali ini dengan leiningen), edit file Anda dan muat ulang browser Anda untuk melihat apa yang Anda dapatkan.
claj
Karena @elithrar telah menjawab, Noir sekarang memiliki dokumen yang tersedia: webnoir.org/docs
Alistair Collins
18
Sebagai catatan, tampaknya Noir sudah usang dan tidak lagi dipertahankan ....
SolarBear
25

Pertimbangkan kerangka kerja Luminus . Saya tidak memiliki afiliasi tetapi telah mendengar hal-hal baik dari teman yang saya hormati.

Michael Easter
sumber
20

Pustaka web saya yang sekarang adalah yada .

Jika Anda baru memulai, server pengantar adalah Compojure. Saya melihatnya sebagai apacheserver web di dunia Clojure (dalam hal ini yada / aleph akan menjadi nginx). Anda bisa menggunakannya Luminussebagai templat. Ada variasinya, seperti compojure-api.

Saya mencoba ou Pedestaldan secara global puas dengannya. Saya tidak mengklaim menguasainya, tetapi memiliki sintaks yang menyenangkan, terasa sangat kohesif, dan sepertinya memang memiliki kinerja yang hebat. Ini juga didukung oleh Cognitect(perusahaan Clojure / Datomic tempat Rich Hickey bekerja).

Saya menemukan Alephmenyajikan abstraksi yang menarik, dan tekanan balik bawaan tampaknya menarik. Saya belum bermain dengan itu, tapi itu pasti ada dalam daftar saya.

Setelah bermain sedikit dengan berbagai server web, berikut adalah daftar Pro / Kontra saya:

Jawaban singkat: lihatlah Luminus untuk memulai dengan cepat, mungkin beralih ke hal lain saat kebutuhan Anda berkembang (Yada mungkin).

Compojure

  • Pro (1):

    • mudah, banyak templat / contoh (mis. Luminous)
  • Kontra (2):

    • Tidak berkinerja (utas per permintaan), mengharapkan pertunjukan sedikit lebih baik daripada rel
    • Tidak sederhana, model middleware memiliki ketidaknyamanan

Alas

  • Pro (3):

    • model interseptor, sintaks yang menyenangkan untuk menambahkan interseptor ke subset rute
    • router berkinerja
    • mendukung json / transit / bentuk multipart secara transparan di luar kotak, tanpa meminta apa pun. Sangat keren !
  • Kekurangan (4):

    • tidak ada dukungan websocket (belum), mengembalikan saluran core.async akan menyenangkan
    • agak lambat untuk memuat ulang jika memasukkannya ke dalam komponen Stuart Sierra (saya pikir Anda seharusnya menggunakan pencegat isi ulang)
    • tidak ada fasilitas pengujian untuk pencegat async
    • membutuhkan buy-in (?)

Aleph

Pro (3):

  • Pelaku
  • Tekanan balik
  • Dukungan Websocket / SSE saat mengembalikan aliran berlipat ganda

Kekurangan (1):

  • Level rendah, lakukan gaya sendiri (mis. Itu hanya memberi Anda cara untuk membuat handler Anda melakukan sesuatu. Tidak ada router, tidak ada apa-apa). Tidak benar-benar kontra, hanya sadar akan hal itu.

Yada

Pro (3):

  • dibangun di atas Aleph
  • pengabaian konten
  • integrasi kesombongan
  • Bidi cukup ok (meskipun saya suka sintaks router alas lebih baik)

Kekurangan (1):

  • dokumentasi (meskipun tidak seburuk nginx-clojure, cepat membaik).

HttpKit

Pro (2):

  • Ditulis dalam Clojure! (dan Jawa ...)
  • kinerja terlihat bagus (lihat posting koneksi bersamaan 600K)

Kontra (2):

  • Tidak ada dukungan CORS
  • Bug ? Juga, tidak banyak komitmen terbaru

Nginx-Clojure

Catatan: Saya belum bermain dengannya, terutama karena kurangnya dokumentasi. Itu terlihat menarik, dan sangat performant.

Pro (2):

  • Nginx (pemain, bongkar ssl, mulai ulang pekerja ...)
  • Bisakah model ini memungkinkan pembaruan tanpa downtime? Itu akan sangat luar biasa!

Kekurangan (1):

  • Dokumentasi (meningkatkan). Juga, saya tidak ingin memprogram dalam string yang tertanam dalam file konfigurasi nginx jika itu adalah satu-satunya cara untuk melakukannya.
  • Mungkin menyulitkan penyebaran pertama (?)

Immutant

Catatan: Saya belum memainkannya.

Pro:

  • terintegrasi (caching, pengiriman pesan, penjadwalan, penyebaran wildfly)

Cons:

  • tidak ada klien http

Catacumba

Catatan: Saya belum memainkannya, meskipun dokumentasinya terlihat bagus. Saya mungkin akan mencobanya nanti. Ada contoh proyek obrolan yang terlihat menarik, penggunaan protokol yang banyak membuat saya awalnya sebagai dev Clojure pemula.

Pro (6):

  • dokumentasi! Seperti semua proyek funcool, dokumen ini sangat menyenangkan untuk dibaca.
  • sintaks perutean seperti alas
  • harus berkinerja (di atas Ratpack)
  • Tekanan balik
  • soket web, sse, kor, keamanan, ssl ...
  • fitur unik untuk digali: pos

Kontra (2):

  • Tidak sepenuhnya yakin tentang betapa menyenangkan sintaks ct / rute, dan tentang membuang spec Ring (seharusnya untuk cerita async, tapi saya pikir orang-orang alas memperbaiki itu)
  • Tidak yakin bagaimana seseorang akan mengintegrasikan kesombongan dll.
  • ketika saya mencobanya, saya tidak dapat membuatnya bekerja segera

Catatan : tolok ukur server web Clojure tersedia, jika hanya kinerja mentah yang penting.

nha
sumber
Perbandingan yang bagus. tidak yakin bagaimana metafora nginx bekerja :)
matanster
1
@ matanster Saya melihat apache sebagai server masuk standar untuk banyak organisasi. Sederhana, bekerja untuk banyak orang. Tetapi lebih tua dari nginx juga, dan menggunakan model internal yang berbeda. Compojure bersifat sinkron (yang dapat berubah) sementara Yada tidak sinkron. Manfaat lain dari Yada yang tidak saya sebutkan adalah bahwa semuanya adalah data, jadi lebih mudah untuk membuat / mengubah / memeriksa / menghasilkan dibandingkan dengan makro seperti di Compojure.
nha
14

Hari-hari ini Alas adalah kerangka yang patut dilihat. Ini adalah kerangka kerja sisi server yang dibuat di atas Dering , tetapi juga membebaskan permintaan yang masuk dari utas awal dengan dapat menjeda dan melanjutkan permintaan tertentu (jika tidak, permintaan yang lambat benar-benar memblokir serverthread itu). Mungkin semacam JavaBean.

Kerangka keren lainnya adalah hoplon.io dan David Nolen Om (berdasarkan Bereaksi)

Claj
sumber
11

Webjure , kerangka pemrograman web untuk Clojure.

Fitur: Pengiriman fungsi servlet panggilan Clojure. Generasi HTML dinamis. Antarmuka kueri SQL (melalui JDBC).

Jawaban ini dimaksudkan sebagai pengganti untuk informasi Webjure.

pupeno
sumber
3
Saya tidak yakin ini adalah contoh yang baik juga. Sementara basis kode tampaknya dangkal (baik) ada cukup ditulis dalam java yang tampaknya tidak sesuai sasaran. Saya akan mengharapkan kerangka clojure murni.
Richard
8

Compojure adalah apa yang saya gunakan untuk membangun aplikasi blogging kecil. Ini dimodelkan pada Sinatra, yang merupakan kerangka web minimal, ringan untuk Ruby. Saya kebanyakan hanya menggunakan routing, yang sama seperti milik Sinatra. Sepertinya:

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

Tidak ada ORM atau templating library, tetapi memang memiliki fungsi yang mengubah vektor menjadi HTML.

Joe W.
sumber
3

Penafian: Saya penulis.

Saya mengumpulkan leiningen template yang menggabungkan luminusweb dan chestnut. Jadi Anda mendapatkan sesuatu yang bisa Anda buat dengan kode clojure dan kode clojurescript untuk depan dan backend.
Selain itu ia menyediakan manajemen pengguna ditambah beberapa generasi CRUD sederhana dan beberapa lagi bagus untuk dimiliki: https://github.com/sveri/closp

sveri
sumber
3

Saya akan memberikan dua sen untuk Duct , juga dari @weavejester , pengelola Compojure dan Ring.

Pada intinya, ia membawa Component dan Ring router di bawah satu atap. Alasan mengapa saya menggunakan Duct:

  • Fondasi filosofis yang sangat baik: ini mendorong Anda untuk membangun aplikasi Anda sebagai serangkaian komponen kecil, dan memberikan keseimbangan yang bagus antara memegang beberapa pendapat sambil memberikan default yang waras.
  • Jalur yang stabil: Saya berbicara untuk diri saya sendiri, tetapi selama bertahun-tahun saya merasa bahwa komunitas Clojure telah menyajikan satu kerangka web yang kurang kredibel satu demi satu. Pasangan hanya merasa terlalu eksperimental (pengalaman saya dengan Om dan Pedestal sisi klien) untuk "menyelesaikan sesuatu" (bukan bahwa mereka tidak akan terbukti unggul di ujung jalan). Di sisi lain, saya merasa @weavejester telah membawa stabilitas yang sama dan mengukur kemajuan untuk Duct yang dia lakukan pada Compojure dan Ring, yang telah terlahir dengan luar biasa di komunitas.
  • Ini super ringan, dan jauh dari komponen saya.

Fitur utama:

  • Atur rute dengan "titik akhir", komponen kecil yang dapat Anda anggap sebagai server web mini (atau, bagian lintas kecil dari rute HTTP Anda).
  • Dukungan out-of-the-box untuk Reloaded Workflow .
  • Integrasi sempurna dengan Ring dan Compojure.
  • Konfigurasi pengembangan dan produksi (sesuatu yang saya temukan hilang di tempat lain).
  • Dokumentasi yang baik dengan contoh-contoh.

Catatan: Tidak perlu dikatakan lagi, tetapi untuk kepentingan pendatang baru pengembangan web, seperti kebanyakan hal Clojurey, Duct membutuhkan pemahaman yang kuat tentang bahasa Clojure. Saya juga merekomendasikan membaca tentang Komponen terlebih dahulu.

Pada catatan pribadi lain, saya telah menggunakan Duct di beberapa aplikasi produksi selama lebih dari satu tahun sekarang dan saya sangat senang dengannya.

KendallB
sumber
2

Server web lain yang menarik adalah Http-kit . Ini memiliki kinerja yang baik dan memenuhi persyaratan dering, serta memiliki dukungan untuk WebSockets juga. Itu sebagian besar dibuat dalam clojure, dan tidak memiliki beberapa hal aneh di Jetty / Tomcat.

Mudah untuk bermain-main.

Claj
sumber
2

Reframe dan om.next mungkin yang Anda cari.

ftravers
sumber
1

Arachne adalah kerangka web pendatang baru. Mengutip deskripsi situs:

Arachne adalah kerangka pengembangan web penuh dan sangat modular untuk Clojure. Ini menekankan kemudahan, kesederhanaan, dan desain yang solid, scalable.

Ini memiliki kampanye kickstarter mengklaim untuk menawarkan pengalaman "memulai" mirip dengan Rails. Ini dikembangkan oleh Cognitect.

Berikut ini adalah diskusi yang bagus tentang hal itu dengan penulis Luminus (yogthos).

Micah Elliott
sumber
1

Saya telah menggunakan Liberator dengan sukses dalam produksi untuk sementara waktu sekarang. Ini adalah kerangka kerja yang bagus jika Anda hanya ingin tulang kosong misalnya jika Anda sedang membangun layanan web yang tenang atau yang serupa. Ini pada dasarnya pembungkus untuk cincin dan compojure dan memberikan grafik keputusan saat memvalidasi permintaan yang masuk. Ini juga sangat cepat dibandingkan dengan kerangka kerja web lainnya yang lebih besar. Jika Anda ingin memulai suatu tempat dengan cepat dan perlahan membangun maka Liberator adalah pilihan yang bagus.

dfbernal
sumber