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のほうが強力らしい)慣れれば使えそうなので引き続き使っていきたいとおもいます。