-> Html을 returning 하려면 그냥 controller에 Html을 response해줄 수 있지마 그렇게 되면 수정도 어렵고 코드가 너무 길어짐. 따라서 우리는 pug라는 template engine(정확히는 view engine)을 사용해야함!
pug는 pug내의 모든 JScode를 실행한 뒤 유저에게 제공해줌. 우린 이걸 렌더링이라 부름.
-> 그냥 html로 만들고 연동 안 시키는 이유는?
1.We will add the CSS and JS later, we need Pug because the server needs to construct the HTML depending on the request.
2.res.sendFile(__dirname, 'potato.html') 같이 html 파일을 바로 렌더링 할 수 있긴 합니다. 하지만 Nico쌤이 답변해주신 것처럼 request를 통해 각종 변수를 전달하지 못하기 때문에 미리 정해둔 화면 밖에는 보여줄 수가 없고, header 나 footer 등을 따로 partial로 만들어 관리하고 모든 파일에 첨부한다든지 할 수 있기 때문에 pug를 쓰는 것입니다.
->pug는 반복할 필요가 없다는 큰 장점을 가짐!
pug안에(템플릿에) 어느 JScode라도 넣을 수 있음
=> #{}을 사용해서 !
Pug는 Haml의 영향을 많이 받은, Node.js 및 브라우저용 JavaScript로 구현된 고성능 템플릿 엔진입니다. Pug는 이전에 "Jade"로 알려졌습니다. 그러나 "Jade"가 등록상표임이 밝혀져 이름을 변경했습니다.
npm i pug
PUG PACKAGE & 사용법
~~Express가 템플리트를 렌더링하려면 다음과 같은 애플리케이션 설정이 필요합니다.
views, 템플리트가 있는 디렉토리. 예: app.set('views', './views')
view engine, 사용할 템플리트 엔진. 예: app.set('view engine', 'pug')
템플릿 엔진 사용법
Application Settings (Express어플리케이션 설정)
Express어플리케이션 설정법~~
app.set("view engine","pug");
-> 현재 작업중인 디렉토리 알아내는 법:
server.js에다가 console.log(process.cwd());를 적어넣음 ctrl+s
-> 현재 작업중인 디렉토리의 기준: nodeJS를 시작하는 곳, 어디서 서버를 기동하는지가 기준임. 여기서는 package.json이 있는 디렉토리가 기준이 됨.
-> 틀: 우선 pug로 파일을 보내고, pug가 이 파일을 렌더링해서 평범한 html로 변환.그러면 유저는 그 변환된 평범한 html을 보게 되는 것임
export const trending = (req,res) => res.render("home");
파일 경로 안 적는 이유: express가 defalut값으로 views라는 파일 경로를 찾을 것이기 때문.(위 문단 3번 참조)
파일 이름에 .pug를 안 붙이는 이유: 어차피 server.js에서 우리가 view로써 pug를 쓸 것임을 미리 알려줬기 때문.
but 위에처럼 적으면 현재 디렉토리가 src가 아니기 때문에
=> Failed to lookup view "home" in views directory "/Users/iwongyu/Desktop/nomadcoder/nomad-wetube/views" 라는 오류가 나올 것임!
=> 따라서 우리는 src폴더 내에 있는 views를 찾도록 설정해줘야함 !
app.set("views",process.cwd() + "/src/views");
-> pug의 진정한 강점. 여러 html(정확히는 pug html)내의 반복되는 코드를 따로 정리해놓아서 사용할 수 있음!
include 경로/파일명
include partials/footer.pug
만 쳐서 넣으면 됨.
but 이마저도 복붙하는게 귀찮음! 더 쉽게 반복되는 코드를 불러오는 방법이 있음!
바로 inheritance(상속)임
-> 일종의 베이스를 만듦. 그러면 모든 파일들이 그 베이스에서부터 확장해 나감.
extends(확장)한다는 것은 베이스가 되는 파일을 가져다가 그대로 쓰는 것임. 즉, 복사본을 만들어 사용하는 것 과 같음
사용하고픈 파일(rendered파일)에서 base가 되는 pug파일의 파일명을 extends하면됨.
extends base.pug
-> 블록은 템플릿의 창문같은 것임, 창문 안에 이것저것 집어 넣을 수 있음. 즉, 그 공간 안에 무언가를 채워 넣을 수 있음.
-> base가 되는 파일 에서 사용하고픈 자리에
block content
이런 식으로 'block 블럭명' 써주면 됨.
즉, base.pug의 코드를 보자면
doctype html
html(lang="ko")
head
title wetube
body
block content
include partials/footer.pug
이런 식으로 나옴. 이렇게 되면 content를 위한 공간(block)이 마련된 거임.
-> base.pug를 extend하는 파일(ex: home.pug) 에서 사용해야됨.
block content
h1 Home!
이런 식으로 "block 블럭명" 한 뒤에 그 안에다가 원하는 태그와 내용을 넣으면 됨.
(block은 안 채워줘도 상관없음)
-> 블럭도 좋긴 하지만 이마저도 코드가 길고 실수할 수 있음. 따라서 우리는 변수를 이용할 것임.
doctype html
html(lang="ko")
head
title #{pageTitle} | WeTube
body
block content
include partials/footer.pug
export const trending = (req,res) => res.render("home",{pageTitle : "Home"});
이런 식으로 res.render("extend하는 pug명",{변수명1 : "Value1", 변수명2:""value2}); 해주면 됨.
h1=pageTitle
=변수명 이런 식으로 써주면 pug는 이걸 변수로 받아들임.