Guidebook
ComponentsStorybook

Gulp · Nunjucks

Nunjucks 템플릿 문법

출력과 제어문부터 layout, include, macro를 이용한 component 재사용 구조까지 정리합니다.

출력과 제어문

{{ }}는 값을 출력하고 {% %}는 조건과 반복 같은 제어문을 실행합니다. {# #}는 결과 HTML에 남지 않는 주석입니다.

nunjucks{% set pageTitle = title or 'Guide' %}
<h1>{{ pageTitle | escape }}</h1>

{% if loading %}
  <p role="status">불러오는 중입니다.</p>
{% elif error %}
  <p role="alert">오류가 발생했습니다.</p>
{% else %}
  <ul>
  {% for item in items %}
    <li>{{ loop.index }}. {{ item.label | escape }}</li>
  {% else %}
    <li>항목이 없습니다.</li>
  {% endfor %}
  </ul>
{% endif %}

상속과 include

nunjucks{# templates/layouts/default.njk #}
<!doctype html>
<html lang="ko">
  <body>{% block content %}{% endblock %}</body>
</html>
nunjucks{# pages/index.njk #}
{% extends "templates/layouts/default.njk" %}
{% set title = "Gulp" %}

{% block content %}
  {% include "templates/partials/header.njk" %}
  <main><h1>{{ title }}</h1></main>
{% endblock %}

공통 골격은 extends와 block, 여러 페이지에서 반복되는 작은 조각은 include로 분리합니다.

기본 요소와 레이아웃 페이지 생성

Gulp에서는 src/pages 아래 Nunjucks 파일 하나가 build 결과의 HTML page 하나가 됩니다. 두 component 분류를 실제 page로 제공하려면 다음처럼 source를 만듭니다.

textapps/gulp/src/pages/components/
├── basic.njk   → dist/components/basic.html
└── layout.njk  → dist/components/layout.html
nunjucks{# src/pages/components/basic.njk #}
{% extends "templates/layouts/default.njk" %}

{% block content %}
  <main class="guide_content">
    <h1>기본 요소</h1>
    {% include "components/basic/Button/button.njk" %}
  </main>
{% endblock %}

현재 gulpfile.js의 src('src/pages/**/*.njk') glob이 하위 directory를 포함하므로 별도 route 배열은 필요하지 않습니다. BrowserSync의 root는 dist이므로 결과 page는 /components/basic.html, /components/layout.html에서 확인합니다. 확장자 없는 URL이 필요하면 hosting rewrite 또는 directory별 index.njk 정책을 정해 모든 page에 일관되게 적용합니다.

컴포넌트 macro

nunjucks{% macro button(label, variant='filled', disabled=false) %}
<button
  class="btn btn_{{ variant }} color_primary"
  type="button"
  {% if disabled %}disabled{% endif %}
>
  <span class="btn_label">{{ label | escape }}</span>
</button>
{% endmacro %}
nunjucks{% from "components/button.njk" import button %}
{{ button('저장') }}
{{ button('삭제', variant='outline', disabled=true) }}

외부 입력은 escape 처리하고 신뢰할 수 없는 값에 safe를 사용하지 않습니다. Nunjucks는 사용자 작성 template을 안전하게 실행하는 sandbox가 아니므로 template 소스 자체를 사용자 입력으로 받지 않습니다.

문서 안내

가이드북소개기초디자인 토큰기초접근성컴포넌트기본 요소컴포넌트레이아웃컴포넌트폼컴포넌트네비게이션컴포넌트데이터 표시컴포넌트피드백컴포넌트기타활용 가이드UI 패턴활용 가이드작성 지침프레임워크프레임워크 구현프레임워크Gulp프레임워크GulpGulp 시작프레임워크GulpGulp 기본 설정프레임워크GulpGulp 기본 API프레임워크GulpHTML 편집 (Gulp NJK)프레임워크GulpWeb Server & Watching Files프레임워크GulpAssets 세팅프레임워크Gulp배포 (Deploying)프레임워크Vue프레임워크Vue빠른 시작프레임워크Vue핵심 기초프레임워크Vue상태와 반응성프레임워크Vue컴포넌트 심화프레임워크Vue페이지와 라우팅프레임워크Vue재사용성프레임워크Vue내장 컴포넌트프레임워크Vue확장하기프레임워크Vue베스트 프랙티스프레임워크VueTypeScript프레임워크Vue추가 주제프레임워크React프레임워크React빠르게 시작하기프레임워크ReactUI 표현프레임워크React조건과 목록프레임워크React상호작용프레임워크React페이지와 라우팅프레임워크ReactState 관리프레임워크React탈출구프레임워크ReactReact로 사고하기프레임워크WebSquare프레임워크WebSquare스튜디오프레임워크WebSquare화면과 이벤트프레임워크WebSquare컴포넌트프레임워크WebSquareDataCollection프레임워크WebSquareSubmission프레임워크WebSquare사용하기프레임워크WebSquareSP5 설정프레임워크WebSquare심화 가이드프레임워크Svelte프레임워크Svelte빠른 시작프레임워크Svelte핵심 기초프레임워크Svelte상태와 반응성프레임워크Svelte컴포넌트 심화프레임워크Svelte페이지와 라우팅프레임워크SvelteTypeScript프레임워크Svelte베스트 프랙티스프레임워크SolidJS프레임워크SolidJS빠른 시작프레임워크SolidJSUI 표현프레임워크SolidJSSignals와 Effects프레임워크SolidJS컴포넌트 심화프레임워크SolidJS페이지와 라우팅프레임워크SolidJS베스트 프랙티스프레임워크Qwik프레임워크Qwik빠른 시작프레임워크Qwik컴포넌트프레임워크Qwik상태와 반응성프레임워크Qwik페이지와 라우팅프레임워크Qwik베스트 프랙티스프레임워크Remix프레임워크Remix빠른 시작프레임워크RemixUI 표현프레임워크Remix페이지와 라우팅프레임워크RemixLoader와 Action프레임워크Remix베스트 프랙티스프레임워크Angular프레임워크Angular빠른 시작프레임워크Angular핵심 기초프레임워크Angular상태와 반응성프레임워크Angular컴포넌트 심화프레임워크Angular페이지와 라우팅프레임워크AngularTypeScript프레임워크Angular베스트 프랙티스프레임워크Astro프레임워크Astro빠른 시작프레임워크Astro페이지와 라우팅프레임워크AstroIslands프레임워크Astro컴포넌트 통합프레임워크Astro베스트 프랙티스