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

StackOverflow https://stackoverflow.com/questions/167262

  •  03-07-2019
  •  | 
  •  

문제

나는 이것이 Java와 매일 일하는 대다수의 프로그래머들에게 이상한 질문이라고 생각합니다. 나는 아니에요. 나는 Java-the-World가 아니기 때문에 Java-the-Language를 알고 있습니다. 나는 Java에서 처음부터 웹 앱을 만들지 않았습니다. Python, Ruby와 함께해야한다면 어디로 가야할지 알고 있지만 Clojure에서 웹 응용 프로그램을 만들고 싶다면 Java 세계에 살도록 강요했기 때문이 아니라 언어와 마찬가지로 시도해보고 싶습니다. 어떤 라이브러리와 프레임 워크를 사용해야합니까?

도움이 되었습니까?

해결책

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

작지만 강력하며 아름답고 우아한 구문이 있습니다. (후드 아래에서 부두를 사용하지만, 원하지 않는 한 서틀 API를 숨 깁니다. 해당 URL의 readme를보고 스냅 샷을 다운로드하고 재생을 시작하십시오.

다른 팁

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

반지 HTTP 요청 및 응답 프로세스를 추상화하여 기초를 제공합니다. Ring은 들어오는 요청을 구문 분석하고 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>"}))

링의 다른 부분 중 하나는 중간웨어의 개념입니다. 이것은 핸들러와 들어오는 요청 및/또는 나가는 응답 사이에있는 코드입니다. 중간웨어로 내장 된 일부에는 세션과 스택 트레이스가 포함됩니다. 세션 중간웨어는 요청을하는 사용자를위한 모든 세션 정보를 포함하는 요청 맵에 A : 세션 키를 추가합니다. : Session Key가 응답 맵에 있으면 현재 사용자가 작성한 다음 요청에 대해 저장됩니다. 스택 트레이스 중간웨어는 요청을 처리하는 동안 발생하는 예외를 캡처하고 예외가 발생하면 응답으로 다시 전송되는 스택 추적을 생성합니다.

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

(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를 해당 값으로 설정합니다.

마지막 구성 요소는입니다 딸꾹질 HTML을 더 쉽게 생성 할 수 있습니다. 다양한 HTML 태그는 태그 이름을 나타내는 첫 번째 요소이고 나머지는 태그의 본문 인 벡터로 표시됩니다. "<h2>A header</h2>" becomes [:h2 "A Header"]. 태그의 속성은 선택적 맵에 있습니다. "<a href='/login'>Log In Page</a>" becomes [: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의 저자가 현재 작성한 일부 문서 초안에 대한 링크입니다. 컴포지트 문서

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

고려하다 루미누스 웹 프레임 워크. 나는 제휴가 없지만 내가 존경하는 친구들로부터 좋은 것을 들었습니다.

현재 내 현재 웹 사이트 도서관이 있습니다 야다.

방금 시작한 경우 입문 서버는 Compojure. 나는 그것을 apache Clojure World의 웹 서버 (이 경우 Yada/Aleph는 Nginx 일 것입니다). 당신은 사용할 수 있습니다 Luminus 템플릿으로. 같은 변형이 있습니다 compojure-api.

나는 OU를 시도했다 Pedestal 그리고 전 세계적으로 만족했습니다. 나는 그것을 마스터한다고 주장하지는 않지만 즐거운 구문을 가지고 있으며, 매우 응집력이 있으며, 성능이 뛰어난 것처럼 보입니다. 또한 지원합니다 Cognitect (Rich Hickey가 작동하는 Clojure/Datomic Company).

나는 찾았다 Aleph 흥미로운 추상화를 제시하는 것은 내장 배압이 흥미로워 보입니다. 아직 놀지 못했지만 확실히 내 목록에 있습니다.

다양한 웹 서버에서 비트를 플레이 한 후 다음은 빠른 프로/단점 목록입니다.

짧은 대답 : 살펴보십시오 루미누스 신속하게 시작하려면 필요가 진화함에 따라 다른 것으로 넘어갈 수 있습니다 (Yada 어쩌면).

작곡

  • 장점 (1) :

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

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

받침대

  • 장점 (3) :

    • 인터셉터 모델, 쾌적한 구문, 노선의 하위 집합에 인터셉터를 추가합니다.
    • 성능 라우터
    • JSON/Transit/Multipart 양식은 아무 것도 묻지 않고 투명하게 상자 밖으로지지합니다. 아주 멋지다!
  • 단점 (4) :

    • WebSocket 지원이 없음 (아직), Returning Core.async 채널이 좋을 것입니다.
    • 스튜어트 시에라의 구성 요소에 넣으면 다시로드하는 데 약간 느리게
    • 비동기 인터셉터 용 테스트 시설이 없습니다
    • 구매가 필요합니다 (?)

알레프

프로 (3) :

  • 공연자
  • 배압
  • Manifold 스트림을 반환 할 때 WebSocket/SSE 지원

단점 (1) :

  • 낮은 레벨, 스스로 스타일을 수행하십시오 (예 : 핸들러가 무언가를 할 수있는 방법을 제공합니다. 라우터, 아무것도 없습니다). 실제로 단점이 아니라, 그냥 알고 있어야합니다.

야다

프로 (3) :

  • Aleph에 지어졌습니다
  • 내용 부정
  • Swagger 통합
  • Bidi는 상당히 괜찮습니다 (나는 받침대 라우터 구문을 더 좋아하지만)

단점 (1) :

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

httpkit

pro (2) :

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

단점 (2) :

  • CORS 지원이 없습니다
  • 버그? 또한 최근의 커밋은 많지 않습니다

nginx-clojure

참고 : 나는 주로 문서화가 없기 때문에 그것을 가지고 놀지 않았습니다. 그래도 흥미롭고 매우 성능이 있습니다.

장점 (2) :

  • nginx (Performant, Offload SSL, 재시작 작업자 ...)
  • 이 모델이 제로 다운 타임 업데이트를 허용 할 수 있습니까? 너무 굉장 할 것입니다!

단점 (1) :

  • 문서 (개선). 또한 NGINX 구성 파일에 포함 된 문자열로 프로그램하고 싶지 않습니다.
  • 아마도 첫 번째 배포 (?)를 조금 복잡하게 만듭니다.

불변

참고 : 나는 그것을 가지고 놀지 않았습니다.

장점 :

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

단점 :

  • HTTP 클라이언트가 없습니다

카타 쿠바

참고 : 문서가 훌륭해 보이지만 연주하지 않았습니다. 나는 아마 다음에 그것을 시도 할 것입니다. 흥미로워 보이는 예제 채팅 프로젝트가 있습니다.

장점 (6) :

  • 문서! 모든 Funcool 프로젝트와 마찬가지로 문서는입니다 매우 읽는 것이 즐겁습니다.
  • 받침대와 같은 라우팅 구문
  • 수행해야합니다 (Ratpack 위에)
  • 배압
  • Websockets, SSE, Cors, 보안, SSL ...
  • 발굴 할 독특한 기능 : 우편

단점 (2) :

  • CT/Routes 구문이 얼마나 유쾌한 지, 링 사양을 버리는 것에 대해 완전히 확신 할 수는 없습니다 (아마도 비동기 스토리의 경우, 나는 받침대 사람들이 그것을 고쳤다 고 생각했습니다).
  • Swagger 등을 어떻게 통합하는지 잘 모르겠습니다.
  • 시도했을 때 바로 작동하게 할 수 없었습니다.

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

요즈음 받침대 살펴볼 가치가있는 프레임 워크입니다. 그것은 위에 구축되는 서버 측 프레임 워크입니다. 반지, 또한 특정 요청을 일시 중지하고 재개 할 수있어 초기 스레드의 들어오는 요청을 해방합니다 (그렇지 않으면 느린 요청은 실제로 Serverthread를 차단합니다). 어쩌면 Javabean과 같은 것일 수도 있습니다.

다른 멋진 프레임 워크입니다 Hoplon.io 그리고 David Nolen 's (반응 기반)

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

특징 : 디스패치 서블릿은 Clojure 기능을 호출합니다. 동적 HTML 생성. SQL 쿼리 인터페이스 (JDBC를 통해).

이 답변은 Webjure 정보의 자리 표시자를 의미합니다.

Compojure는 내가 작은 블로깅 응용 프로그램을 구축하는 데 사용한 것입니다. Sinatra에서 모델링되어 Ruby의 최소한의 가벼운 웹 프레임 워크입니다. 나는 주로 Sinatra와 같은 라우팅을 사용했습니다. 그것은 다음과 같습니다.

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

ORM 또는 템플릿 라이브러리는 없지만 벡터를 HTML로 전환하는 기능이 있습니다.

이러한 프레임 워크를 볼 수도 있습니다 ( 공개/프로젝트):

스택 오버플로에 관련 질문이 하나 더 있습니다. 성숙한 Clojure 웹 프레임 워크?

면책 조항 : 저는 저자입니다.

Luminusweb와 밤나무 템플릿을 결합한 Leiningen 템플릿을 모았습니다. 따라서 Front and Backend 용 Clojurescript 코드를 사용하여 Clojure 코드를 작성할 수있는 내용을 얻을 수 있습니다.
또한 사용자 관리와 간단한 Crud 생성과 더 작은 작은 호감을 제공합니다. https://github.com/sveri/closp

나는 2 센트로 던질 것이다 도관, 또한 @WeaveJester, Compojure 및 Ring의 관리자.

그것은 핵심에서 가져옵니다 요소 그리고 한 지붕 아래의 링 라우터. 내가 덕트를 사용하는 이유 :

  • 우수한 철학적 기초 : 일련의 작은 구성 요소로 앱을 구축하도록 권장하며, Sane Defaults를 제공하는 동안 의견을 거의 보유하는 것 사이의 균형을 잘 맞 춥니 다.
  • 안정적인 길 : 나는 나 자신을 위해 말하지만, 수년에 걸쳐 Clojure 커뮤니티가 신용이없는 웹 프레임 워크를 제시했다고 생각했습니다. 부부는 단순히 너무 실험적이라고 느꼈습니다 (OM과 고객 측 받침대에 대한 나의 경험) "일을 끝내기"(길에서 우월하지는 않음). 다른 한편으로, 나는 @weavejester가 동일한 안정성을 가져 와서 커뮤니티에서 훌륭하게 태어난 작곡과 반지에 대한 덕트에 진전을 측정 한 것처럼 느낍니다.
  • 이것의 감독자 가벼우 며 내 구성 요소의 방식이 아닙니다.

주요 기능 :

  • 미니 웹 서버 (또는 HTTP 경로의 작은 단면)로 생각할 수있는 소형 구성 요소 인 "엔드 포인트"로 경로를 구성합니다.
  • 에 대한 상자 외 지원 다시로드 된 워크 플로.
  • Ring 및 Compojure와의 완벽한 통합.
  • 개발 및 생산 구성 (다른 곳에서 눈에 띄게 누락 된 것을 발견 한 것).
  • 예제와 좋은 문서.

메모: 말할 필요도 없지만 대부분의 clojurey things 덕트와 마찬가지로 웹 개발 신규 이민자들의 이점을 위해서는 언어를 clojure를 확실하게 파악해야합니다. 또한 구성 요소에 대해 먼저 읽는 것이 좋습니다.

또 다른 개인 메모에서, 나는 1 년 넘게 여러 생산 응용 프로그램에서 덕트를 사용해 왔으며 매우 만족합니다.

코일에서 Clojure를 사용해 볼 수도 있습니다. http://github.com/zubairq/coils - 면책 조항 : 저는 저자입니다

또 다른 흥미로운 웹 서버입니다 http-kit. 성능이 우수하고 링을 준수하며 Websocket도 지원합니다. 그것은 주로 Clojure로 만들어졌으며 Jetty/Tomcat의 이상한 것들이 부족합니다.

땜질하기 쉽습니다.

재구성 및 om.next 아마도 당신이 찾고있는 것을 아마.

아라크네 새로 온 웹 프레임 워크입니다. 사이트의 설명 인용 :

Arachne은 Clojure를위한 완전하고 모듈 식 웹 개발 프레임 워크입니다. 그것은 용이성, 단순성 및 견고하고 확장 가능한 디자인을 강조합니다.

그것은 있습니다킥 스타터 캠페인철도와 비슷한 "시작"경험을 제공한다고 주장합니다. 그것은 Cognitect에 의해 개발되었습니다.

여기 루미누스 (Yogthos)의 저자와 함께 좋은 토론입니다.

나는 사용하고있다 해방자 한동안 생산에서 성공적으로. 편안한 웹 서비스를 구축하거나 비슷한 것을 구축하는 경우 베어 본을 원한다면 훌륭한 프레임 워크입니다. 본질적으로 링 및 컴포지주기의 래퍼이며 들어오는 요청을 확인할 때 의사 결정 그래프를 제공합니다. 또한 다른 부피가 큰 웹 프레임 워크에 비해 매우 빠릅니다. 빨리 어딘가에서 시작하고 천천히 쌓이고 싶다면 Liberator는 훌륭한 선택입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top