[clojure] Clojure에서 웹 애플리케이션을 어떻게 만드나요? [닫은]

나는 이것이 Java로 매일 일하는 대다수의 프로그래머에게 이상한 질문이라고 생각합니다. 난 아니야 Java 프로젝트는 수행했지만 Java 프로젝트는 수행하지 않았기 때문에 Java 언어를 알고 있습니다. Java에서 웹 앱을 처음부터 만들지 않았습니다. 파이썬, 루비와 함께해야한다면, 어디로 가야할지 (Django 또는 Rails) 알고 있지만 Clojure에서 웹 응용 프로그램을 만들고 싶다면 Java 세계에 강요하기 때문에가 아니라 언어와 같은 언어를 사용 해보고 싶은데 어떤 라이브러리와 프레임 워크를 사용해야합니까?



답변

지금까지 내가 만난 최고의 Clojure 웹 프레임 워크는 Compojure입니다 : http://github.com/weavejester/compojure/tree/master

작지만 강력하며 아름답고 우아한 구문이 있습니다. (이것은 후드 아래에서 Jetty를 사용하지만 원하지 않는 한 서블릿 API를 숨 깁니다. 해당 URL의 README를 확인한 다음 스냅 샷을 다운로드하고 재생을 시작하십시오.


답변

Compojure는 더 이상 웹 응용 프로그램 개발을위한 완벽한 프레임 워크가 아닙니다. 0.4 릴리스 이후, compojure는 여러 프로젝트로 분리되었습니다.

은 HTTP 요청 및 응답 프로세스를 추상화하여 기초를 제공합니다. 링은 들어오는 요청을 구문 분석하고 요청의 모든 부분 (예 : uri, server-name 및 request-method)을 포함하는 맵을 생성합니다. 그런 다음 응용 프로그램은 요청을 처리하고 요청에 따라 응답을 생성합니다. 응답은 상태, 헤더 및 본문 키를 포함하는 맵으로 표시됩니다. 따라서 간단한 응용 프로그램은 다음과 같습니다.

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

링의 또 다른 부분은 미들웨어의 개념입니다. 처리기와 수신 요청 및 / 또는 발신 응답 사이에있는 코드입니다. 내장 된 미들웨어에는 세션 및 스택 추적이 포함됩니다. 세션 미들웨어는 요청을하는 사용자에 대한 모든 세션 정보를 포함하는 : session 키를 요청 맵에 추가합니다. : session 키가 응답 맵에 있으면 현재 사용자가 다음에 요청한 내용에 대해 저장됩니다. 스택 추적 미들웨어는 요청을 처리하는 동안 발생하는 예외를 캡처하고 예외가 발생하면 응답으로 다시 전송되는 스택 추적을 생성합니다.

링으로 직접 작업하는 것은 번거로울 수 있으므로 Compojure 는 링 위에 세부 사항을 추상화하여 만들어졌습니다. 이제 응용 프로그램을 라우팅 측면에서 표현할 수 있으므로 다음과 같이 할 수 있습니다.

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

Compojure는 여전히 요청 / 응답 맵을 사용하고 있으므로 필요한 경우 언제든지 액세스 할 수 있습니다.

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

이 경우 {uri : uri} 부분은 요청 맵의 : uri 키에 액세스하여 uri를 해당 값으로 설정합니다.

마지막 구성 요소는 Hiccup 이며 HTML을 더 쉽게 생성 할 수 있습니다. 다양한 html 태그는 벡터로 표시되며 첫 번째 요소는 태그 이름을 나타내고 나머지는 태그의 본문입니다. "<h2>A header</h2>"됩니다 [:h2 "A Header"]. 태그의 속성은 선택적 맵에 있습니다. "<a href='/login'>Log In Page</a>"됩니다 [:a {:href "/login"} "Log In Page"]. 다음은 템플릿을 사용하여 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)))

다음은 compojure의 저자가 현재 작성하고있는 일부 문서의 초안에 대한 링크입니다. Compojure Doc


답변

새로운 Clojure 웹 프레임 워크 인 “Noir”( http://www.webnoir.org/ ) 도 있습니다 (따라서 새로운 문서는 아직 없습니다). Django / Rails에서 온, 나는 간단하고 간단한 구문을 파고 꽤 마른입니다.


답변

Luminus 웹 프레임 워크를 고려하십시오 . 나는 제휴 관계가 없지만 존경하는 친구로부터 좋은 소식을 들었습니다.


답변

현재 사용중인 웹 라이브러리는 이제 yada 입니다.

방금 시작한 경우 소개 서버는 Compojure입니다. apacheClojure 세계의 웹 서버 라고 생각합니다 (이 경우 yada / aleph는 nginx입니다). Luminus템플릿으로 사용할 수 있습니다 . 와 같은 변형이 있습니다 compojure-api.

나는 ou를 시도했고 Pedestal전 세계적으로 그것에 만족했다. 나는 그것을 마스터한다고 주장하지는 않지만 즐거운 구문을 가지고 있으며 매우 응집력이 있으며 훌륭한 성능을 가진 것처럼 보입니다. 또한 CognitectRich Hickey가 근무하는 Clojure / Datomic 회사의 지원을받습니다 .

내가 찾은 Aleph재미있는 추상화를 제공하고, 내장 된 배압 흥미로운 보인다. 나는 아직 그것을 가지고 놀지 않았지만 분명히 내 목록에 있습니다.

다양한 웹 서버로 비트를 재생 한 후 빠른 Pro / Cons 목록이 있습니다.

짧은 대답 : 빨리 시작하기 위해 Luminus 를 살펴보고 , 요구 사항이 진화함에 따라 다른 것으로 넘어갈 수 있습니다 (Yada).

Compojure

  • 찬성 (1) :

    • 쉽고 많은 템플릿 / 예 (예 : Luminous)
  • 단점 (2) :

    • 성능이 좋지 않음 (요청 당 스레드), 레일보다 약간 더 나은 성능을 기대
    • 간단하지는 않지만 미들웨어 모델에는 불편 함이 있습니다.

받침대

  • 찬성 (3) :

    • 인터셉터 모델, 경로의 서브 세트에 인터셉터를 추가하는 유쾌한 구문
    • 퍼포먼스 라우터
    • 아무 것도 묻지 않고 상자에서 투명하게 json / transit / multipart 형식을 지원합니다. 아주 멋지다!
  • 단점 (4) :

    • websocket을 지원하지 않지만 (아직) core.async 채널을 반환하면 좋을 것입니다.
    • Stuart Sierra의 구성 요소에 넣으면 조금 느리게 다시로드됩니다 (리로드 인터셉터를 사용해야한다고 생각합니다)
    • 비동기 인터셉터에 대한 테스트 기능이 없음
    • 바이 인 필요 (?)

알레프

프로 (3) :

  • 수행자
  • 배압
  • 매니 폴드 스트림을 리턴 할 때 웹 소켓 / SSE 지원

단점 (1) :

  • 저수준, 스스로 스타일을 만드십시오 (즉, 처리기가 무언가를 할 수있는 방법을 제공합니다. 라우터가없고 아무것도 없습니다). 실제로 단점은 아닙니다.

야다

프로 (3) :

  • 알레프에 내장
  • 콘텐츠 협상
  • 스와 거 통합
  • bidi는 꽤 괜찮습니다 (페데스탈 라우터 구문이 더 좋지만)

단점 (1) :

  • 문서화 (nginx-clojure만큼 나쁘지는 않지만 빠르게 향상 됨).

HttpKit

프로 (2) :

  • Clojure로 작성되었습니다! (그리고 자바 …)
  • 성능이 좋아 보입니다 (600K 동시 연결 게시 참조)

단점 (2) :

  • CORS 지원 안함
  • 버그? 또한 최근 커밋이 많지 않습니다.

닌 크스 클로저

참고 : 나는 주로 문서가 없기 때문에 가지고 놀지 않았습니다. 흥미롭고 성능이 뛰어납니다.

찬성 (2) :

  • Nginx (성능, 오프로드 SSL, 작업자 재시작 …)
  • 이 모델이 다운 타임 제로 업데이트를 허용 할 수 있습니까? 너무 멋져요!

단점 (1) :

  • 문서화 (개선). 또한 그것이 유일한 방법이라면 nginx 구성 파일에 포함 된 문자열로 프로그래밍하고 싶지 않습니다.
  • 아마도 첫 번째 배포 (?)를 약간 복잡하게 만듭니다.

불변

참고 : 나는 그것을 연주하지 않았습니다.

찬성 :

  • 통합 (캐싱, 메시징, 스케줄링, 와일드 플라이 배포)

단점 :

  • http 클라이언트 없음

카타 쿰바

참고 : 문서는 훌륭해 보이지만 함께 연주하지는 않았습니다. 아마 다음에 시도 할 것입니다. 흥미로운 채팅 프로젝트의 예가 있습니다. 프로토콜을 많이 사용하면 초보자 Clojure 개발자로서 처음으로 나를 화나게했습니다.

장점 (6) :

  • 설명서! 모든 funcool 프로젝트와 마찬가지로이 문서는 읽기 매우 즐겁습니다.
  • 받침 대형 라우팅 구문
  • 성능이 좋아야합니다 (Ratpack 상단에서)
  • 배압
  • websockets, sse, cors, 보안, ssl …
  • 파는 독특한 기능 : 우편

단점 (2) :

  • ct / routes 구문이 얼마나 유쾌하고 링 스펙을 버리는 지에 대해 완전히 확실하지는 않습니다 (비동기 이야기이지만 필자는 받침대가 그것을 고쳤다 고 생각했습니다)
  • 어떻게 스웨거 등을 통합 할 것인지 잘 모르겠습니다.
  • 내가 그것을 시도했을 때, 나는 그것을 즉시 작동시킬 수 없었다

참고 : 원시 성능이 중요한 경우 Clojure 웹 서버벤치 마크를 사용할 수 있습니다.


답변

요즘 받침대 는 볼만한 가치가있는 프레임 워크입니다. 그것은 위에 구축되는 서버 측 프레임 워크 이지만 특정 요청을 일시 중지하고 재개 할 수있어 들어오는 요청을 초기 스레드에서 해제합니다 (그렇지 않으면 느린 요청은 실제로 해당 서버 스레드를 차단합니다). 아마도 JavaBean과 같은 것일 수도 있습니다.

다른 멋진 프레임 워크는 hoplon.io 및 David Nolen ‘s Om입니다 (React 기반).


답변

Webjure , Clojure를위한 웹 프로그래밍 프레임 워크.

기능 : 디스패치 서블릿은 Clojure 함수를 호출합니다. 동적 HTML 생성. JDBC를 통한 SQL 쿼리 인터페이스

이 답변은 Webjure 정보의 자리 표시 자로 사용됩니다.