Nunjucksとは?Web制作を加速するテンプレートエンジンの基本と実践的な使い方

Nunjucksとは? Web制作を効率化するテンプレートエンジン

Nunjucks(ナンジャックス)とは、Mozillaが開発したJavaScript製の「テンプレートエンジン」です。Pythonのテンプレートエンジン「Jinja」の影響を受けており、ブロック継承、オートエスケープ、マクロ、非同期制御といった強力な機能を備えています。

Webサイト制作において、ヘッダーやフッターのような共通パーツを管理する場合、これまではPHPのincludeを使って読み込むことが多かったかもしれません。しかしNunjucksを使えば、PHPが動かない環境でも、HTMLをパーツ化・共通化し、効率的にコーディングを進めることができます。

この記事では、Nunjucksの基本的な考え方と、特に便利な「マクロ」や「for文」を使った実践的な記述方法について解説します。

Nunjucksの基本的な使い方(ファイル構成例)

Nunjucksを使った開発では、多くの場合/src/(ソース)ディレクトリ内でファイルを編集し、それがコンパイルされて/dist/(配布)ディレクトリにHTMLファイルとして出力されます。(※GulpやWebpackなどのビルドツールと組み合わせて使うのが一般的です)。

例えば、以下のようなファイル構成で開発を進めるケースが多いです。

  • HTMLの元ファイル: /src/njk/ 配下に、ページの元となる.njkファイル(例: index.njk, about.njk)を作成し、編集します。
  • 共通パーツファイル: /src/njk/_includes/ フォルダ内に、ヘッダー(Header.njk)やフッター(Footer.njk)などの共通パーツを作成し、格納します。
  • CSS(Sass): /src/scss/ 内の.scssファイルを編集します。
  • JavaScript: /src/js/ 内の.jsファイルを編集します。

開発の際は、既存のコアファイル(フレームワークの基本ファイルなど)を直接変更せず、独自のクラス名やファイル・フォルダ構成で完結させるように意識すると、メンテナンス性が高まります。

実践的な記述方法:マクロとfor文

Nunjucksの強力な機能である「マクロ(macro)」と「for文(ループ処理)」を使った実践例を見ていきましょう。ここでは、トップページのスライダーを例に解説します。

1. パーツファイル(マクロ)の定義

まず、/src/njk/_includes/home/Hero.njk のようなパーツファイルで、スライダーのHTML構造を「マクロ」として定義します。マクロとは、再利用可能なHTMLのひな形のようなものです。

{# ▼/src/njk/_includes/home/Hero.njk #}

{# 「Hero」という名前のマクロを定義。propsでデータを受け取る #}
{% macro Hero( props ) %}
<div class="hero-slider">
  
  {# props.list(配列)が渡されたら、for文でループ処理 #}
  {% for item in props.list %}
  <div class="hero-slider__item">
    <picture>
      <source media="(max-width: 767px)" srcset="{{ item.imageS }}">
      <img src="{{ item.image }}" alt="{{ item.alt }}">
    </picture>
  </div>
  {% endfor %}

</div>
{% endmacro %}

このコードでは、propsという引数でデータを受け取り、その中のprops.listという配列をfor文でループさせて、スライド(.hero-slider__item)を必要な数だけ生成しています。

2. 呼び出し元ファイル(本体)での利用

次に、/src/njk/index.njk のようなメインのファイル側で、先ほど定義したマクロを読み込み、データを渡して呼び出します。

{# ▼/src/njk/index.njk #}

{# 1. fromでマクロファイルを読み込み、「Hero」という名前でimportする #}
{% from 'home/Hero.njk' import Hero %}

{# ... (bodyタグなど) ... #}

{# 2. 「Hero」マクロを呼び出し。「list」という名前で配列データを渡す #}
{{ Hero( {
    list: [
      {
          image: '/_dummy-images/hero_01_1280x512.jpg',
          imageS: '/_dummy-images/hero_01_700x900.jpg',
          alt: 'やさしい、冬支度。'
      },
      {
          image: 'https://img.oyamada.ne.jp/1280x513',
          imageS: 'https://img.oyamada.ne.jp/750x900',
          alt: ''
      },
      {
          image: 'https://img.oyamada.ne.jp/1280x513',
          imageS: 'https://img.oyamada.ne.jp/750x900',
          alt: ''
      }
      {# ... 必要なだけスライドデータを追加 ... #}
    ]
} ) }}

このように、HTML構造(マクロ側)とデータ(呼び出し側)を分離することで、データの追加や修正が格段に楽になります。スライドの枚数を変更したい場合も、このlist配列を編集するだけで済みます。

3. マクロに引数を渡す(応用)

マクロには、より柔軟な引数を渡すことも可能です。例えば、共通のページヘッダー(PageHeader.njk)を使いつつ、トップページだけ見出しを<h1>にしたい場合があります。

{# トップページの場合 #}
{{ PageHeader( { asH1: true, title: 'メインタイトル' } ) }}

{# 下層ページの場合 #}
{{ PageHeader( { title: 'サブページのタイトル' } ) }}

パーツファイル(PageHeader.njk)側では、このasH1trueかどうかをif文で判定し、出力するタグを変更する、といった制御が可能です。これにより、パーツの共通性を保ちつつ、ページごとに柔軟な出し分けが実現できます。

まとめ:Nunjucksでコーディングを効率化しよう

Nunjucksを導入することで、HTMLコーディングの「繰り返し」作業を大幅に削減し、コンポーネント(パーツ)ベースの効率的な開発が可能になります。特にマクロとfor文は、更新頻度の高いニュース一覧やスライダーなどで絶大な効果を発揮します。

Webサイト制作の効率化に悩んでいる方は、ぜひNunjucksの導入を検討してみてはいかがでしょうか。

参考リンク


よくある質問(FAQ)

Q1. Nunjucksを使うには、他に何が必要ですか?

A1. Nunjucksは、.njkファイルを.htmlファイルに変換(コンパイル)するプロセスが必要です。そのため、Gulp (gulp-nunjucks-render) や Webpack (nunjucks-webpack-plugin) などのタスクランナーやビルドツールと組み合わせて使用するのが一般的です。

Q2. NunjucksとPug(Jade)やEJSとの違いは何ですか?

A2. これらはすべて人気のテンプレートエンジンですが、構文に大きな違いがあります。Pugはインデント(字下げ)で構造を表現する独自の記法を持つのに対し、NunjucksやEJSはHTMLの構文に近いため、HTMLの知識がある人にとっては学習コストが低いのが特徴です。特にNunjucksは、マクロや継承など、大規模な開発にも耐えうる強力な機能が充実しています。

Q3. PHPでincludeするのと、何が違うのですか?

A3. 最大の違いは「いつ実行されるか」です。Nunjucksは開発時(ビルド時)に実行され、**静的なHTMLファイル**を生成します。一方、PHPのincludeは、ユーザーがWebサイトにアクセスした際(リクエスト時)に**サーバー側で実行**され、動的にHTMLを結合します。Nunjucksで生成されたサイトは静的HTMLのため、表示速度が速く、サーバー負荷が低いというメリットがあります。

CONTACT

webサイト制作、デザインに関するご相談、御見積のご依頼など、弊社へのお問い合わせはこちら