풀스택 맛보기6-PUG
PUG
- pug에 간단하게 작성하면 html로 변환해준다.
- 템플릿을 이용하여 View 만드는것을 돕는다.
🔧 npm install pug
express에게 pug 사용을 알려주기.
server.js에 추가 app.set("view engine", "pug");
pug 파일 생성
예시. src/views/home.pug 파일 생성 doctype html
html(lang="ko")
head
title Welcome:)
body
h1 Hello
footer © Agora Ἀγορά
⭐ 작성 시 주의사항 ⭐
- 모든건 소문자로 작성
- 속성은 괄호안에 작성
- 2칸 혹은 탭을 이용하여 부목 속성보다 안쪽에 작성
render
export const trending = (req, res) => res.render("home");
❗ 디렉토리 위치 에러 ❗ src/views를 찾아야 하지만 프로젝트 최상위 폴더에서 views를 찾고 있다.
=> 현재 작업하는 디렉토리(cwd)를
cwd(current working directory)
- 현지 작업중인 폴더로 어디서 노드를 부르고 있는지에 따라 결정된다.
현재 package.json에서 node.js를 실행하고 있기에 여기가 cwd가 되는 것이다.
해결법
app.set("view engine", "pug");
app.set("views", process.cwd() + "/src/views");
=> 위의 코드로 cwd를 설정하여 프로젝트의 views의 경로를 알려주고 문제를 해결할 수 있다.
Partial
- 반복되는 부분을 따로 만들어 삽입할 수 있다.
footer 삽입 예시.
- footer.pug 파일 생성 후 반복하고 싶은 내용 추가
footer © #{new Date().getFullYear()} Ἀγορά - 보여지고 싶은 페이지에 include [경로]를 통해서 삽입
doctype html html(lang="ko") head title Ἀγορά : body h1 Hello include partials/footer.pugExtending Templates
base.pug 파일 생성 후 반복될 코드 작성
doctype html
html(lang="ko")
head
title Ἀγορά :
body
h1 Hello
include partials/footer.pug
home.pug 파일에 작성
extends base.pug
Block
- 반복되는 걸 전부 가져온다면 모두다 같은 페이지가 되기 떄문에
원하는 부분만 바뀔 수 있도록 block을 사용한다.
block [block 이름]
base.pug에 content라는 block 생성
doctype html
html(lang="ko")
head
title Ἀγορά :
body
block content
include partials/footer.pug
home.pug에 생성된 block content 아래 보여지고 싶은 것을 작성
extends base.pug
block content
h1 Home
block script
=> base.pug는 큰 틀이 되고 block content의 내용을 바꾸면 페이지마다 다른 문구를 보여줄 수 있다.
Variable to Templates
- 템플릿에 변수 보내기
Page Title을 Home으로 선언하기
export const trending = (req, res) => res.render("home", { pageTitle: "Home" });
=> home.pug의 pageTitle은 Home이라는 문자열을 갖게 된다.
Conditional
h1=pageTitle // 변수로 인식함, 태그에 하나의 변수만 넣는 경우 사용 h1 #{pageTitle} //변수로 인식함 h1 pageTitle //문자로 인식함
Iteration
- elements의 list를 보여준다.
- 임시 게시글(숫자)을 배열에 넣고 render 시킨다.
export const trending = (req, res) => { const posts = [1, 2, 3, 4, 5]; return res.render("home", { pageTitle: "Ἀγορά", fakeUser: fakeUser , posts:posts}); }; - 배열의 요소를 차례대로 나열한다.
ul each post in posts li=post - 결과
• 1 • 2 • 3 • 4 • 5
Mixin
- partial과 비슷하지만 데이터를 받을 수 있는 HTML block이다.
변경 전 views/home.pug
extends base.pug
block content
h3 주요 뉴스
each p in posts
div
h4=p.title
ul
li 조회수 #{p.views}
li 댓글 #{p.comments }
li #{p.createdAt}
else
h4 게시글이 존재하지 않습니다.
mixin을 사용할 파일 생성
views/home.pug
extends base.pug
block content
h3 주요 뉴스
each p in posts
+post(p)
else
h4 게시글이 존재하지 않습니다.
views/mixins/post.pug
mixin post(info)
div
h4=info.title
ul
li 조회수 #{info.views}
li 댓글 #{info.comments }
li #{info.createdAt}
=> home.pug의 p가 post.pug의 info에게 값은 전달한다.
=> HTML을 return 해주는 일종의 함수를 갖게 되었고
생성된 mixin은 필요한 여러 곳에서 사용할 수 있다.
Continue with Router
참고