旧ブログ(ISSEN)から移行しました

【handlebars】HTMLの共通部分をパーシャル化して管理する方法

【handlebars】HTMLの共通部分をパーシャル化して管理する方法

成岡拓哉
成岡拓哉4分で読めます

はじめに

株式会社TOKOSのタクヤです!
今回はヘッダーやフッターなどの共通部分をパーシャル化する方法を解説します!
handlebarsというライブラリを用いた簡単な方法ですのでぜひ試してみてください!

対象読者

  • HTMLコーダー
  • ヘッダーやフッターのHTMLを効率よく管理したい方

前提

ViteTypeScriptの環境を使用しています。
バージョンは以下のとおりです。

Node20.11.1
Vite5.2.0
TypeScript5.2.2
vite-plugin-handlebars2.0.0

導入

プラグインの導入

ライブラリの導入を行います。
今回使うライブラリはvite-plugin-handlebarsです。
以下コマンドでインストールしてください。

ターミナル
$ yarn add -D vite-plugin-handlebars

ディレクトリ構造

ここでプロジェクト全体のファイル構成を確認します。

ディレクトリ構造
├── node_modules
├── public
├── src
│   ├── company
│   │   └── index.html
│   ├── css
│   ├── js
│   │   ├── data.ts
│   │   └── main.ts
│   ├── partials
│   │   ├── footer.hbs
│   │   └── header.hbs
│   └── index.html
├── package.json
└── vite.config.js

src/partialsの中にヘッダーやフッターなどの共通パーツを入れます。
拡張子は.hbsです。
src/jsの中にプロジェクト全体で使用するサイト名やページ単位で使用するタイトルを記載したdata.tsと、JavaScriptのエントリーポイントとなるmain.tsがあります。
src直下にあるindex.htmlはトップページ、src/companyの直下にあるindex.htmlは会社概要ページのファイルです。

各ファイルの設定

ライブラリの導入が完了したら、各ファイルの設定を行っていきます。

vite.config.jsの設定

vite-plugin-handlebarsを使うためにvite.config.jsの設定をしていきます。

vite.config.js
import { resolve } from "path"
import { defineConfig } from "vite"
import handlebars from "vite-plugin-handlebars"
import { pageData, siteData } from "./src/js/data"
 
export default defineConfig({
  // 省略
  plugins: [
    handlebars({
      partialDirectory: resolve(__dirname, "src/partials"),
      context: (pagePath) => {
        return {
          siteTitle: siteData.title,
          page: pageData[pagePath],
        }
      },
    }),
  ],
})

partialDirectoryの値に共通パーツが入っているsrc/partialsを指定します。
contextの値には各ページで使用するための情報を返す関数を設定しています。
関数内のsiteTitlepage.html.hbsで使用できます。

data.tsの設定

src/js/data.ts
export const siteData = {
  title: "株式会社TOKOS",
}
 
export const pageData = {
  "/index.html": {
    title: siteData.title,
  },
  "/company/index.html": {
    title: `会社概要 | ${siteData.title}`,
  },
}

サイト、トップページ、会社概要ページのタイトルを定義しています。

共通パーツの作成

共通パーツの作成をしていきます。
header.hbsfooter.hbsを作成していきます。

header.hbsの作成

全ページ共通のheadタグとbodyタグの開始、およびヘッダーナビゲーションを共通化しています。
</body></html>の閉じタグはfooter.hbsで記述するため、ここでは含めません。

src/partials/header.hbs
<!doctype html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>{{page.title}}</title>
  </head>
  <body>
    <header>
      <ul class="global-menu">
        <li>
          <a href="/">トップ</a>
        </li>
        <li>
          <a href="/company/">会社概要</a>
        </li>
        <li>
          <a href="/service/">サービス</a>
        </li>
        <li>
          <a href="/contact/">お問い合わせ</a>
        </li>
      </ul>
    </header>

titleタグには{{ page.title }}でページにおけるタイトルを表示しています。

footer.hbsの作成

src/partials/footer.hbs
    <footer>
      <ul class="global-menu">
        <li>
          <a href="/">トップ</a>
        </li>
        <li>
          <a href="/company/">会社概要</a>
        </li>
        <li>
          <a href="/service/">サービス</a>
        </li>
        <li>
          <a href="/contact/">お問い合わせ</a>
        </li>
      </ul>
    </footer>
    <script type="module" src="/js/main.ts"></script>
  </body>
</html>

フッターとJavaScriptの読み込み、および</body></html>の閉じタグを記述しています。

共通化パーツの表示

最後に共通化したパーツを表示していきます。

HTMLファイル

src/index.html
{{> header }}
<h1>{{page.title}}のトップページ</h1>
{{> footer}}

{{> header}}{{> footer}}で共通化してあるヘッダーとフッターを読み込んでいます。
共通化したパーツの表示は{{> [ファイル名]}}のような形になります。
これで共通化したパーツの表示ができました。

終わりに

今回はHTMLの共通部分をパーツ化する方法を説明しました。
ぜひhandlebarsを使って共通化パーツを作り、HTMLの管理を効率化してみてください。

この記事を書いた人

成岡拓哉
成岡拓哉

TOKOSのフロントエンドエンジニア。企業サイトやLPの制作を担当しています。このブログではWeb制作初学者向けに、実務で役立つ知識を分かりやすく発信しています。ビールが好きです🍺