効率的にHTMLを生成できるPugの特徴や記述方法

PugはHTMLを生成するためのテンプレートエンジンで、ものすごくざっくり言うとSassのHTML版です。好き嫌いが別れたり、使い所も考える必要がありますが、今回はPugの特徴や記述方法についてまとめておきます。
Pugの特徴
Pugの特徴をまとめると下記のようになります。
- 閉じタグが不要
- 山括弧<>も不要
- インデントで構造を管理
- ファイルの分割ができる
- 変数が使える
- if文やfor文が使える
閉じタグが無い変わりにインデントがかなり重要になってきます。
そのため、普段からインデントを付けながら書いている人であれば、単純に書く文字数が減ります(その辺りの設定が甘い人が触ろうとすると、インデント調整の時間が長くなってしまいます)。
Pugの使い方
基本的な書き方
基本的な書き方は下記の通りです。
- 階層ごとにインデントを付けて書いていく
- 要素名はそのまま書く
- divの場合は要素名の省略が可能
- classには「.(ピリオド)」、idは「#(ハッシュ記号)」の後に記述する
- 特定要素にclassを付けたい場合は、要素の後にclass名を記述する
- テキストは要素の後に半角スペースを空けてから入力する
- 最後に「.(ピリオド)」だけを入力しておくと、次のインデントは文字列として出力される
- 属性名は丸括弧の後に入力する
コンパイル前doctype html
html(lang="ja")
head
meta(charset="utf-8")
title Pugのサンプル
style(src="css/style.css")
body
header
h1 Pugのサンプル
ul.nav
li サンプル
li サンプル
main
section
p テキストテキストテキスト
a.btn(href="#") ボタンコンパイルすると下記のようになります。
コンパイル後<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Pugのサンプル</title>
<style src="css/style.css"></style>
</head>
<body>
<header>
<h1>Pugのサンプル</h1>
<ul class="nav">
<li>サンプル</li>
<li>サンプル</li>
</ul>
</header>
<main>
<section>
<p>テキストテキストテキスト</p><a class="btn" href="#">ボタン</a>
</section>
</main>
</body>
</html>ファイルの分割管理
複数ページのHTMLを作る時に、ヘッダーやフッターなどの共通部分を分割しておけます。
そうしておくことで、後で修正があった時に1つのファイルを修正するだけで、修正が反映されます。
分割して作成したPugファイルを、includeを使って読み込みます。
include 分割したファイル名.pug実際の使用例は下記のようになります。
index.puginclude common/_header.pug
main
.wrap
p サンプル
include common/_footer.pug変数を使う
変数を使うことで、後から一括で修正ができます。宣言の仕方は1つですが、使う時に色んな書き方があるので注意が必要です。
// 変数の宣言
- var 変数名 = 値;
//変数の使用
p #{変数名} //通常の使用方法
a(href=変数名) //属性内で使用する場合
a(href=`${変数名}`) //バッククォートを使用する場合実際の使用例は下記のようになります。
コンパイル前- var btnLabel = "詳しくはこちら";
section.about
p.
テキスト
a(href="#") #{btnLable}
section.feature
p.
テキスト
a(href="#") #{btnLabel}また、ブラケットで囲むと配列を作成できます。for文やeach文を使う時にはこの配列を使用します。
- var list = ['text1', 'text2', text3];if文を使う
例えば「トップページには特定のclassを付けるけど、下層ページには付けない」のような条件分岐が可能です。
- var page = 'top';
if page == 'top'
p トップページです
else if page == 'about'
p アバウトページです
else
p #{page}ページですちなみにifの代わりにunlessを使うと、否定(if !条件と同じ)の意味になります。
for文を使う
同じようなHTMLのタグを繰り返す時は、for文を使うことで、コードをすっきり書けます。
コンパイル前- for (var x = 0; x < 5; x++)
li item-#{x}コンパイル後<li>item-0</li>
<li>item-1</li>
<li>item-2</li>
<li>item-3</li>
<li>item-4</li>each文を使う
配列要素ごとに繰り返しをしたい時はeach文を使用します。
文法はeach 変数 in 配列の形です。
コンパイル前- var list = ['text1', 'text2', 'text3'];
ul
each item in list
li #{item}コンパイル後<ul>
<li>text1</li>
<li>text2</li>
<li>text3</li>
</ul>コメントの書き方
コメントの書き方は2通りあって、HTMLにコンパイルした時に表示されるものと、表示されないPugだけのコメントの2通りです。
スラッシュ2つでコメントは記述しますが、その後にハイフンを付けるとPugだけのコメントになります。
コンパイル前// HTMLにも表示されるコメント
//- Pugだけのコメントコンパイル後<!-- HTMLにも表示されるコメント -->Pugをプロジェクトで使う時の注意点
ここまでPugを見てきてわかると思いますが、Pugは最終的に大量の静的HTMLを書き出す時に有効です。
逆に言えば、CMSなどへの組み込みを前提とする場合は使いにくい印象です。
また、書き方が独特のため、複数人で作業をする場合はメンバー全員にPugについての書き方や、ファイル分割する時のルールについて共有しておく必要があります。
「使おう」と意識しなければあまり触れる機会はなさそうですが、最近はVue.jsのテンプレートをPugで記述もできるようになりましたし、書けるようになっていて損はないと思います。

Safari 12.1から外観モード(ライト/ダーク)の判定をCSSで行えるように!
WordPressで作成した記事をSlackでシェアしたときに、抜粋文が長く表示される場合の対処法
Nuxt.jsでコンポーネントを作成してコードの共通化を行う|Nuxt.jsの基本
WordPressのContact Form 7で送信時に回転アイコンが出たまま止まってしまうときのチェックリスト
Webデザイナーを目指す専門学生が技術ブログを書くメリット
Visual Studio Codeで開始タグを修正すると自動で閉じタグも修正してくれる拡張機能「Auto Rename Tag」
Vue Routerでページ遷移後にトーストを表示させる方法
「Dart Sass」「LibSass」「Ruby Sass」などSassの種類や記法に関するまとめ
ウェブサイト上で簡単にWYSIWYGエディタを実装する「TinyMCE」
Nuxt.jsで「Classic mode for store/ is deprecated and will be removed in Nuxt 3.」のエラーメッセージが表示される場合の対処法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする
超軽量なコードエディタ 「Zed」をサブエディタとして活用する
Bartender 6で追加されたWidgets機能で自作メニューバーアイテムを簡単に作成する
Googleカレンダーを便利に活用するための小技集(祝日だけを表示・月末の繰り返しイベントを追加)
Obsidianを使った「自己流PKM」で行う知識トレーニング
テキストエディタ・ノートアプリ関連のショートカットキーをKeyboard Maestroで統一する
Path Finderを使ってキーボードだけでファイル操作する方法(応用編)