追記・更新情報
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'));
使ってみて
客先の環境のパスが想定と違っていたりで、案件ではちょいとトラブったりしたのですが、
基本的にはこれで問題なしでした。