LoginSignup
3
3

More than 3 years have passed since last update.

gulpでTwigレンダリングをなんとかしてみた話

Last updated at Posted at 2017-05-13

追記・更新情報

2019/09/10: gulp4.x系で動くよう修正

まとめ

テンプレートエンジンとしてTwig(をサーバサイドレンダリングする)案件が発生したけれど、
gulpで何とかできないの……?ということで、やってみた手順です。

それらしい情報がなかなか見当たらなかったのですが、
まあbrowser-sync使うにしてもローカルにXMAPP環境作ってproxyした方が早いよねって話ですかね……。
普段PHP触らないコーダーさんに環境をバラ撒く想定だったので、
フロントエンドな人の導入障壁の低そうなgulpで何とかしてみましたよー、というお話。

もろもろ構築済みのものがこちらです。
twig-template

いるもの

packages.json貼った方が早いすね。

packages.json
{
  "dependencies": {
    "browser-sync": "^2.18.8",
    "gulp": "^3.9.1",
    "gulp-twig": "^0.7.0"
  }
}

gulpまわりの動作など

ざっくり言うと

  • gulp-twigでHTMLを生成
  • それをbrowser-syncでリアルタイムプレビューする

という感じです。
下記は説明のためにザックリ抜き出しな感じですが、
必要に応じてsassなりbabelなんなりを追加すればよろしいかと。

gulpfile.js
'use strict';
// settings
const $dist = './dist/';
const $twigSrc = ['./src/twig/**/*.twig'];
const $twigSrc_exclude = ['!./src/twig/**/_*.twig'];
// プレビュー表示用HTMLの生成先
const $htmlRoot = '__html/';

// import common packages
const gulp = require('gulp');
const plumber = require('gulp-plumber');

// twigをコンパイルする
gulp.task('twig', () => {
    const twig = require('gulp-twig');
    const _twigSrc = $twigSrc.concat($twigSrc_exclude);
    const _htmlRoot = $htmlRoot.replace(/\/$/, '');
    const _htmlDist = $dist + _htmlRoot;
    gulp.src(_twigSrc)
    .pipe(plumber())
    .pipe(twig({
        data: $twig_output_data,
        base: $twigBase
    }))
    .pipe(gulp.dest(_htmlDist));

    // twigテンプレートをdistへコピー
    // gulp 4.xではreturn valueが必要なのでひとまずreturnしておく
    return gulp.src($twigSrc).pipe(gulp.dest($dist));
});

gulp.task('server', () => {
    const browserSync = require('browser-sync');
    const _htmlRoot = '/' + $htmlRoot;
    browserSync({
        server: {
            baseDir: $dist,
            directory: false
        },
        middleware: (req, res, next) => {
            if (req.url.match(/\/$/)) {
                req.url = _htmlRoot + req.url.match(/(.*)\/$/)[1] + '/';
            } else if (req.url.match(/html?$/)) {
                req.url = _htmlRoot + req.url;
            }
            return next();
        }
    });

    gulp.watch(`${$dist}**/*.html`).on('change', browserSync.reload);
});

gulp.task('watch', () => {
    gulp.watch($twigSrc, gulp.series(['twig']));
});
gulp.task('default', gulp.parallel('server', 'watch'));

使ってみて

客先の環境のパスが想定と違っていたりで、案件ではちょいとトラブったりしたのですが、
基本的にはこれで問題なしでした。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3