誰がなんと言おうと私はPugを使い続ける、という強い決意をこめて、ここにPugのチートシートを記す。
Pugの基本的な使い方
Pugは、独自の記法で書いたテキストをHTMLに変換するツールである。この記法は、インデントを活用してHTMLのマークアップを超シンプルに表現できる。APIを使って、単体で文字列をHTMLに変換することも可能。ただ、バンドルツールに組み込む形で使われるケースが多い。
ここでは、webpackを例に基本的な使い方をまとめる。まずnpmコマンドで必要なパッケージをインストールする。
ちなみにwebpackの公式サイトではpug-loaderが紹介されているが、このローダは最新のPug3には対応していない。代替として、pug-pluginというローダを使う。
このプラグインを使うと、Pugファイルをエントリポイントにすることもできるらしい。でも、調べるのがめんどうだ。今回は馴染みのある設定を踏襲して、ただpug-loader
と置き換える形で使う。
以下、webpack.config.js
ファイルの設定である。
srcディレクトリ下にindex.js
とtemplate.pug
を置き、npx webpack
を実行すれば、distディレクトリ下にJavaScriptファイルとHTMLファイルが出力されるはずである。
タグを指定する
Pugではタグ名 中身のテキスト
と言う形でHTMLを記述できる。
属性値を指定する
タグ名のすぐ後ろに(属性名1="属性値1" 属性名2="属性値2")
のような形で指定する。文字列のよう思えるが、実際にはJavaScriptの式。なので動的に値を指定することも可能。また、style
属性は文字列のほかオブジェクトも指定できる。
デフォルトでは属性値はすべてエスケープされるため注意が必要。エスケープを回避するには、!=
とすれば良い。
変数をテキストに埋め込む
属性値と同じく、テキストにも変数(というか式)を埋め込むことができる。タグ名=式
、あるいはタグ名 #{変数名}
のように書く。
HTMLタグをそのまま表示する
HTMLタグはそのまま表示されるので、そのまま書けば良い。
複数行のテキストを表示する
複数行のテキストを表示する方法には、以下の2つがある。
idとclassの指定方法
idとclassは、セレクタと同じように指定することもできる。
コメントを書く
コメントの書き方は以下の通り。
外部ファイルを読み込む
include ./xx/yy/zz.pug
で別のテンプレートファイルを読み込める。また、Pug以外のファイル形式を読み込むときはフィルタ(後述)を使う。
テンプレートを継承する
外部ファイルの読み込みと似ているが、Pugには元のテンプレートを継承・拡張する仕組みがある。
Pugで言う継承とは、例えばテンプレートAにプレースホルダ(置き換え用のブロック)を指定しておき、テンプレートAを読み込んだテンプレートBで、そのプレースホルダを置き換えるような仕組みを指す。
プレースホルダはblock 任意のブロック名
という形で指定する。
継承する側は、extends
キーワードを使ってテンプレートを読み込み、継承元で指定したblock 任意のプロック名
の中身を書く。
ちなみに継承元のブロックに要素を追加したい場合は、継承側でblock prepend
あるいはblock append
とすると、継承元のブロックの前、あるいは後ろに任意のブロックを挿入できる。
テンプレートの部品を関数的に呼び出す
Pugにはテンプレートの部品を動的に扱える、ミキシンという仕組みがある。Pugで言うミキシンは、テンプレートの部品を返す関数のようなものである。include
やblock
と働きが似ているが、もうちょっとちんまい、汎用的なテンプレート部品を作るのに向いている。
外部テンプレートを読み込むinclude
でページのレイアウトパターンを組み、それらを継承する子コンプレートにblock
とmixin
を書いて各ページを作っていくのが、Pugのコーディングの基本的な流儀である。
ちなみに複数のミキシンを1つのテンプレートにまとめるか個々に分けるかはプロジェクトの規模やチームの方針による。
テンプレート内で別の言語を使う
フィルタは、Pugテンプレートの中で他の言語を扱える仕組み。インラインにも、外部ファイルの読み込みにも対応している。
Pugのフィルタは、すべてのJSTransformersに対応している。JSTransformersは、数多あるテンプレート・エンジンやらコンパイラやらのために書かれた言語を、一貫して変換できるように提唱されたAPI(たぶん)。
Pugテンプレート内でフィルタを使う場合、使いたい言語のJSTransformerモジュールをまずインストールする必要がある。
あとは、ふつうのタグと同じように:フィルタ名
とつけて、以降のブロックにテキストを書けばいい。外部からファイルを読み込みたい場合は、include:フィルタ名 ファイルパス
という形で宣言する。
インラインでJavaScriptを使う(反復)
Pugのテンプレートでは、インラインでJavaScriptのコードが使える(ただしAPIはサーバサイドのものに限定)。目的は簡単な変数の操作でテンプレートの制御を柔軟にすること。そのため複雑なロジックや長い計算は、サーバサイドのコードで行い、その結果をテンプレートに渡すことが推奨されている。
JavaScriptの変数は、Pug独自の反復構文や条件文で使うことができる。まず反復構文にはeach
とwhile
がある。
インラインでJavaScriptを使う(条件)
条件文には、if
とelse if
とelse
のコンボが使える。条件式の()
とブロックを示す{}
がない以外はJavaScriptと同じ。
既存ツール(Googleタグマネージャとか)のスクリプトを埋め込む
PugにはHTMLを埋め込めるが、<script>
タグで任意のJavaScriptコードを埋め込もうとすると、特殊記号系で引っ掛かってコンパイルが通らない。コピペでは使えないので、Pugの構文に直す必要がある。
具体的には、scirpt.
のように、scriptの後ろにドットをつけて改行し、使用したい<script>
タグの中身をそのブロックに含める。以下のようなイメージである。