2010-08-23 27 views
46

Lựa chọn hiện tại của khung công tác web Clojure trưởng thành là gì? Tôi đang tìm kiếm một số loại ma trận tính năng nói với tôi những gì các khuôn khổ phổ biến hỗ trợ và đến mức độ nào, bao gồm:Khuôn khổ web của Clojure dành cho người lớn?

  • đáp ứng khuôn mẫu (văn bản trả lời trong Clojure hoặc trong một số đánh dấu khác - ví dụ như JSP với gạch)
  • phiên HTTP
  • REST với bản đồ tự động URL thành hành động chức năng và params
  • dạng HTML (params sẵn như bản đồ, xử lý lỗi, xác nhận)
  • dòng Application (được gọi từ các khuôn khổ Java - yêu cầu xử lý trở lại định hành động đó là sự kiện được xử lý bởi người kết xuất)
+0

-1 cho yêu cầu phiên HTTP - khuôn khổ Chơi chứng tỏ bạn không cần điều đó –

Trả lời

32

Có lẽ my answer đến Điểm khởi đầu tốt để phát triển dịch vụ web RESTful ở Clojure là gì? câu hỏi về SO có thể giúp bạn. Nó đề cập đến một số thư viện web quan trọng cho Clojure (với các liên kết và tóm tắt ngắn). Điểm mấu chốt mà tôi muốn nhắc lại ở đây được nêu trong đoạn đầu tiên của câu trả lời đó:

Trước hết, tôi nghĩ bạn không thể tìm thấy một giải pháp rút gọn duy nhất để thực hiện tất cả điều này trong Clojure (ngoại trừ dưới dạng một thư viện Java được sử dụng thông qua interop). Điều gì đang trở thành ngăn xếp Web chuẩn của Clojure bao gồm một số thư viện mà mọi người kết hợp và kết hợp theo mọi cách (vì chúng có xu hướng tương thích hoàn toàn). Để làm điều đó tôi sẽ thêm rằng bạn có thể không mong đợi để xử lý những thứ với loại "dòng ứng dụng" bạn có thể biết từ Java (hoặc nếu bạn tin rằng bạn thực sự cần nó, có thể bạn sẽ phải cuộn lib của riêng bạn để hỗ trợ nó!). Mặc dù vậy, mọi người dường như rất hài lòng với phương thức xử lý của Ring, một phương thức thân thiện với phần mềm trung cấp.


Để giải quyết những viên đạn của bạn:

  • đáp ứng khuôn mẫu:
    Có một số giải pháp Clojure cụ thể, bao gồm EnliveHiccup (Enlive là một HTML cào rất mạnh mẽ/khuôn mẫu/biến đổi động cơ; Hiccup là một DSL để viết HTML trong Clojure với thuộc tính đẹp mà nó hiển thị nhanh). Ngoài ra, đây có lẽ là một nơi mà nó làm cho cảm giác hoàn hảo để thả xuống Java và sử dụng một cái gì đó như, nói, StringTemplate. Điều này thậm chí còn có mặt tốt của việc ngăn cản sự pha trộn của các mẫu và logic! (Tôi tin rằng Stuart Halloway đã nói rằng Relevance - công ty của ông -. Đang sử dụng chiến lược này trong công việc của họ và có thành công lớn với nó)

  • HTTP phiên
    Đó sẽ là Sandbar, tôi giả sử. Tác giả đã bắt đầu a series of blogposts về nó có vẻ rất hứa hẹn.

  • REST với bản đồ tự động URL thành hành động chức năng và params
    Đó là Ring & Compojure và/hoặc Moustache. Xem bên dưới.

  • Biểu mẫu HTML (thông số có sẵn dưới dạng bản đồ, xử lý lỗi, xác thực)
    Như trên.

  • Luồng ứng dụng (được biết đến từ khung công tác Java - trình xử lý yêu cầu trả lại mã định danh hành động được xử lý bởi trình kết xuất)
    Như đã đề cập ở trên, không thực sự là điều mọi người có xu hướng làm trong Clojure.


Như một điểm khởi đầu khi nghiên cứu về web chồng Clojure, this Ring tutorial bởi Ring 's tác giả Mark McGranaghan là rất hữu ích. Compojure 's tác giả James Reeves có some documentation trên Compojure. Có lẽ my recent answer đến "Ý tưởng lớn" đằng sau các tuyến đường mô phỏng là gì? Câu hỏi cũng có thể giúp ích. Các nguồn của Ring cũng bao gồm một tài liệu SPEC tuyệt vời.

+1

bạn sẽ phiền mở rộng một chút về vấn đề lựa chọn khuôn mẫu, và tại sao bạn có thể khuyên bạn nên 'thả xuống java'? Đó có phải là vấn đề về sự trưởng thành của chức năng, hiệu suất, hay cái gì khác? –

+0

@Rob Lachlan: Tôi sẽ không nhất thiết * đề nghị * thả xuống Java - Tôi chỉ nghĩ rằng đây là một nhiệm vụ mà làm như vậy có thể không nhất thiết dẫn đến trải nghiệm kém hơn. Nếu bạn cấu trúc ứng dụng của mình để công cụ tạo mẫu của bạn không bao giờ gọi ra logic ứng dụng của bạn ở giai đoạn dựng hình, thì nó sẽ tạo ra sự khác biệt nào nếu nó được viết bằng Java/Scala/gì?Ít nhất là miễn là có một cách sane thiết lập các biến mẫu, tất nhiên (ví dụ: StringTemplate sử dụng '.setAttribute' trên các mẫu, đơn giản, đủ để sử dụng với' doseq' và một bản đồ từ Clojure). –

+0

Đó không phải là để nói rằng không có lý do gì để thích các chương trình khuôn mẫu Clojure thuần túy - tôi không chắc tôi biết bất cứ điều gì giống như Sự mở rộng bên ngoài đất Clojure, ví dụ (nhưng kỳ quan làm việc tốn thời gian, vì vậy nó có thể không Hiccup là một DSL sản xuất HTML tuyệt vời (nhưng có nhiều điểm để dạy một nhà thiết kế viết Hiccup khi họ đã biết một giải pháp JVM khác mà bạn có thể gọi ra?) –

13

Vì câu hỏi này ban đầu được hỏi/trả lời, Noir web framework đã nổi lên như một giải pháp đầy hứa hẹn.

Nó sử dụng nấc cục cho phần khuôn mẫu, nhưng cung cấp một khuôn khổ hoàn chỉnh hơn xung quanh điều đó.

đang Basic mẫu từ Noir trang chính:

(ns my-app 
    (:use noir.core) 
    (:require [noir.server :as server])) 

(defpage "/welcome" [] 
    "Welcome to Noir!") 

(server/start 8080) 
+1

[Noir hiện không được chấp nhận] (http://www.webnoir.org/), nhưng xem [lib-noir] (https://github.com/noir-clojure/lib-noir) –

7

tôi sẽ khuyên bạn nên sử dụng Luminus, không phải vì tên tuyệt vời của nó, mà còn tính năng của nó.

Và vì Noir không còn được duy trì, tôi sẽ không khuyên bạn nên sử dụng điều đó. Nó cũng là một lựa chọn tốt để bắt đầu từ vòng & Compojure ngay từ đầu để xây dựng khuôn khổ của riêng bạn.

0

Bạn có thể đang đặt câu hỏi sai. Những gì tôi thấy trong câu hỏi của bạn là "khung công tác Clojure nào giống như khung công tác hướng đối tượng Java mà tôi quen?". Không có câu trả lời tốt cho điều đó; nếu bạn chỉ cảm thấy thoải mái với cách tiếp cận phía máy chủ của nhà nước (chẳng hạn như Grails hoặc Tapestry) thì có lẽ bạn nên ở lại đó và tìm cách triển khai một số chương trình phụ trợ của bạn trong Clojure.

Mặt khác, nếu bạn muốn xây dựng một cái gì đó đúng hơn với Clojure, bạn có thể muốn tìm hỗn hợp của riêng bạn. Tôi đã có một số thành công tốt khi sử dụng AngularJS và CoffeeScript trên máy khách và Clojure (sử dụng Ring and Bishop) trên máy chủ (mặc dù chúng tôi đang chuyển từ Bishop sang Liberator). Trong mọi trường hợp, một khi bạn nắm lấy cách tiếp cận ứng dụng web "một trang" và bắt đầu xử lý phía máy chủ dưới dạng nguồn và chìm dữ liệu, bạn sẽ thấy Clojure hoạt động rất tốt.

0

thử khuôn khổ đường cho web nhanh dev https://github.com/zhujinxian/road

(defn render-test [ret tmt] 
    (-> (resp/response "------render----test------") 
    (#(resp/content-type %1 "text/plain")))) 

(defn foo 
    "I don't do a whole lot." 
    [x] 
    (str "来自源码目录的参数:" x)) 

(defn handler [^Integer x] 
    {:$r render-test :text (str "hello world, road goes sucess!" (foo x))}) 

(defn home [req content ^Integer num] 
    {:hiccup "home.clj" :content (str "home" content) :num num}) 

(defroad road (GET "/web-test-0.1.0-SNAPSHOT-standalone/main" handler) 
       (GET "/web-test-0.1.0-SNAPSHOT-standalone/home/:num{\\d+}" home)) 

(defn -main [& args] 
    (log/info "---------log4j test-------") 
    (jetty/run-jetty road {:port 3000})) 
Các vấn đề liên quan