[ PUG ] PUG 사용 및 여러 기능 ( iteration, inheritance, partials, mixins )

     

    pug

    pug란 express 뷰 엔진으로 html을 좀 더 보기 좋게 사용할 수 있게 하는 템플릿 언어, express 뷰 엔진이다.

    사용을 위해서는 아래의 명령어를 터미널에서 실행시켜줘야한다.

    npm i pug

     

    그 이후엔 아래의 코드를 파일에 삽입해야 view engine이 pug로 설정된다.

    app.set("view engine","pug");

     

     


     

    그렇다면 우리가 알던 html코드와 pug코드의 차이점은 무엇일까?

     

    평소 우리가 알던 html은 아래와 같이 작성하는데

    <body>
    	<div>
        	<h1>Hello</h1>
            <p>this is a html file<p>
    	</div>
    </body>

     

    pug를 사용한다면 아래와 같이 작성된다.

    <>를 사용하지 않아도 되며 부모자식 관계는 들여 쓰기로 사용한다.

    body
    	div
        		h1 hello
           		p this is a pugfile

     

     


     

     

    물론 pug를 사용하지 않을 수 있지만

    pug는 다양한 기능이 존재하고 이는 매우 편리하다.

     

     

    기능 1) if문, 삼항연산자등 js코드를 html코드에서 사용이 가능하다.

    원래 html 파일에선 js에서 사용할 수 있던 문법을 사용할 수 없었지만 pug에선 가능하다.

    //if-else
    	if video.views==1
            h3 #{video.views}view
        else    
             h3 #{video.views} views
             
    //삼항연산자         
        h3 #{video.views} #{video.views === 1 ? "view":"views" }

     

     


     

    기능 2) iteration 

    array의 모든 element에 대해 특정 코드가 취해져야 할 때 사용한다.

    each item in array로 array 변수는 꼭 존재해야 하며 item이 없는 경우를 대비해 else 문을 사용할 수 있다. 

     

    아래의 코드를 본다면 videos 객체 배열 속 객체 하나를 video 변수에 담고 객체값이 있을 경우 h4, h5를 각각 보여주고 있다.

    또한 videos가 비어있다면 else를 통해 이를 알릴 수 있다.

    block content
        each video in videos
            div 
                h4 #{video.title}
                h5 date of creation : #{video.createdAt}
        else 
            div Sorry nothing found

     

     


     

    기능 3) inheritance

     

    원래의 경우 html파일마다 기본적인 틀 ( !doctype, head, body) 을 하나하나 작성하거나 복붙 했었을 것이다.

    그러나 pug를 사용한다면 베이스가 될 파일에 뼈대를 구축하고 별도로 추가해야 할 공간은 block으로 선언하여

    새로 만들어갈 페이지에 베이스 파일을 상속받아 block부분에 대한 코드만 작성하면 된다.

     

    특히 head의 내용을 변경할 때 html 파일마다 head를 고치지 않고 베이스 파일에 있는 head만 수정하면 되니 편리하다.

    아래와 같이 base.pug로 뼈대를 구축하고 home.pug에선 base.pug를 extends 한 뒤 block에 들어갈 내용만 작성하면 된다.

     

    //base.pug
    doctype html
    html(lang=ko)
        head 
        link(rel="stylesheet" href="https://unpkg.com/mvp.css@1.12/mvp.css")
        body 
            header
                h3 Hello #{user.name}
                nav 
                    ul 
                        li
                            if(user.logged)
                                 a(href="/login") LOGOUT
                            else
                                 a(href="/login") LOGIN
            main
                block content
    //home.pug
    extends base
    
    block content
        div this is a home.pug file

     

     

    이렇게 되면 pug가 파일을 렌더링시에 home에서 작성한 block의 내용을 base파일에 넣어 완전한 home파일을 만들어준다.

     

     


     

    기능 4) partials

     

    위의 경우 앞으로 만들어갈 모든 페이지의 기본 틀을 만들어놓고 파일에 extends 하여 사용하는 방식이었다면

    partials는 기본 틀 중에 일부분(header나 footer)을 나누어 파일에 별도로 관리하는 방식이다.

    이렇게 되면 더욱 깔끔하고 관리하기 용이하다.

     

     

    아래와 같이 footer.pug를 만들어 별도로 코드를 작성한 뒤

    footer &copy #{new Date().getFullYear()} partials test

     

     

    필요한 부분에 include 하면 그곳에 위의 코드가 삽입되어 렌더링 된다.

    doctype html
    html(lang=ko)
        head 
        body 
            header
                h3 Hello #{user.name}
                nav 
                    ul 
                        li
                            if(user.loggined)
                                 a(href="/login") LOGIN
                            else
                                 a(href="/login") LOGOUT
                                 
            include partials/footer

     


     

    기능 5) mixins

    mixins는 재사용 가능한  블럭을 만드는 것으로

    일부분의 코드를 별도로 관리하며 필요할 때 가져와 사용하는 것이라면 partials와 비슷하다 생각할 수 있지만 

    partials는 기본적인 뼈대를 구축해 나가는 데에 사용되고 mixins는 어디에서나 필요할 때마다 가져다 쓸 수 있는 것이 차이점이다.

     

    예를 들어 수많은 비디오 데이터를 가져와 똑같은 템플릿을 적용시켜야 할 때  데이터 수만큼 템플릿 전부를 복붙 하는 게 아닌

    템플릿을 짧은 코드로 변환시켜 그 코드를 사용하는 것이다.

     

     

    아래의 코드를 보며 이야기해 보자면

     [ mixin mixin명(매개변수) ] 의 형태로 선언하여 mixins 템플릿을 만든다.

    //video.pug
    mixin video(data)
        div 
            h4 #{data.title}
            h5 date of creation : #{data.createdAt}

     

    그리고 mixins을 사용하고 싶은 파일에 include를 하고 원하는 위치에 +mixins명(인수값) 으로 불러오면 된다.

    //home.pug
    extends base
    include mixins/video.pug
    
    block content
        each video in videos
            +video(video)

     

     


     

    댓글