基本的にはHTMLタグで記述して、一部だけPugのインクルードの機能などを使いたいということがあったので、可能かどうか試してみました。
サンプルコード
まずはGulpの環境を用意します。
プロジェクトのディレクトリに移動して、package.jsonを作成します。
cd プロジェクトディレクトリのパス npm init
今回使用するgulp、gulp-pug、gulp-plumberをインストールします。
npm install gulp gulp-pug gulp-plumber --save-dev
gulpfile.jsを作成して、以下のように記述します。
gulpfile.js
var gulp = require('gulp'),
plumber = require('gulp-plumber'),
pug = require('gulp-pug');
gulp.task('pug', function() {
return gulp.src(['pug/**/*.pug', '!pug/**/_*.pug'])
.pipe(plumber())
.pipe(pug({
pretty: true,
basedir: './pug'
}))
.pipe(gulp.dest('./'));
});
pugディレクトリ内のPugファイルをコンパイルして、プロジェクトルートにHTMLファイルを生成する想定です。
pugディレクトリと_includeディレクトリを作成して、その中に共通で使用するテンプレートファイルを作成します。
まずはページ全体のレイアウト用の_layout.pugですが、各共通ファイルをインクルードするのでPugの記法で記述します。
pug/_include/_layout.pug
block variables
doctype html
html(lang="ja")
head
block head
include /_include/_head.pug
body
block header
include /_include/_header.pug
.contents
block content
block footer
include /_include/_footer.pug
次にheadの内容になる_head.pugですが、各ページでtitleとdescriptionを設定できるように一部だけPugの記法にしてみます。
pug/_include/_head.pug
<meta charset="utf-8">
title #{pageTitle}
meta(name="description" content=pageDescription)
<meta name="viewport" content="width=device-width, initial-scale=1.0">
残りの_header.pugと_footer.pugはHTMLタグで記述します。
pug/_include/_header.pug
<header> <p>ヘッダーです</p> </header>
pug/_include/_footer.pug
<footer> <p>フッターです</p> </footer>
これで共通部分のテンプレートファイルの用意ができました。
次にこれらのテンプレートを使用するファイルを作成します。
pug/index.pug
extends /_include/_layout.pug
append variables
-
var pageTitle = 'ページタイトル';
var pageDescription = 'ページ説明文';
block content
<div class="test">
<p>コンテンツ内容です。</p>
ul
- for (var x = 0; x < 3; x++)
li item#{x}
</div>
_layout.pugの継承とtitleなどの変数宣言はPugの記法ですが、コンテンツ部分は基本HTMLタグでの記述にして、一部動作テスト用にPugのfor文も入れています。
Pugファイルの用意が一通り完了しましたので、コンパイルを実行します。
gulp pug
以下のように意図した形にコンパイルできました。
(見やすいように改行位置やインデントなど調整しています。)
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>ページタイトル</title>
<meta name="description" content="ページ説明文">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<header>
<p>ヘッダーです</p>
</header>
<div class="contents">
<div class="test">
<p>コンテンツ内容です。</p>
<ul>
<li>item0</li>
<li>item1</li>
<li>item2</li>
</ul>
</div>
</div>
<footer>
<p>フッターです</p>
</footer>
</body>
</html>
拡張子の変更
拡張子を.pugから.htmlに変更しても、意図した形にコンパイルできるか試してみます。
gulpfile.jsを以下のように変更します。
gulpfile.js
var gulp = require('gulp'),
plumber = require('gulp-plumber'),
pug = require('gulp-pug');
gulp.task('pug', function() {
return gulp.src(['pug/**/*.html', '!pug/**/_*.html'])
.pipe(plumber())
.pipe(pug({
pretty: true,
basedir: './pug'
}))
.pipe(gulp.dest('./'));
});
コンパイル対象の拡張子を.htmlに変更しました。
次に各pugファイルの拡張子とコードを変更します。
pug/_include/_layout.html
block variables
doctype html
html(lang="ja")
head
block head
include /_include/_head.html
body
block header
include /_include/_header.html
.contents
block content
block footer
include /_include/_footer.html
_layout.pugはファイルの拡張子と読み込んでいる各テンプレートファイルの拡張子を変更しました。
_head.pugと_header.pug、_footer.pugは拡張子のみ変更します。
次にindex.pugの拡張子を変更します。
pug/index.html
extends /_include/_layout.html
append variables
-
var pageTitle = 'ページタイトル';
var pageDescription = 'ページ説明文';
block content
<div class="test">
<p>コンテンツ内容です。</p>
ul
- for (var x = 0; x < 3; x++)
li item#{x}
</div>
継承するテンプレートファイルの拡張子も変更しています。
これでコンパイルを再度実行してみます。
gulp pug
特にエラーも出ないでコンパイルできましたが、以下のようにPug記法の一部が意図した形になっていませんでした。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
title #{pageTitle}
meta(name="description" content=pageDescription)
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<header>
<p>ヘッダーです</p>
</header>
<div class="contents">
<div class="test">
<p>コンテンツ内容です。</p>
<ul>
<li>item0</li>
<li>item1</li>
<li>item2</li>
</ul>
</div>
</div>
<footer>
<p>フッターです</p>
</footer>
</body>
</html>
pug/_include/_layout.html
block variables
doctype html
html(lang="ja")
head
block head
include /_include/_head.pug
body
block header
include /_include/_header.html
.contents
block content
block footer
include /_include/_footer.html
_layout.pugはファイルの拡張子と読み込んでいる各テンプレートファイルの拡張子を変更しました。
_head.htmlは拡張子のみ変更して、再度コンパイルを実行してみます。
gulp pug
この場合は最初と同様、意図した形でコンパイルできました。
index.html
<!DOCTYPE html>
<html lang="ja">
<head><meta charset="utf-8">
<title>ページタイトル</title>
<meta name="description" content="ページ説明文">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<header>
<p>ヘッダーです</p>
</header>
<div class="contents">
<div class="test">
<p>コンテンツ内容です。</p>
<ul>
<li>item0</li>
<li>item1</li>
<li>item2</li>
</ul>
</div>
</div>
<footer>
<p>フッターです</p>
</footer>
</body>
</html>
場合にもよりますが拡張子をhtmlとしたい場合、共通テンプレートとして使用するファイルはpug、各ページで使用するファイルはhtmlとするルールがよさそうです。
コメントが承認されるまで時間がかかります。