gulp-nunjucks-renderでNunjucksをgulpでコンパイルする方法

Nunjucksの基本的な使い方 -extends,block,include-で紹介したNunjucksgulpでコンパイルする方法を紹介します。

gulpの基本的な使い方についてはgulp|gulpの基本的な使い方で紹介しています。

gulp-nunjucks-render

今回はgulp-nunjucks-renderを使用します。

まずは、コマンドラインでgulp-nunjucks-renderをインストールします。

$ npm install --save-dev gulp-nunjucks-render

gulpのタスクは下記のように定義します。

var gulp = require('gulp');
var nunjucksRender = require('gulp-nunjucks-render'); //gulp-nunjucks-renderを参照します

gulp.task('compile', function(){
  gulp.src(['src/**/*.njk',
            '!src/**/_*.njk'])
    .pipe(nunjucksRender())
    .pipe(gulp.dest('dst'));
});

ファイル指定時に!src/**/_*.njkとし、ファイル名の先頭に_の付いているファイルは対象外としています。

extendsされるベースファイルやincludeされるファイルは対象外とするためです。(ベースファイルやincludeされるファイルのhtmlファイルは作成しない)

相対パス

例えばsrc/nunjucks/test.njkのファイル内でsrc/include/_include.njkincludeする場合、{% include '../include/_include.njk' %}となります。

また、src/nunjucks/test/test.njkのファイル内でsrc/include/_include.njkincludeする場合、{% include '../../include/_include.njk' %}となります。

上記のように、他のファイルをincludeしたりextendsしたりする場合、ファイルを指定するときは自分自身のファイルの相対パスとなるので、階層の違う複数のnunjucksファイルだと、同じファイルをincludeする場合でも、それぞれのファイルで異なるファイルパスを指定しなければなりません。

以下のようにconfigureを指定すれば、すべてのファイルの相対パスが、指定したパスになります。

var gulp = require('gulp');
var nunjucksRender = require('gulp-nunjucks-render'); //gulp-nunjucks-renderを参照します

gulp.task('compile', function(){
  nunjucksRender.nunjucks.configure('src/'); //相対パスを指定
  gulp.src(['src/**/*.njk',
            '!src/**/_*.njk'])
    .pipe(nunjucksRender())
    .pipe(gulp.dest('dst'));
});

上記のように相対パスを指定しておけば、src/include/_include.njkincludeする場合はどの階層のファイルでも{% include 'include/_include.njk' %}とすればよくなります。

追記

最新のバージョンでは、以下のように相対パスを設定します。

var gulp = require('gulp');
var nunjucksRender = require('gulp-nunjucks-render'); //gulp-nunjucks-renderを参照します

gulp.task('compile', function(){
  gulp.src(['src/**/*.njk',
            '!src/**/_*.njk'])
    .pipe(nunjucksRender({path:'src/'})) //相対パスを指定
    .pipe(gulp.dest('dst'));
});

gulp-data

gulp-dataと組み合わせると、引数のような形で各ファイルにデータ(変数など)を渡すことができます。各ファイルでは、渡された変数を元にhtmlをコンパイルすることができます。

var gulp = require('gulp');
var nunjucksRender = require('gulp-nunjucks-render');
var data = require('gulp-data'); //gulp-dataを参照します

gulp.task('compile', function(){
  var params ={
      param1:'パラメータ1',
      param2:'パラメータ2'
    };
  nunjucksRender.nunjucks.configure('src/'); //相対パスを指定
  gulp.src(['src/**/*.njk',
            '!src/**/_*.njk'])
    .pipe(data(params)) //パラメータを指定します
    .pipe(nunjucksRender())
    .pipe(gulp.dest('dst'));
});

Nunjucksファイルで渡された変数を出力することができます。

p1.njk
<!DOCTYPE HTML>
<html>

<head>
  <title>サンプルホームページ</title>
</head>

<body>
  {{ param1 }} <!-- "パラメータ1"と出力されます -->
  {{ param2 }} <!-- "パラメータ2"と出力されます -->
</body>
</html>

関連記事

  • テンプレートエンジンのnunjucksとhighlight.js組み合わせる

    便利なテンプレートエンジンのnunjucksのテンプレートの中で、コードをシンタックスハイライト(色付け)する便利なライブラリのhighlight.jsを組み込む方法を紹介します。nunjucksのコ...


  • Nunjucksで独自のファンクションを実行する

    Nunjucksのテンプレートファイルに独自に定義した別ファイルのファンクションを実行する方法を紹介します。gulpでコンパイルする場合を想定しています。gulp-nunjucks-renderでNu...


  • Nunjucksの基本的な使い方 -extends,block,include-

    htmlのおすすめテンプレートエンジンNunjucksがとても便利なのですが、日本語のページがほとんど見当たらなかったので、基本的な使い方を紹介します。ホームページを作成していると、htmlのヘッダと...


  • Front Matterでファイルごとに変数を持たせる

    ejsやnunjucksなどのテンプレートエンジンを使用して、ホームページやブログを作成している場合、共通のテンプレートファイルに変数などを定義しておき、各ファイルではその変数に値をセットして、htm...


  • watchifyとgulpで自動コンパイルと差分更新をおこなう

    vuejsの開発環境を構築するでvueをビルドする環境を作成しました。今回は開発環境をさらに便利にするために、ファイルが変更されたら自動でビルドを実行し、ブラウザをリロードする処理を実装します。開発用...


  • swig|htmlのヘッダ・フッタの共通化などで実装を効率化する

    swigでhtmlの実装すれば、htmlのヘッダーやフッターの共通化などができ、htmlの管理・実装の効率が格段に上がります。swigとは、テンプレートエンジンの1つで、htmlの中に変数やif文やf...


  • 拡張メタ言語を使用して静的ホームページを簡単に作成する

    ちょっとしたホームページやブログを作成するとき、どのように作成しているでしょうか?最初はhtmlやcssをそのままテキストエディタなどで書いて作成していたが、ページ数が多くなるにつれ管理が大変になり、...


  • npmのpackage.jsonを最新のバージョンに更新する

    package.jsonのパッケージを最新のバージョンに更新する方法を紹介します。npmは以下のコマンドを実行すれば、package.jsonに記載されているバージョンに更新されます。最新のバージョン...


  • less|cssに変数を使い実装を効率化する方法

    ホームページを作っていて、規模が大きくなっていくにつれ、気をつけていてもcssのソースはグチャグチャになってしまい、後で見返したときに「これはどこのスタイルだっけ?」となってしまうことがあると思います...


  • gulpの便利なタスク gulpfile.jsの記述例

    gulpの便利なおすすめプラグインで紹介したプラグインなどを利用したgulpの便利なタスクの実装例を紹介します。less,js,htmlのコンパイルや軽量化、watchとlivereload、エラー時...