유튜브 클론코딩[TEMPLATES]

김동현·2021년 12월 7일
0

nodeJS

목록 보기
3/14

Returning HTML

  • 컨트롤러에서 res.send("HELLO");를 리턴하면 페이지에서 HELLO가 출력된다. 하지만 이것은 텍스트를 출력하는게 아니라 HTML문서를 출력하는 것이다.

  • 하지만 일반적인 HTML코드를 res.send()메서드의 매개변수로 넘겨주기엔 너무 길다. 또한, 부분적인 요소만 다르고 나머지는 동일한 여러 페이지를 만들때, 반복작업이 요구된다.

  • 이를 위한 해결책으로 pug가 있다.

Configuring Pug

  • pug는 템플릿을 이용해서 뷰를 만들어주는 템플릿 엔진이다.

  • pug를 사용하기 위해서 다음과 같은 단계를 거친다.

    1. pug 설치
      npm i pug

    2. pug를 express의 뷰 엔진으로 설정

    3. 실제로 pug파일을 생성한다.

    • 공식문서를 보면, views를 참조하기위한 기본 경로가 process.cwd() + /views 이다. 즉, 현재작업디렉토리 안에 views디렉토리를 참조한다는 얘기다. 따라서 그 위치에 생성한다.

    • pug파일을 만든다.

    • 뷰 엔진 설정을 해주었기때문에 따로 import하지 않는다.

    • /으로 접근할때 home.pug 페이지가 보이도록 하자.
      res.render()의 메서드 인자로 pug의 파일명이 들어간다.

    • home 파일을 찾을수 없다고 한다.
      그 뒤에 내용을 보니 wetube/views로 접근한걸 볼 수있다.

    • 현재작업디렉토리가 wetube/src가 아닌 /wetube디렉토리로 잡혀있다.

    • 현재작업디렉토리(cwd)는 노드를 시작하는 디렉토리인데 노드시작할때 package.json으로 시작하기 때문에 현재작업디렉토리가 /wetube로 설정된다.

Partials

  • 위의 문제를 해결하기 위해서는 2가지 방법이 존재한다.

    1. views폴더를 /wetube폴더로 이동하는 것

    2. express 설정을 조작하여 views폴더로 참조경로를 바꾸는것

  • 1번 보다는 2번의 방법이 낫다.
    모든 코드를 src폴더 내에 있는것이 보기 좋기 때문이다.

  • 위의 공식문서 내용을 참조해서 경로를 바꿔보자.
    app.set("views", process.cwd() + "/src/views");
    또는
    app.set("views", process.cwd() + "\\src\\views");

    오류없이 실행된다.

  • pug파일 안에 자바스크립트 코드를 포함 시킬 수 있다.
    #{js코드}

  • pug파일에 적용한 자바스크립트 코드는 유저에게 응답하기전에 처리되어 보내진다. 그러므로 유저입장에서는 자바스크립트 코드를 볼 수 없다.
    이 과정을 랜더링이라 부른다.

  • 각 페이지마다 퍼그파일을 만들면 겹치는 부분이 생긴다. 반복되는 부분이 생긴다는 뜻이다.pug는 그 해결책으로 partials를 이용한다.
    예를들어 watch.pug와 home.pug의 footer부분이 겹친다고 하자.
    겹치는 부분을 따로 파일로 만들고 필요할때마다 include해서 쓸 수 있다.


  • 정리하자면 pug를 사용하는 이유로 크게 3가지 장점이 있다.

    1. 깔끔한 HTML코드

    2. 코드내에 자바스크립트 포함 가능

    3. include로 반복문제 해결

Extending Templates

  • 3개의 pug 파일을 보면 h1태그 부분만 다르고 나머지는 똑같다.
    이 경우 상속을 이용할 수 있다.
    부모가 되는 파일 base.pug를 만들고 다음과 같이 코드를 짠다.




    베이스가 되는 파일을 만들고 사용하려는 곳에서 extends를 한다. 변하는 부분은 block처리하고 따로 추가한다.

Variables to Templates

  • 템플릿에 백엔드의 자바스크립트 변수를 사용할 수 있다.

  • pageTitle이라는 변수는 컨트롤러에서 온다.

    home.pug를 랜더링하면서 object형식으로 변수를 넘긴다.

    home.pug 파일에서는 pageTitle 변수를 직접 사용하진 않지만 base.pug 파일에서는 pageTitle 변수를 직접 사용한다.
    home.pug 는 base.pug 를 상속하기 때문에 home.pug 로 전달된 pageTitle 은 base.pug의 코드에서 사용된다.

MVP style

  • CSS는 보통 마지막에 작업한다. 그래서 기본 스타일이 적용된 상태로 코딩을 하게 되는데 그 때문에 코딩 과정이 지루해진다.
    그럴땐 임시로 이쁜 스타일을 적용하면 된다.
    https://andybrewer.github.io/mvp/

conditionals

  • pug에서 변수를 쓰기 위한 방법이 2가지 있다.

    1. 태그=변수

    2. 태그 #{변수}

      첫 번째 방법은 변수와 텍스트가 섞여있을때 사용하고
      두 번째 방법은 변수만 있을때 사용한다.

  • pug에서 if/else를 쓸 수 있다.
    공식문서 참조
    https://pugjs.org/language/conditionals.html

  • 가짜정보를 만들어서 변수로 넘겨준뒤 pug를 살펴보자.

    if 뒤에 변수를 쓸 수 있다. fakeUser.loggedIn이 현재 false이기 때문에 else뒤의 코드가 실행된다.
    사이트를 보면 login 이 표시되는걸 확인 할 수 있다.

  • true로 바꿔서 사이트를 보자.

iteration

  • pug에서 선택(conditional)구조 말고 반복(iteration)구조도 사용할 수 있다.
    공식문서 참조
    https://pugjs.org/language/iteration.html


  • iteratable한 자료형에 아이템이 하나도 없을때 특정한 액션을 취하고 싶다면 else를 쓰면 된다.


mixins

  • mixin은 partial과 비슷한데 partial과 다르게 데이터를 받을 수 있다.
    데이터를 pug로 전달해보자. 가짜 비디오 정보를 보낸다고 가정한다.

    mixin파일을 하나 만든다. 함수와 비슷한거 같다. 이름과 매개변수를 정의한다.

    mixin안에 사용되 videos는 지역변수와 같으므로 어떠한 이름으로도 사용 가능하다.

    사용하고자 하는 파일에서 include한 뒤에 +기호를 붙여 호출한다.
    매개변수처럼 사용된 videos는 컨트롤러에서 전달한 변수이므로 이름이 같아야 한다.

  • 참고로 include 나 extends 할 때 pug 파일명 뒤에 .pug 확장자 명을 적지않더라도 pug는 똑똑해서 파일을 잘 찾는다.

profile
프론트에_가까운_풀스택_개발자

0개의 댓글