LoginSignup
3
5

More than 1 year has passed since last update.

初心者のためのpug入門

Posted at

はじめに

テンプレートエンジンのpugに触れる機会があったので、初心者の方でもわかりやすいようにまとめようと思います。

pug(パグ)とは

pug(パグ)とは、HTMLを簡単に、かつ効率的に書くためのテンプレートエンジンです。
閉じタグの概念がなく、素のHTMLに比べて記述が少なくなるのが特徴です。
また、内部で定数を定義してループできたりもします。

① 導入

pugを導入するには、

  • pug-cliをグローバルにインストール
  • gulpなどのタスクランナーでコンパイル

などの方法がありますが、今回は一番手軽なpug-cliを使用します。

pug-cliをglobalにインストールします。

$ npm install pug-cli -g
or
$ yarn global add pug-cli

pugコマンドが使用できるようになっていればOKです。

$ pug --version
//  実行結果
pug version: 2.0.4
pug-cli version: 1.0.0-alpha6

任意のディレクトリにpugファイルを作成し、記述していきます。

$ touch index.pug

HTMLファイルに出力する際は

$ pug index.pug

を実行すると、同じディレクトリにHTMLファイルが出力されます。

ただし、そのままだと1行に圧縮されてHTMLファイルが出力されてしまいますので、—pretty オプションをつけるのがおすすめです。

$ pug index.pug —pretty

pug-cliにはその他たくさんのoptionコマンドがありますので、公式を参考にしてみてください。

② 基本文法

pugには閉じタグの概念がないので、タグに入れるテキスト等は半角スペースの後に記述します。

h1 見出し
p ここに文章が入ります
div ここはdivタグです
    button ボタンタグです

HTMLに出力すると以下のようになります。

<h1>見出し</h1>
<p>ここに文章が入ります</p>
<div>
    ここはdivタグです
    <button>ボタンタグです</button>
</div>

idとclassを付けたい場合

idとclassを付けたい場合はタグの直後に記述します。
CSSやJavaScriptと同じように、idは#、classは. で表記します。

h1#title 見出し
p.text ここに文章が入ります
<h1 id="title">見出し</h1>
<p class="text">ここに文章が入ります</p>

属性を指定したい場合

属性を指定したい場合も、直後に()で記述します。

a(href="#" target="_blank") リンク
img(src="/pass/image.png" alt="画像1")
<a href="#" target="_blank">リンク</a>
<img src="/pass/image.png" alt="画像1">

改行したい場合

pタグの中に長い文章を記述する際など、改行をしたい場合は | を使用します。
インデントをひとつ下げて | で繋ぐと改行されます。

p
 | テキスト
<p>
    テキスト
</p>

コメントアウトしたい場合

コメントアウトの方法には、

  • HTMLファイルに出力されるコメント
  • HTMLファイルに出力されないコメント

の2種類の記述方法があります。

// HTMLファイルに出力されるコメント
//- HTMLファイルに出力されないコメント

ブロックコメントも可能です。

//
    ブロックコメントです。
    HTMLファイルに出力されます。

//-
    ブロックコメントです。
    HTMLファイルに出力されません。

③ 応用文法(ループ文)

pugファイル内でforやeach等のループ文を記述することが可能です。

for:特定の回数ループさせる

for文の書き方はJavaScriptとほぼ同じです。

ul
    - for (let i = 0; i < 3; i++)
    li リスト #{i}
<ul>
    <li>リスト 0</li>
    <li>リスト 1</li>
    <li>リスト 2</li>
</ul>

each:配列をループさせる

pugファイル内で配列を定義し、ループで出力させます。
配列を定義する際は - の直後から記述します。

ul
    - const list = ['リスト1', 'リスト2', 'リスト3']
    each item in list
        li #{item}
<ul>
    <li>リスト1</li>
    <li>リスト2</li>
    <li>リスト3</li>
</ul>

連想配列を出力することも可能です。
連想配列を定義する際は -の後改行が必要になるので注意です。

dl
    -
        const list = [
            {
                name: 'item1',
                text: 'あいうえお'
            },
            {
                name: 'item2',
                text: 'かきくけこ'
            },
            {
                name: 'item3',
                text: 'さしすせそ'
            }
        ]
    each item in list
        dt #{[item.name](http://item.name/)}
        dd #{item.text}
<dl>
    <dt>item1</dt>
    <dd>あいうえお</dd>
    <dt>item2</dt>
    <dd>かきくけこ</dd>
    <dt>item3</dt>
    <dd>さしすせそ</dd>
</dl>

④応用文法(mixin, include)

include:別ファイルを呼びこむ

includeを使用して別のpugファイルを呼び込むことも可能です。
ヘッダーやフッターなど、共通で使うものを別ファイルで切り出して使用することができます。
分割したファイルはファイル名の先頭にアンダースコア(_)をつけてコンパイルされないようにします。

// _header.pug

header ヘッダーコンテンツ
// index.pug

include _header.pug
    main
        | メインコンテンツ
<header>ヘッダーコンテンツ</header>
<main>メインコンテンツ</main>

mixin:関数を定義する

関数を定義して、pugファイル内で実行することも可能です。
mixin で関数を定義し、 +で実行します。
if文も記述することができます。

mixin listItems(items, active)
    ul
        each item in items
            if(item === active)
                li.isActive= item
            else
                li= item

+listItems(['リスト1','リスト2', 'リスト3'], 'リスト3')
<ul>
    <li>リスト1</li>
    <li>リスト2</li>
    <li class="isActive">リスト3</li>
</ul>

おわりに

以上がpugの基本的文法です。
色々便利そうですね。

3
5
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
5