Nunjucks を使ってみる

JavaScript製のHTMLテンプレート Nunjucks を初めて使ったのでメモ書きしておきます。
タスクランナーはGulp使ってます。
各ページ共通のhtmlの骨格をつくる
head.njk, header.njk, footer.njk の3つのファイルはまた別ファイルになりますが、各ページ共通の骨格を作るには default.njk と index.html に次のように書く。
index.html
{% extends '_module/layout/default.njk' %}
{% block content %}
<!-- ここに書く内容が `<main class="main">` と `</main>` の間に挿入される -->
{% endblock %}
_module/layout/default.njk
<!DOCTYPE html>
<html lang="ja-jp">
{% include "_module/common/head.njk" %}
<body>
{% include "_module/common/header.njk" %}
<main class="main">
{% block content %}{% endblock %}
</main>
{% include "_module/common/footer.njk" %}
</body>
</html>
変数で値を渡す
set hoge = で変数を宣言する。
ページタイトルやmeta系の記述などで使う場合
index.html (各ページ設定)
{%
set page = {
name: 'トップページ'
}
%}
{% include "_module/common/head.njk" %}
_module/common/head.njk
{%
set site = {
name: 'サイトタイトル'
}
%}
<head>
<title>{{ page.name }} | {{ site.name }}</title>
</head>
マクロと引数を使う
マクロと引数を使うと値を渡してHTMLを生成できる
index.html
{%- import '_module/component/button.njk' as macro -%}
{{ macro.button( type='primary', label='ボタンのラベル名', href='https://www.yahoo.co.jp/', blank=true, class='hoge' ) }}
呼び出し側(button.njk)にはデフォルトの引数(引数が空だった場合に入る値)をいれておく
_module/component/button.njk
{% macro button( type='primary', label='ボタン', href='#', blank=false, class='' ) -%}
<p class="button button--{{ type | safe }}{{ ' ' + class if class }}">
<a class="button__anchor" href="{{ href }}"{{ ' target="_blank"' | safe if blank }}>{{ label }}</a>
</p>
{%- endmacro %}
if を使って分岐や | safe を使ってフィルターがある。
フィルターはいろいろ用意されているので下記を参照
参考: https://mozilla.github.io/nunjucks/templating.html
ループを使う
パンくずを作ってみる
おもに 詳解 Nunjucks − Mozilla 謹製テンプレートエンジン - Qiita のコピペですが、パンくずも下記のように作成できます。
index.html
{%
set breadcrumbs = [
{
item: '親ページ名',
href: '/parent/'
},
{
item: '子ページ名'
}
]
%}
{% include '_module/component/breadcrumb.njk' %}
_module/component/breadcrumb.njk
<div class="breadcrumb">
<ol class="breadcrumb__list">
<li class="breadcrumb__item">
<a class="breadcrumb__anchor" href="/">
<span class="breadcrumb__label">トップページ</span>
</a>
</li>
{%- for breadcrumb in breadcrumbs %}
<li class="breadcrumb__item">
{%- if loop.last %}
<span class="breadcrumb__label">{{ breadcrumb.item }}</span>
{%- else %}
<a class="breadcrumb__anchor" href="{{ breadcrumb.href }}">
<span class="breadcrumb__label">{{ breadcrumb.item }}</span>
</a>
{%- endif %}
</li>
{%- endfor %}
</ol>
</div>
いまのところ正直EJSとの違いを実感できていませんが(Nunjucksのほうが強力らしい)慣れれば使えそうなので引き続き使っていきたいとおもいます。