Pugのextendsとblockを使ってテンプレートを継承する

Pugのextendsとblockを使って、テンプレートの継承を試してみます。

サンプルコード

gulpfile.jsとディレクトリ構造は以下のようになっています。

gulpfile.js

var gulp = require('gulp'),
    pug  = require('gulp-pug');

gulp.task('pug', function() {
	gulp.src(
		['./_pug/**/*.pug', '!./_pug/**/_*.pug']
	)
	.pipe(pug({
		pretty: true,
		basedir: '_pug'
	}))
	.pipe(gulp.dest('./'))
});
  • _pug
    • _include
      • _layout.pug
      • _head.pug
      • _header.pug
      • _footer.pug
    • default.pug
    • index.pug
    • add.pug
  • gulpfile.js

_includeディレクトリ内がインクルードして使用するファイル群で、default.pugやindex.pug、add.pugが各ページ用のファイルになります。

_layout.pugを設定して、default.pugでインクルードしてみます。

_layout.pug

doctype html
html(lang="ja")
  block head
    head
      meta(charset="utf-8")
      title デフォルトのタイトルです。
  body
    block header
      header.header
        p.logo デフォルトのヘッダーです。
    block content
      .content
        p デフォルトのコンテンツです。
    block footer
      footer.footer
        p デフォルトのフッターです。

「block 〇〇」の中身はテンプレートを継承するファイル(今回の場合、default.pugやindex.pug、add.pug)で上書きすることができます。
上書きしない場合、_layout.pugで設定している内容が表示されます。

default.pugでblockを上書きしないで継承させてみます。

default.pug

extends /_include/_layout.pug

テンプレートを継承するにはextendsを使用します。
HTMLにコンパイルすると、以下のように_layout.pugで設定した内容で生成できました。

default.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>デフォルトのタイトルです。</title>
  </head>
  <body>
    <header class="header">
      <p class="logo">デフォルトのヘッダーです。</p>
    </header>
    <div class="content">
      <p>デフォルトのコンテンツです。</p>
    </div>
    <footer class="footer">
      <p>デフォルトのフッターです。</p>
    </footer>
  </body>
</html>

次にindex.pugで_layout.pugを継承して、blockを上書きしてみます。

index.pug

extends /_include/_layout.pug

block head
  include /_include/_head.pug

block header
  include /_include/_header.pug

block content
  .content
    h1.ttl ページタイトル

block footer
  include /_include/_footer.pug

blockを上書きする場合、extendsで継承の指定をした後でblockを定義します。
block内でincludeを使って別ファイルをインクルードすることも可能です。

block内でインクルードしている_head.pug、_header.pug、_footer.pugは以下のように指定します。

_head.pug

head
  meta(charset="utf-8")
  link(rel="stylesheet", href="/css/style.css")
  title テストページ

_header.pug

header.header
  p.logo サイト名

_footer.pug

footer.footer
  p フッターです。

HTMLにコンパイルすると、以下のように生成できました。

index.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="/css/style.css">
    <title>テストページ</title>
  </head>
  <body>
    <header class="header">
      <p class="logo">サイト名</p>
    </header>
    <div class="content">
      <h1 class="ttl">ページタイトル</h1>
    </div>
    <footer class="footer">
      <p>フッターです。</p>
    </footer>
  </body>
</html>

blockは上書きだけではなく、追加することもできます。
追加する場合はappendかprependを使用します。

add.pug

extends /_include/_layout.pug

block prepend header
  p.txt このページはadd.pugで作成しています。

block append footer
  script(src='/js/add.js')

appendの場合はblockの最後に追加、prependの場合はblockの先頭に追加になります。
HTMLにコンパイルすると、以下のように生成できました。

add.html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>デフォルトのタイトルです。</title>
  </head>
  <body>
    <p class="txt">このページはadd.pugで作成しています。</p>
    <header class="header">
      <p class="logo">デフォルトのヘッダーです。</p>
    </header>
    <div class="content">
      <p>デフォルトのコンテンツです。</p>
    </div>
    <footer class="footer">
      <p>デフォルトのフッターです。</p>
    </footer>
    <script src="/js/add.js"></script>
  </body>
</html>

 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930