Làm thế nào để bạn tạo một ứng dụng web trong Clojure? [đóng cửa]


216

Tôi cho rằng đây là một câu hỏi lạ đối với phần lớn các lập trình viên làm việc hàng ngày với Java. Tôi không. Tôi biết ngôn ngữ Java, vì tôi đã làm việc trên các dự án Java, nhưng không phải Java-the-world. Tôi chưa bao giờ tạo một ứng dụng web từ đầu trong Java. Nếu tôi phải làm điều đó với Python, Ruby, tôi biết phải đi đâu (Django hoặc Rails), nhưng nếu tôi muốn tạo một ứng dụng web trong Clojure, không phải vì tôi bị buộc phải sống trong một thế giới Java, mà vì tôi Giống như ngôn ngữ và tôi muốn dùng thử, tôi nên sử dụng thư viện và khung nào?


1
Tôi đã tự hỏi liệu bạn muốn sử dụng API gốc của Java hay API gốc của Clojure?
Ande Turner

Ande: Tôi thực sự không chắc chắn, vì tôi biết rất ít về thế giới Java về mặt này (nhưng tôi đã sử dụng Java, ngôn ngữ, trong một thời gian tại nơi làm việc rồi).
Pupeno

Tôi nghĩ sẽ thật tuyệt nếu câu hỏi này kết thúc với một danh sách các khung web Clojure, mỗi câu trả lời và bất kỳ ai cũng có thể bình chọn yêu thích của họ. Tôi nghĩ rằng Meredydd chắc chắn là câu trả lời của Compojure. Tôi sẽ thêm một cái cho Webjure và thật tuyệt khi có một so sánh.
Pupeno

Nhộng! Tôi đến đây để tìm kiếm "ứng dụng web với clojure". Trang này là kết quả đầu tiên trong Google.
Sebastián Grignoli

2
Cũng xem các câu hỏi liên quan stackoverflow.com/questions/3325033/ Ấn
Petr Gladkikh

Câu trả lời:


104

Cho đến nay, khung web Clojure tốt nhất mà tôi đã gặp là Compojure: http://github.com/weavejester/compojure/tree/master

Nó nhỏ nhưng mạnh mẽ và có cú pháp đẹp thanh lịch. (Nó sử dụng Jetty dưới mui xe, nhưng nó ẩn API Servlet khỏi bạn trừ khi bạn muốn, điều này sẽ không thường xuyên). Hãy nhìn vào README tại URL đó, sau đó tải xuống một ảnh chụp nhanh và bắt đầu chơi.


16
Nhận xét của Richard có nghĩa cho câu trả lời này? Tôi không hiểu nó
John Cromartie

26
@Richard Lập luận của bạn khá ngớ ngẩn. Có, nếu bạn quyết định sử dụng các thư viện java, bạn sẽ từ bỏ chức năng trong nhiều trường hợp. Nhưng quan điểm của các thư viện này là để bạn không bao giờ phải làm lại . Ví dụ: Ring là một trình bao bọc Clojury xung quanh các servlet, do đó bạn không phải sử dụng các servlet trực tiếp. Bạn có đề xuất chúng tôi phát minh lại bánh xe phát triển web từ đầu thay vì làm cho các công cụ Java hoàn toàn tốt được sử dụng từ Clojure không? Lý luận đó ở đâu. Hơn nữa, làm thế nào có tùy chọn sử dụng các thư viện này là một điều xấu? ...
Rayne

15
@Richard Toàn bộ lập luận của bạn ngụ ý rằng mã phi Clojure không có chức năng vốn đã tệ đến mức ngay cả sự hiện diện của nó ẩn bên dưới thư viện cũng là một sự ô nhiễm. Tôi không hiểu lý do này. Rất nhiều thư viện Java là những đoạn mã hữu ích và mạnh mẽ. Tại sao phải viết lại những thứ đó từ đầu khi chúng ta có thể đơn giản cung cấp các thư viện trình bao bọc riêng để có thể sử dụng chúng một cách thanh lịch và chức năng từ Clojure?
Rayne

10
@Richard, vui lòng tạo một máy chủ http-clojure thuần túy.
gtrak

5
Theo thuật ngữ Lisp / Clojure, một chức năng không có tác dụng phụ. (xem gigamonkeys.com/book/ trên ). Tuy nhiên, như được chỉ ra trong Vùng đất Lisp ( Landoflisp.com/trade_func.png ), một chương trình chức năng thuần túy thường không hữu ích vì các tác dụng phụ là cần thiết để thực hiện mọi việc, như ghi hồ sơ cơ sở dữ liệu, tải xuống tệp, đăng lên Máy chủ REST, tạo hình ảnh, v.v ...
lfalin

179

Compojure không còn là một khung hoàn chỉnh để phát triển các ứng dụng web. Kể từ khi phát hành 0.4, compojure đã được chia thành nhiều dự án.

Ring cung cấp nền tảng bằng cách trừu tượng hóa quá trình yêu cầu và phản hồi HTTP. Ring sẽ phân tích yêu cầu đến và tạo một bản đồ chứa tất cả các phần của yêu cầu như uri, tên máy chủ và phương thức yêu cầu. Sau đó, ứng dụng sẽ xử lý yêu cầu và dựa trên yêu cầu tạo ra phản hồi. Một phản hồi được thể hiện dưới dạng bản đồ chứa các khóa sau: trạng thái, tiêu đề và nội dung. Vì vậy, một ứng dụng đơn giản sẽ trông như sau:

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

Một phần khác của Ring là khái niệm về kho trung gian. Đây là mã nằm giữa trình xử lý và yêu cầu đến và / hoặc phản hồi đi. Một số được xây dựng trong kho trung gian bao gồm các phiên và stacktrace. Phần giữa phiên sẽ thêm khóa: phiên vào sơ đồ yêu cầu chứa tất cả thông tin phiên cho người dùng thực hiện yêu cầu. Nếu khóa: phiên có mặt trong bản đồ phản hồi, nó sẽ được lưu trữ cho yêu cầu tiếp theo được thực hiện bởi người dùng hiện tại. Mặc dù kho trung gian theo dõi ngăn xếp sẽ nắm bắt bất kỳ trường hợp ngoại lệ nào xảy ra trong khi xử lý yêu cầu và tạo ra dấu vết ngăn xếp được gửi lại dưới dạng phản hồi nếu có bất kỳ ngoại lệ nào xảy ra.

Làm việc trực tiếp với Ring có thể rất tẻ nhạt, vì vậy Compojure được xây dựng trên đỉnh của Ring trừu tượng hóa các chi tiết. Bây giờ ứng dụng có thể được thể hiện dưới dạng định tuyến để bạn có thể có một cái gì đó như thế này:

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

Compojure vẫn hoạt động với các bản đồ yêu cầu / phản hồi để bạn luôn có thể truy cập chúng nếu cần:

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

Trong trường hợp này, phần {uri: uri} truy cập khóa: uri trong bản đồ yêu cầu và đặt uri thành giá trị đó.

Thành phần cuối cùng là Hiccup giúp tạo html dễ dàng hơn. Các thẻ html khác nhau được biểu diễn dưới dạng vectơ với phần tử đầu tiên đại diện cho tên thẻ và phần còn lại là phần thân của thẻ. "<h2>A header</h2>"trở thành [:h2 "A Header"]. Các thuộc tính của thẻ nằm trong một bản đồ tùy chọn. "<a href='/login'>Log In Page</a>"trở thành [:a {:href "/login"} "Log In Page"]. Đây là một ví dụ nhỏ sử dụng mẫu để tạo 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)))

Đây là một liên kết đến một bản thảo sơ bộ của một số tài liệu hiện đang được viết bởi tác giả của compojure mà bạn có thể thấy hữu ích: Compojure Doc


48

Ngoài ra còn có "Noir" ( http://www.webnoir.org/ ), đây là một khung web Clojure mới (vì vậy các tài liệu mới chưa có ở đó). Đến từ Django / Rails, tôi khai thác cú pháp đơn giản, đơn giản và nó khá đơn giản.


Webnoir thực sự rất hữu ích! Bắt đầu với nó rất dễ dàng - bạn có thể phát triển nó một chút thực sự giống như phát triển php - chỉ cần khởi động một máy chủ (lần này với leiningen), chỉnh sửa các tệp của bạn và tải lại trình duyệt của bạn để xem những gì bạn có.
claj

Vì @elithrar đã trả lời, Noir hiện có sẵn các tài liệu: webnoir.org/docs
Alistair Collins

18
Chỉ để ghi lại, có vẻ như Noir đã không còn được sử dụng nữa và không còn được duy trì ....
SolarBear


20

Thư viện web hiện tại của tôi bây giờ là yada .

Nếu bạn chỉ mới bắt đầu, máy chủ giới thiệu là Compojure. Tôi thấy nó là apachemáy chủ web trong thế giới Clojure (trong trường hợp đó yada / aleph sẽ là nginx). Bạn có thể sử dụng Luminuslàm mẫu. Có những biến thể của nó, như thế compojure-api.

Tôi đã thử ou Pedestalvà hài lòng với nó trên toàn cầu. Tôi không yêu cầu làm chủ nó, nhưng nó có một cú pháp dễ chịu, cảm thấy rất gắn kết và có vẻ như nó có hiệu suất tuyệt vời. Nó cũng được hỗ trợ bởi Cognitect(công ty Clojure / Datomic nơi Rich Hickey làm việc).

Tôi tìm thấy Alephđể trình bày một sự trừu tượng thú vị, và áp lực tích hợp có vẻ thú vị. Tôi chưa chơi với nó, nhưng nó chắc chắn nằm trong danh sách của tôi.

Sau khi chơi một chút với các máy chủ web khác nhau, đây là danh sách Pro / Cons nhanh của tôi:

Câu trả lời ngắn: hãy xem Luminus để bắt đầu nhanh chóng, có thể chuyển sang một thứ khác khi nhu cầu của bạn phát triển (có thể là Yada).

Đồng hành

  • Ưu điểm (1):

    • dễ dàng, rất nhiều mẫu / ví dụ (ví dụ: Sáng)
  • Nhược điểm (2):

    • Không biểu diễn (một chủ đề cho mỗi yêu cầu), mong đợi hiệu suất tốt hơn một chút so với đường ray
    • Không đơn giản, mô hình phần mềm trung gian có những bất tiện

Bệ đỡ

  • Ưu điểm (3):

    • mô hình đánh chặn, cú pháp dễ chịu để thêm đánh chặn vào một tập hợp con các tuyến
    • bộ định tuyến
    • hỗ trợ các hình thức json / quá cảnh / nhiều phần trong suốt mà không cần hỏi bất cứ điều gì. Rất tuyệt !
  • Nhược điểm (4):

    • không hỗ trợ websocket (chưa), trả lại các kênh core.async sẽ tốt
    • hơi chậm để tải lại nếu đặt nó vào thành phần của Stuart Sierra (Tôi nghĩ rằng bạn phải sử dụng thiết bị chặn tải lại)
    • không có cơ sở thử nghiệm cho các thiết bị chặn không đồng bộ
    • yêu cầu mua vào (?)

Aleph

Chuyên nghiệp (3):

  • Biểu diễn
  • áp lực
  • Hỗ trợ Websocket / SSE khi trả về luồng đa tạp

Nhược điểm (1):

  • Cấp độ thấp, hãy tự làm theo phong cách (nghĩa là nó chỉ cung cấp cho bạn một cách để làm cho trình xử lý của bạn làm một cái gì đó. Không có bộ định tuyến, không có gì). Không thực sự là một khuyết điểm, chỉ cần nhận thức được nó.

Yada

Chuyên nghiệp (3):

  • được xây dựng trên Aleph
  • nội dung tiêu cực
  • tích hợp vênh vang
  • pricei khá ok (mặc dù tôi thích cú pháp bộ định tuyến bệ hơn)

Nhược điểm (1):

  • tài liệu (mặc dù không tệ như nginx-clojure, nhanh chóng cải thiện).

HttpTit

Chuyên nghiệp (2):

  • Viết bằng Clojure! (và Java ...)
  • hiệu suất có vẻ tốt (xem bài đăng kết nối đồng thời 600K)

Nhược điểm (2):

  • Không hỗ trợ CORS
  • Lỗi? Ngoài ra, không có nhiều cam kết gần đây

Nginx-Clojure

Lưu ý: Tôi chưa chơi với nó, chủ yếu là vì thiếu tài liệu. Nó trông thú vị mặc dù, và rất hiệu quả.

Ưu điểm (2):

  • Nginx (người thực hiện, giảm tải ssl, khởi động lại công nhân ...)
  • Mô hình này có thể cho phép cập nhật thời gian chết không? Thế thì tuyệt quá !

Nhược điểm (1):

  • Tài liệu (cải tiến). Ngoài ra, tôi không muốn lập trình trong các chuỗi được nhúng trong tệp cấu hình nginx nếu đó là cách duy nhất để làm điều đó.
  • Có lẽ phức tạp một chút khi triển khai đầu tiên (?)

Bất biến

Lưu ý: Tôi chưa chơi với nó.

Ưu điểm:

  • tích hợp (lưu trữ, nhắn tin, lập lịch, triển khai wildfly)

Nhược điểm:

  • không có khách hàng http

Catacumba

Lưu ý: Tôi chưa chơi với nó, mặc dù tài liệu có vẻ xuất sắc. Tôi có lẽ sẽ thử nó tiếp theo. Có những dự án trò chuyện có vẻ thú vị, việc sử dụng giao thức nặng nề của họ lúc đầu làm tôi thất vọng như một người mới làm quen với Clojure.

Ưu điểm (6):

  • tài liệu ! Giống như tất cả các dự án funcool, tài liệu rất dễ đọc.
  • cú pháp định tuyến giống như bệ
  • nên được thực hiện (trên đầu trang của Ratpack)
  • áp lực
  • websockets, sse, cors, bảo mật, ssl ...
  • tính năng độc đáo để đào: bưu chính

Nhược điểm (2):

  • Không hoàn toàn chắc chắn về cú pháp ct / tuyến dễ chịu như thế nào và về việc bỏ thông số Ring (được cho là cho câu chuyện không đồng bộ, nhưng tôi nghĩ rằng các bệ đỡ đã sửa nó)
  • Không chắc chắn làm thế nào một người sẽ tích hợp vênh vang, vv
  • Khi tôi thử nó, tôi không thể làm cho nó hoạt động ngay lập tức

Lưu ý : điểm chuẩn của máy chủ web Clojure là khả dụng, nếu hiệu suất thô là tất cả vấn đề.


So sánh tuyệt vời. không chắc chắn về cách ẩn dụ nginx hoạt động như thế nào :)
matanster

1
@matanster Tôi thấy apache là máy chủ chuyển đến mặc định cho rất nhiều tổ chức. Đơn giản, làm việc cho nhiều người. Nhưng nó cũng cũ hơn nginx và sử dụng một mô hình nội bộ khác. Compojure là đồng bộ (có thể thay đổi) trong khi Yada không đồng bộ. Một lợi ích khác của Yada tôi không đề cập đến là mọi thứ đều là dữ liệu, do đó việc soạn thảo / chuyển đổi / kiểm tra / tạo ra dễ dàng hơn nhiều so với các macro như trong Compojure.
nha

14

Những ngày này Pedestal là một khuôn khổ đáng xem. Đó là khung công tác phía máy chủ xây dựng trên đỉnh Ring , nhưng cũng giải phóng yêu cầu đến từ luồng ban đầu bằng cách có thể tạm dừng và tiếp tục yêu cầu cụ thể đó (nếu không, yêu cầu chậm thực sự chặn máy chủ đó). Có lẽ giống như một JavaBean.

Các khung tuyệt vời khác là hoplon.io và David Nolen's Om (dựa trên React)


11

Webjure , một khung lập trình web cho Clojure.

Các tính năng: Công văn gọi các chức năng Clojure. Tạo HTML động. Giao diện truy vấn SQL (thông qua JDBC).

Câu trả lời này có nghĩa là một trình giữ chỗ cho thông tin Webjure.


3
Tôi cũng không chắc đây là một ví dụ hay. Trong khi codebase có vẻ nông cạn (tốt) có đủ viết bằng java đến nỗi nó dường như bị mất dấu. Tôi đã mong đợi một khung clojure thuần túy.
Richard

8

Compojure là những gì tôi đã sử dụng để xây dựng một ứng dụng viết blog nhỏ. Nó được mô hình hóa trên Sinatra, một khung web tối thiểu, nhẹ cho Ruby. Tôi chủ yếu chỉ sử dụng định tuyến, giống như của Sinatra. Nó có vẻ như:

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

Không có thư viện ORM hoặc templating, nhưng nó có các hàm biến vectơ thành HTML.



3

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả.

Tôi kết hợp một mẫu leiningen kết hợp các mẫu luminusweb và hạt dẻ. Vì vậy, bạn nhận được một cái gì đó mà bạn có thể xây dựng mã clojure với và mã clojurescript cho phía trước và phụ trợ.
Ngoài ra, nó cung cấp khả năng quản lý người dùng cộng với một số thế hệ CRUD đơn giản và một số tiện ích nhỏ khác để sử dụng: https://github.com/sveri/closp


3

Tôi sẽ gửi hai xu của mình cho Duct , cũng từ @weavejester , người duy trì Compojure và Ring.

Tại cốt lõi của nó, nó mang thành phần và bộ định tuyến Ring dưới một mái nhà. Lý do tại sao tôi sử dụng ống dẫn:

  • Nền tảng triết học tuyệt vời: nó khuyến khích bạn xây dựng ứng dụng của mình dưới dạng một loạt các thành phần nhỏ và nó tạo ra sự cân bằng tốt giữa việc giữ một vài ý kiến ​​trong khi cung cấp các mặc định lành mạnh.
  • Con đường ổn định: Tôi tự nói với chính mình, nhưng trong nhiều năm qua, tôi đã cảm thấy rằng cộng đồng Clojure đã trình bày một khung web không đáng tin cậy sau một cái khác. Một cặp đôi đơn giản cảm thấy quá thử nghiệm (trải nghiệm của tôi với Om và Pedestal phía khách hàng) để "hoàn thành công việc" (không phải là họ sẽ không chứng minh được sự vượt trội trong quá trình thực hiện). Mặt khác, tôi cảm thấy như @weavejester đã mang lại sự ổn định tương tự và đo lường sự tiến bộ cho Duct mà anh ấy đã làm cho Compojure và Ring, được sinh ra một cách tuyệt vời trong cộng đồng.
  • siêu nhẹ và tránh xa các thành phần của tôi.

Các tính năng chính:

  • Sắp xếp các tuyến theo "điểm cuối", các thành phần nhỏ mà bạn có thể nghĩ là máy chủ web mini (hoặc, các mặt cắt ngang nhỏ của các tuyến HTTP).
  • Hỗ trợ vượt trội cho Quy trình tải lại .
  • Tích hợp hoàn hảo với Ring và Compojure.
  • Cấu hình phát triển và sản xuất (thứ mà tôi thấy thiếu ở nơi khác).
  • Tài liệu tốt với các ví dụ.

Lưu ý: Không cần phải nói, nhưng vì lợi ích của những người mới phát triển web, giống như hầu hết những thứ Clojurey, ống dẫn đòi hỏi phải nắm vững ngôn ngữ Clojure. Tôi cũng khuyên bạn nên đọc về Thành phần đầu tiên.

Một lưu ý cá nhân khác, tôi đã sử dụng Duct trong một số ứng dụng sản xuất trong hơn một năm nay và vô cùng hài lòng với nó.



2

Một máy chủ web thú vị khác là http-kit . Nó có hiệu suất tốt và tuân thủ vòng, và cũng hỗ trợ cho WebSockets. Nó được làm chủ yếu trong clojure, và thiếu một số điều kỳ lạ trong Jetty / Tomcat.

Thật dễ dàng để tinker.


2

Chuyển hướng và om.next có lẽ là những gì bạn đang tìm kiếm.


1

Arachne là một khung web người mới. Trích dẫn mô tả của trang web:

Arachne là một khung phát triển web đầy đủ, có tính mô-đun cao cho Clojure. Nó nhấn mạnh sự dễ dàng, đơn giản và một thiết kế chắc chắn, có thể mở rộng.

Nó có một chiến dịch kickstarter tuyên bố cung cấp trải nghiệm "bắt đầu" tương tự như Rails. Nó được phát triển bởi một Cognitect.

Đây là một cuộc thảo luận tốt về nó với tác giả của Luminus (Yogthos).


1

Tôi đã sử dụng Liberator thành công trong sản xuất một thời gian rồi. Đó là một khung tuyệt vời nếu bạn chỉ muốn xương sống, ví dụ như nếu bạn đang xây dựng một dịch vụ web RESTful hoặc một cái gì đó tương tự. Về cơ bản, nó là một trình bao bọc cho vòng và tính toán và cung cấp biểu đồ quyết định khi xác thực các yêu cầu đến. Nó cũng cực kỳ nhanh so với các khung web cồng kềnh khác. Nếu bạn muốn bắt đầu một nơi nào đó nhanh chóng và từ từ xây dựng thì Liberator là một lựa chọn tuyệt vời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.