とりあえずのblog – なんでも書いてみたらいいんじゃないかと思って

gulp4 + EJS でウェブサイトをパーツ化して修正の手間を少なくする

2024-03-27

静的ウェブサイトを効率よく作りたい

30ページ程度のサイトでも、ヘッダーとフッターの修正が入る度に全ページに影響するので大変ですよね。
大規模になるとCMSを使うことが多いのでしょうが、小規模だととりあえず静的に作ってしまうこともあると思います。そんな場合のサイト作成を楽にするにはEJSが一番手っ取り早いと思いました。
EJSはJavascriptのテンプレートエンジンで、gatsbyとかvue.jsとかフレームワークまでは必要ないときにはちょうど良いと思うものでした。
webフレームワークは、フロントエンドのみだとちょっと大袈裟じゃないですかね。
クラス名とかよくわからない名前になったりするし。

htmlって普通にincludeできたらいいのにな。

EJSを使って共通部品化する

ヘッダーやフッターを分割し部品としてincludeすることで、ナビゲーションなど共通部分の修正が1ファイルで済みます。

こんな感じ。

ついでに、ページ毎に変更するmetaタグやページタイトルなどはjsonファイルにまとめてあり、ページタイトルやリンクパス変更はjsonファイルの書き換えだけで済むようにしました。
いろんなファイルを開かなくて済むのは良いことです。
一括置換でもいいですが、たまに思いもよらぬ場所を置換してたりするので・・・。

準備

まず、Node.jsがインストールされていること

Node.jsのインストールはいろんな方が書いているので割愛。

たぶん、入ってれば大丈夫。

ディレクトリ構成

今回必要なディレクトリは以下

website
  distEJSコンパイル先ディレクトリ(ドキュメントルート)
   csssassコンパイル先
   jsminify先js
  srcコンパイル元ディレクトリ
   ejsEJSファイル群
    commonEJS共通部品
    data.jsonEJSで使うjsonファイル
   scsssassファイル
   jsjsファイル

サイト作成で手を入れるのは、src配下のファイルのみです。
distはファイルの出力先で、「dist = ドキュメントルートに配置するファイル群」となります。
publicっていう名前にした方がわかりやすいかもしれない。

websiteディレクトリに移動して、インストールしていきましょう。

gulpインストール

npmでふわっとインストール。必要なモジュールもまとめて入れてしまえばいいと思います。

必要になるディレクトリもよっこらしょっと、作っておきましょう。

この後作成するgulpfile.jsに合わせた名前なので、違うフォルダ名にするときはgulpfile.jsの設定内容のも変更する必要があります。

gulpfile.jsを作成

websiteフォルダ直下に作成します。

含まれる機能(タスク)

  • EJSコンパイル
    • src/ejs のファイルを distにhtmlファイルで出力する
  • sassコンパイル
    • src/scssのファイルをdist/cssに出力する
  • jsのminify
    • src/jsのファイルをdist/js/*.min.jsにして出力する
  • 自動ブラウザ
    • localhost:8001でwebサービスを立ち上げてブラウザで確認できる
  • ファイルの更新を監視する
    • srcフォルダ以下のファイルが保存されたら自動でタスクを実行する
  • おまけ
    • sitemap.xmlの出力(watchしていないので手動で実行する)

website/gulpfile.js

ここまでのディレクトリ構成はこうなってるはず

website
  distEJSコンパイル先ディレクトリ(ドキュメントルート)
   csssassコンパイル先
   jsminify先js
  gulpfile.js作成したgulpfile.js
  node_modulesnpmでインストールしたパッケージ
  package-lock.jsonnpmでインストールしたパッケージの情報
  package.jsonnpmでインストールしたパッケージの情報
  srcコンパイル元ディレクトリ
   ejsEJSファイル群
    commonEJS共通部品
    data.jsonEJSで使うjsonファイル
   scsssassファイル
   jsjsファイル

さて、このままgulpを動かしても必要なファイルがなくて怒られてしまうので、最低限のファイルを作ってしまいましょう。

まず、index.htmlとなるファイル
src/ejsフォルダ直下に作成します。拡張子は.ejsです。

website/src/ejs/index.ejs

src/scssにもファイルを追加しましょうか。

website/src/scss/style.scss

data.jsonは、とりあえずindex.ejsでタイトルを読み込みたいのでtitleを取得できるように。

website/src/ejs/data.json

gulpを実行

watchしているので、ファイルを修正するとコンパイルしてリロードするようになります。
distにファイルが生成されていますね。

gulp実行前
gulp実行後

gulpはctrl+cで止めるまで動いているので、試しにscssを変更して保存してみるとgulp実行時に立ち上がったブラウザが勝手にリロードしているのが確認できはずです。

ヘッダー、フッターを部品にする

ここで、ヘッダー・フッターを共通部品にするために、_header.ejs、_footer.ejsを作成します。
ファイル名の最初がアンダーバー_のファイルは出力されません。
私はcommonフォルダ下に置いていますが、ejsフォルダ以下であればどこに置いても構いません。
website/src/ejs/common/_header.ejs

website/src/ejs/common/_footer.ejs

そして、index.ejsのヘッダー、フッターを共通部品のインクルードに変更します。

website/src/ejs/index.ejs

フォルダを追加してもう一つページを作り、共通部品を使ってみましょう。
ここで注意しなければならないのが、EJSのincludeする部品のパスです。
ejsファイル自身からの相対パスで指定しています。
website/src/ejs/page1/index.ejs

これを保存すると、distにもpage1フォルダが追加されindex.htmlも出力されています。
共通部品も読み込まれているので、ヘッダー、フッターはそれぞれのファイルを修正するだけで全てのページが更新されるようになりました。

サイトマップを作るには、

です。dist直下に、sitemap.xmlを出力します。

一度設定してしまえば、ラクラクです。
部品をインクルードするときに変数を渡したり、jsonから取得したり、結構やりたい放題です。
私は、jsonのデータは定数扱いですね。

関連リンク


感想以外

コメントする

CAPTCHA