AngularJs 앱을 작성할 때 Jade 또는 Handlebars를 사용하는 방법


120

나는 전체 자바 스크립트 풀 스택 응용 프로그램에 대해 새롭고 Angular에 완전히 새롭기 때문에 누군가가 나를 위해 바로 기록을 올릴 수 있기를 바랐습니다.

AngularJS를 사용하여 클라이언트 측 앱을 작성할 때 Jade 또는 Handlebars와 같은 템플릿 프레임 워크를 사용해야하는 이유는 무엇입니까?

나는 이러한 템플릿 프레임 워크를 사용한 적이 없다고 말해야한다. 그래서 나는 이점에 대해 완전히 익숙하지 않습니다. 하지만 예를 들어 Handlebars를 보면 루프 등 Angular에서하는 것과 동일한 작업을 많이 수행합니다.

내가 말할 수있는 한, 적절한 HTML을 사용하여 Angular에서 템플릿을 만든 다음 모든 템플릿 클라이언트 측을 수행하고이를 노드 및 몽고를 사용하는 API 첫 번째 접근 방식과 결합하는 것이 가장 합리적입니다.

이 혼란의 이유는 GitHub에서 찾은 많은 예제가 Jade를 사용하고 있으며 나에게 반 직관적 인 것처럼 보이기 때문입니다.

나를 깨달아 주시고 똑바로 세우십시오. 저보다 훨씬 더 많이 아는 사람들로부터 몇 가지 모범 사례를 배우고 싶습니다.

감사

답변:


61

의심 할 여지없이 Angular 환경에서 Jade를 선호 하는 사람들 은 OP가 언급 한 것처럼 뷰 로직이 클라이언트에 있고 비즈니스 로직이 서버에 속한다는 것을 이해하지 못합니다.

당신이 그것을 할 아주 좋은 이유가 없다면 그것을하지 마십시오. 엔지니어링에서는 움직이는 부품이 적은 시스템이 더 안정적인 시스템이고, 인터페이스 경계 (클라이언트 / 서버)가 존중되는 시스템은 장기적으로 더 유지 관리가 가능하므로 기본적으로 가장 단순한 아키텍처와 가능한 경우 깨끗한 분업을 사용합니다. 우선하는 이유가있는 경우해야 할 일을 수행하되 주의 해야합니다 .

최근에 저는 단순한 Angular 템플릿이 Jade에서 믹싱하는 것보다 단순성을 유지하는 것보다 훨씬 더 나은 일을 할 수있는 코드를 검토했습니다.

템플릿 확장 외에도 Jade는 Angular가 아직 제공하지 않는 테이블에 가치가 없습니다. 솔직 해지자. "상속보다 구성을 선호"(즉, 부분)라는 건전한 원칙을 사용하면 템플릿 확장 성 이 필요 하지 않습니다 . Jade는 HTML보다 "파싱하기가 더 쉽지"않습니다. 그것들은 사소하게 다르지만 Jade는 또 다른 수준의 간접적 인 방향을 추가합니다.

서버 측 템플릿에 대한 유효한 특수 사례가 하나 있습니다. 최적화, 조기 최적화는 일반적으로 나쁜 일이라는 것을 기억하십시오. 성능이 진정으로 문제가 되고이를 처리 할 수있는 서버 용량이있는 경우 서버 측 템플릿이 도움이 될 수 있습니다. 이것은 Twitter 및 Basecamp와 같은 제품에 적용되며 서버 측 작업을 많이 수행하는 비용은 서버에 대한 요청 감소로 상쇄됩니다.

Handlebars의 경우 AngularJS의 (놀라운) 클라이언트 측 템플릿을 교체 할 필요가 없습니다.


4
안녕 닉, 내가 도달 한 대답이기도합니다. 나는 그것을 퉁명스럽게 말하지 않았지만 동의합니다!
Jay Pete

60
@Nick, XML / HTML 쓰기 / 읽기를 즐기는 사람들을 많이 보지 못했습니다. 당신은 아마도 제이드와 같이 훨씬 더 건조하고 깨끗한 것을 선호하는 것을 실제로 옹호하는 가장 드문 사람 일 것입니다. 사람들이 XML / HTML을 쓰거나 읽지 않도록하는 것이 목적인 수많은 라이브러리가 있습니다.
Alex K

12
필요하지 않은 곳에 복잡성을 도입하지 않습니다. C 코드 또는 더 나쁜 C ++ 템플릿을 읽는 데 하루를 보내면 HTML을 정신적으로 파싱하는 것이 실제로 매우 사소한 문제라는 것을 금방 깨닫게 될 것 입니다.
엔지니어

35
"어떤 전문가라도 이것을 주장하는 것은 우스운 일입니다.", "정신적으로 HTML을 파싱하는 것은 매우 사소한 문제입니다.". 나는 이러한 매우 비열한 의견을 발견합니다. 구문 분석이 너무 쉽기 때문에 어셈블리를 작성 하시겠습니까? Jade는 기본적으로 Angular를 사용할 때 XML 용 YAML입니다.
Philipp Gayret 2014

7
@NickWiggill에 동의합니다. JADE 템플릿과 원시 HTML을 정신적으로 구문 분석하려면 동일한 'wetware'CPU 시간이 필요합니다. 동의하지 않으면 전문가답지 않다고 말하지는 않겠지 만, 나에게도 마찬가지입니다. @ Philipp, JADE를 HTML로 구문 분석하는 것과 동일한 어셈블리로 C / C ++ 구문을 분석하는 비유는 좋지 않습니다. 거의 실시간으로 어셈블리 구문 분석을 시작할 수있는 사람이 거의없는 반면 대부분의 웹은 개발자는 JADE만큼이나 아주 쉽게 HTML을 구문 분석 할 수 있습니다.
nomis 2014 년

63

일반 HTML 작성을 싫어하기 때문에 Jade를 사용하여 AngularJS에서 사용하는 템플릿을 생성합니다. 다음과 같이 보입니다.

.control-group(
  ng-form
  name='emailGroup'
  ng-class='{"ng-error": emailGroup.$invalid}'
)
  label.control-label Email
  .controls
    input(
      type='email'
      ng-model='user.email'
      required
      placeholder='you@example.com'
      focus-on='focusEmail'
    )

… 일반 HTML보다 훨씬 더 깔끔하다고 생각합니다.


12
좋습니다. 일반 HTML을 작성하는 것을 좋아하지 않기 때문에 사용하십니까? 이것이 Jade의 주요 이점입니까? 다른 승리가 있습니까? Jade가 어떤 식 으로든 HTML을 엉망으로 만든 적이 있으므로 특정 출력을 얻으려면 HTML을 조정해야합니까? 나는 실제 필요없이 또 다른 간접적 층 을 추가 할 위험이 있다고 본다 . 그러나 다시, 그것이 내가 묻는 이유입니다. 여기서 가치를 이해하고 싶습니다.
Jay Pete

1
Angular를 시작하기 전에 실제로 Jade로 시작했기 때문에 의식적인 선택보다는 고착 된 습관 이었지만 지금까지는 잘 작동했습니다. Jade와 관련된 유일한 문제는 공백을 처리하는 방식 (pretty = false 사용)이므로 태그 사이에 공백을 추가해야 할 때마다 소스 파일에 후행 공백이 발생했습니다. include 및 mixin과 같은 기능이 매우 유용하다는 것을 알았습니다.
thatmarvin

합니까 ng-inlude, 아마도 함께 사용 ng-src비취의 유지 mixin에서 많이 다릅니다과 및 포함?
Jay Pete

2
HTML을 통해 추상화의 @JayPete 제이드의 층이다 soooo의 얇은. 제가 사용 해본 구문 중 가장 직관적 인 번역 중 하나입니다. 변수와 조건부 논리를 사용하는 경우를 제외하고는 Jade에서 거의 마법이 발생하지 않습니다 (다른 템플릿 엔진에서와 마찬가지로). 정말 그렇게 다르지 않습니다.
Chev

6
단순함은 주관적입니다.
Chev

46

솔직히 사람들이 이것의 차이점에 관심을 갖는 이유를 이해하지 못합니다.

<html ng-app>
 <!-- Body tag augmented with ngController directive  -->
 <body ng-controller="MyController">
   <input ng-model="foo" value="bar">
   <!-- Button tag with ng-click directive, and string expression 'buttonText' wrapped in "{{ }}" markup -->
   <button ng-click="changeFoo()">{{buttonText}}</button>
   <script src="angular.js">
 </body>
</html>

이:

html(ng-app="ng-app")
  // Body tag augmented with ngController directive  
  body(ng-controller="MyController")
    input(ng-model="foo", value="bar")
    // Button tag with ng-click directive, and string expression 'buttonText' wrapped in "{{ }}" markup
    button(ng-click="changeFoo()") {{buttonText}}
    script(src="angular.js")

사람이 조금 더 읽을 수있는 것을 제외하고는. 약간 . 사람들이 그 주제에 대해 왜 그렇게 열광하는지 이해하지 못합니다. 그것은 모두 자전거 흘리기입니다. 그 차이는 무시할 만하고 유능한 프로그래머라면 구글에서 5 초만에 쉽게 번역 할 수 있습니다. 당신이 원하는 것을 사용하고 다른 사람들이 아무것도 놓고 다투게하십시오. 전투를 선택하고 원자로 와 같이 실제로 중요한 것에 대한 토론에 참여하십시오 .)


2
동의하지만 if방정식에 비취 1 개만 더하면 모든 것이 갑자기 바뀝니다. "프리미엄 사용자"에 대해서는 위를 참조하십시오.
TWiStErRob

15
동의하지 않습니다. 9 줄의 html 페이지는 완전히 비현실적입니다. 내가보고있는 페이지의 소스를 취하면 2320 줄을 1580으로 변환합니다 ( html2jade 사용 ). 그게 이상 700 개 모든 유래 템플릿 작성 누구를위한 시간 낭비의 라인
필립 Gayret을

2
@TWiStErRob 만약 당신이 jade에서 HTML로 이동한다면, 당신이해야 할 일은 템플릿을 렌더링하는 것뿐입니다. 당신이있는 경우 if귀하의 옥 마크 업들 당신은 이미 어쨌든 시티 템플릿 엔진의 일종 필요가 있고 무엇이든로 변환해야 할 것 if그 엔진에 의해 사용되는 구문. 나는 당신의 비판을 정말로 이해하지 못합니다.
Chev

이 전체 논쟁이 조건부 논리 (서버 또는 클라이언트)가 속한 위치에 관한 것이라면 원래보다 더 어리석은 논쟁이라고 생각합니다. 둘 다에 대한 경우가 있으며 둘 중 하나가 작동하거나 둘 다 개인이 선호하는 것을 사용합니다. 나는 것보다 이와 같은 인수 가진 더 많은 시간을 보냈어요 지금까지 반대 서버 측보기 또는 그 일부 로직을 넣어 과거의 결정을 저주 지출을. 우리 모두 효율성에 대해 논쟁하고 싶다면 대신이 전체 대화의 장점을 논의해야합니다.
Chev

3
@Philipp, 제거 된 대부분의 줄이 닫는 태그라고 가정하는 것이 안전하지 않습니까? 대부분의 편집자는 여는 태그를 작성할 때 자동으로 닫는 태그를 추가하기 때문에 실제로 700 줄을 쓰면 절약 된 것 같습니다.
Semicolon

14
  1. AngularJS에는 자체 템플릿 엔진이 있으므로 핸들 바를 사용할 필요가 없습니다.
  2. 그들이 Jade를 사용하는 이유는 html로 컴파일되고 나중에 프런트 엔드에서 angularJS가 제공하는 서버 렌더러이기 때문입니다.

따라서 TL; DR은 서버에서 어떤 언어 [jade, haml, ...]를 사용하여 애플리케이션에 대한 html 구조 만 생성 할 수 있습니다. angularJS와는 아무런 관련이 없습니다. 프론트 엔드의 런타임.

서버에서 Jade를 사용할 필요가 없으며 새로운 개발자에게 혼란을 줄 수 있으므로 사용하지 않는 것이 좋습니다. 당신이 보는 프로젝트에서 그들은 더 깨끗하고 익숙하기 때문에 Jade를 사용하며 angularJS와 함께 사용하는 경우 논리없이 일반 HTML을 생성하는 것이 유일한 작업입니다.


2
서버에서 생성 된 html을 사용하지 않고 로직과 뷰를 완전히 분리하는 것이 더 깔끔하지 않을까요? 아니면 내가 놓친 것이 있습니까? AngularJS 앱을 작성할 때 Jade가 좋은 생각 인 이유는 무엇입니까?
Jay Pete

나는 angularJS와 함께 사용하는 것이 좋은 생각이라고 말하지 않습니다. Jade는 angularJS와 관련이 없습니다. 이를 명확히하기 위해 답변을 업데이트하겠습니다.
Dzung Nguyen 2013-08-11

나는 Jade가 Angular와 아무 관련이 없다는 것을 이해합니다. AngularJS 부분에 실제 HTML을 작성하는 것보다 Jade의 가치가 무엇인지 알아 내려고 노력하고 있습니다. 나는 그것을 사용하는 사람들을 많이 볼, 왜 :-) 이해하려면
제이 피트

2
다시 말하지만 Jade는 AngularJS와 관련이 없습니다. AngularJS는 HTML 부분을 합치고 HTML 페이지에서 제공됩니다. Jade 또는 Haml을 포함하여 서버 측에서 HTML 페이지를 만드는 데 사용할 수 있습니다. Jade / Haml은 실제로 템플릿 프레임 워크가 아닙니다. 그들은 더 많은 전 처리기입니다. 올바른 질문은 "핸들 바 또는 콧수염 또는 다른 자바 스크립트 템플릿 언어"가 될 것입니다
에디 몽주 주니어

@JayPete angularJS를 개발할 때 Jade를 사용하는 이점은 아마도 Jade 구문 때문일 수 있습니다. 그러나 여전히 내 경험으로 인해 많은 도움이되지 않습니다. 그래서 그냥 html로하세요 :)
Dzung Nguyen 2013-09-15

8

받아 들여지는 대답은 다소 일방적이며 HTML 용 사전 컴파일러 설정이 모든 종류의 HTML 프로젝트에 유용하다는 사실을 무시합니다. 구성 및 결과 마크 업 유연성.

Angular 앱에서 혼자 작업하십니까? Jade를 사용해보세요.

Jade는 HTML을 모듈화하는 능력을 향상시키고 HTML 디버깅에 소요되는 시간을 줄이며 마크 업 인벤토리 구축을 장려합니다.

디자인 타임 동안 HTML 부분에 엄청난 양의 반복이있을 수 있습니다. HTML 출력이 jade 파일 집합을 기반으로하는 경우 팀이 변화하는 요구 사항에 유연하게 대처할 수 있습니다. 또한 jade 포함을 재구성하여 마크 업을 변경하는 것은 순수한 HTML을 다시 작성하는 것보다 훨씬 강력합니다.

즉, 나는 생산 또는 개발 단계에서 각도와 옥을 혼합하는 것에 대한 일반적인 혐오감을 인식합니다. 또 다른 필수 구문 지식 세트를 도입하는 것은 대부분의 팀에게 나쁜 생각이며 jade를 사용하면 DRY 원칙에 의해 금지되는 일부 작업을 추상화하여 비효율적 인 프로젝트 관리를 숨길 수 있습니다 (예 : 마크 업 준비에 게으름).


2
왜 이것이 -1인지 모르겠지만 나는 그것을 반박했습니다.
Mark K Cowan 2014

완전히 사실이 아니기 때문에 반대 투표를 받았습니다. Jade는 HTML을 모듈화하기 위해 아무것도하지 않습니다. 프리 컴파일러에서 올바른 방식으로 사용된다면 일반 HTML에 대해서도 똑같은 말을 할 수 있습니다.
Justin

1
모든 사전 컴파일러에 대해 똑같이 말할 수 있습니다. Jade의 경우 Mixins jade-lang.com/reference/mixins 는 모듈화를 개선 할 수 있습니다 (특히 바닐라 HTML과 비교). HTML 모듈화에 관심이 있다면 polymer-project.org 를 좋아할 수도 있습니다 .
Mirko 2015 년

7

위의 모든 답변을 읽었으며 AngularJS 템플릿 생성보다 옥을 사용하는 것이 매우 유용한 한 가지 측면을 언급 한 사람이 아무도 없다는 사실에 약간 놀랐습니다.

이미 말했듯이 프로덕션에서 raw html과 jade를 입력하는 것 사이의 현실적인 시나리오 차이는 실제로 주목할 만하지 만 우리가 절대 잊지 말아야 할 더 중요한 것은 때때로 동적으로 변경되고 다시 초기화 된 angularjs 템플릿이 필요하다는 것 입니다.

간단히 말해서 , 때때로 innerHTML을 통해 html을 변경 한 다음 AngularJS가 내용을 다시 컴파일하도록 강제해야합니다. 그리고 이것은 옥을 통해 그러한 뷰를 생성 할 때 정확히 유형의 작업이 이점을 가질 수 있습니다.

또한 AngularJS는 구조가 잘 알려진 모델과 잘 작동합니다. 실제로 우리는 실제로 정확한 구조를 알지 못합니다 (예 : JSON 렌더러를 상상해보십시오). AngularJS는 (앵귤러 앱을 구축하고 있더라도) 꽤 서 투르지만 jade가 작업을 수행합니다.



2

Jade는 Haml보다 html에 훨씬 더 가깝습니다. 따라서 컨텍스트 전환은 실제로 매우 최소화됩니다. 그러나 완전히없는 것은 아닙니다. 개발자에게는 전혀 중요하지 않을 수 있습니다. 그러나 디자이너가 와서 제대로 작동하도록 중첩 된 태그를 얻는 방법을 묻는다면 처음에 생성 한 불필요한 문제를 해결하는 것입니다.

HTML은 여전히 ​​매우 읽기 쉽게 작성 될 수 있으며 부분을 사용하여 더 이해하기 쉽게 만들 수 있습니다. 500 줄의 내용은 읽기 어렵습니다. Jade 또는 HTML입니다.

다음은 Jade 템플릿입니다.

.product-container

    .input-group.msB.col-md-5.no-padding
        .fnt-light-navyblue.mtB(for='name')
            strong Name the sticker
        input.full-input(type='text', placeholder='Awesome Batman Sticker')
    .clear

    .form-group.mmT
        label.form-label.fnt-light-navyblue
            strong Choose size
        .selector-group(ng-repeat="size in sizes", ng-class="{ 'msT': !$first}")
            - raw
            span.radio
                input.radio(name='choose_sticker_size',
                            ng-model="selectedSize",
                            type='radio',
                            value='{{size}}',
                            id="sticker-{{size}}")
                span.fake-radio
            label(for='sticker-{{size}}') {{size}} inch
            - endraw
    // end form-group
    .clear

그리고 동등한 HTML

<div class="product-container">

    <div class="input-group msB col-md-5 no-padding">
        <div for="name" class="fnt-light-navyblue mtB">
            <strong>Name the product</strong>
        </div>
        <input type="text" placeholder="Awesome Batman Sticker" class="full-input" />
    </div>
    <div class="clear"></div>

    <div class="form-group mmT">
        <label class="form-label fnt-light-navyblue">
            <strong>Choose size</strong>
        </label>
        <div
            class="selector-group"
            ng-class="{ 'msT': !$first}"
            ng-repeat="size in sizes">
                {% raw %}
                <span class="radio">
                    <input
                        id="sticker-{{size}}"
                        class="radio"
                        name="choose_sticker_size"
                        ng-model="selectedSize"
                        type="radio"
                        value="{{ size }}" />
                    <span class="fake-radio"></span>
                </span>
                <label for="sticker-{{size}}">{{size}}</label>
                {% endraw %}
        </div>
    </div><!-- end form-group -->
    <div class="clear"></div>
</div>

읽기 쉽게 작성했을 때 HTML이 전환을 보증하기 위해 특히 불리한 것으로 보지 않습니다. 물론 꺾쇠 괄호는 눈에 띄지 않습니다. 그러나 내가 도입 한 간접적 인 방법이 html을 깨뜨리고 있는지 디자이너의 의심을 처리하는 것보다 오히려 그것들을 갖고 싶습니다. (그렇지 않을 수도 있습니다. 그러나 그것이 가치있는 노력이 아님을 증명하는 것입니다)


0

우선, 항상 일종의 서버 측 템플릿이 필요합니다.

순수한 클라이언트 측 템플릿은 로딩 시간에 큰 단점이 있으므로 서버에서 일부 정적 요소를 렌더링하여 완화되는 경우가 많습니다. 이렇게하면 사용자가 페이지를 부분적으로로드 할 때 이미 페이지에 일부 요소가 표시됩니다.

그리고이 경우 템플릿이 편리하지만 사람들은 가끔 Jekyll과 같은 정적 HTML 생성기를 대신 사용합니다.


이전에 언급되지 않은 Jade를 사용하는 또 다른 이유가 있습니다.

공백.

들여 쓰기 및 줄 바꿈을 사용하여 사람이 유지 관리 할 수있는 HTML을 작성하는 경우 모든 줄 바꿈은 공백 텍스트 노드가됩니다. 어떤 경우에는 인라인 요소의 형식을 거의 망가 뜨리고 자바 스크립트 코드를 더 이상하게 만들 수 있습니다.

자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Whitespace_in_the_DOM 에서 읽을 수 있습니다.

Jade 코드를 작성하는 경우이 문제가없는 한 줄 HTML로 컴파일됩니다.


> [FasteRender] ( meteorhacks.com/fast-render )는 서버 측 렌더링을 포함하지 않는 솔루션입니다. Meteor에서로드 된 초기 HTML을 사용하여 첫 번째 페이지를 렌더링하는 데 필요한 데이터를 전송하므로 JavaScript가 클라이언트에로드 된 직후 페이지가 렌더링됩니다. SSR (Server Side Rendering)과 동일한 결과를 제공하지만 Meteor의 핵심 원칙 중 하나를 위반하지 않고 여전히 데이터를 전송합니다.
Max Hodges 2014 년

0

팀에서 작업 할 때 프런트 엔드는 페이지를 정적 HTML로 디자인하는 것을 선호합니다. 정적 html을 동적 템플릿으로 번역하는 것은 오류의 원인이며 jade를 추가하면 이러한 번역 단계가 추가됩니다.

다른 많은 사람들과 마찬가지로 저는 단순함을 선호합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.