HTMLが書ければすぐ習得できるテンプレートエンジン「EJS」の基本的な書き方

HTMLを効率的に書くためのテンプレートエンジンといえば「Pug(旧:Jade)」が有名ですが、書き方がインデント必須で独特な書き方になってしまいます。
コードの質を担保するという意味では、書き方がある程度制限されていた方が良い場面もあるのですが、あまりにもHTMLの書き方と差があるため、複数人のチームでコーディングするときにPugが書けない人がいると使えなくなる可能性があります。
今回紹介するEJSは、書き方はHTMLと全く同じで、それに追加して便利な機能が使えるようになったテンプレートエンジンなので、「最悪の場合、普通にHTMLも書ける」というメリットがあります。
EJSの特徴

EJSは、HTMLにJavaScriptを埋め込む(Embedded)ような形でHTMLを生成できるテンプレートエンジンです。
基本的な書き方はHTMLで、特殊な処理をしたい場所にだけ、EJS用の開始タグと閉じタグを設置し、その中にJavaScriptを書いて使用します。
EJSの基本的な特徴をまとめると下記のようになります。
- あくまで書き方はHTMLと同じ
- 拡張子は
.ejs - ファイルの分割ができる
- if文やfor文などのJavaScriptと同じ構文が使える
これらの機能をうまく使いこなすことで、効率的にHTMLを生成します。
EJSの使い方
基本的な書き方
基本的にはHTMLと同じような書き方をして、EJSの処理は<% %>などの専用の開始タグと閉じタグの中に書きます。
| EJSタグ | 内容 |
|---|---|
| <% %> | 中にJavaScriptをかけて、HTMLとしては出力されない |
| <%= %> | 中にある変数がエスケープ込みで展開される |
| <%- %> | 中にある変数がエスケープなしで展開される(HTMLタグを直接出力したい場合に使用) |
| <%# %> | コメント扱いになり、HTMLとしては出力されない |
| <%% %> | EjsそのものをEjsでテンプレート化したいときにEjsタグのエスケープとして使用します(普段は使用しない) |
基本的にEJSで何か処理して表示させたい場合は<%= %>を使用して、単に変数の定義だけしたい場合などは<% %>を使用します。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>タイトル</title>
</head>
<body>
<%= ここにEjsの処理を追加する %>
</body>
</html>ファイルの分割管理
include()関数を使うと、外部のファイルを読み込むことができます。
<%- include('./_common/header', {vars:'vars'}) %>第一引数には読み込むファイルへの相対パスを入力します。自ファイルが基準になっていて拡張子の.ejsを省略できます。
第二引数にはそのEJSに渡すパラメータを指定できます。
これを使ってヘッダーやフッターを別ファイルにして管理するだけで、EJSを使うメリットはあります。
変数を使う
変数を定義したいときは、<% %>の中で宣言するのですが、varを使う方法(ローカル変数)と使わない方法(グローバル変数)の2通りがあります。
<% var localSample = 'ローカル変数:varを使って宣言'; %>
<% globalSample = 'グローバル変数:varを使わずに宣言'; %>ローカル変数の場合はファイル間での変数の共有はできませんが、グローバル変数であれば共有可能です。
if文を使う
あらかじめ変数を用意しておいて、変数に応じてif文で条件分岐することも可能です。
書き方はJavaScriptとほとんど同じですね。
<%
var meta = {
title: 'トップページ',
};
-%>
<% if (meta.title == 'トップページ') { %>
<div class="top">トップページに表示</div>
<% } else if (meta.title == 'アバウトページ') { %>
<div class="about">アバウトページに表示</div>
<% } else { %}
<div class="other">それ以外のページ</div>
<% } %>ヘッダーをトップページとそれ以外のページで分岐するときなどに使います。
for文を使う
for文を使えば、複数回必要になる要素を短く書けます。
<% for (var i = 1; i <= 10; i++) { %>
<p><%= i %>回目</p>
<% } %>まとめ
「複数人で作業する必要があり、Pugだと書けない人がいるから導入ができない」「Pugだと社内で書ける人が自分しかいない」といった状態でも、EJSであれば基本的な書き方はHTMLと一緒です。
最悪の場合、拡張子は.ejsだけど中身は普通のHTMLというのも可能です。
とりあえずヘッダーとフッターだけは分割管理しておけば、あとから修正が入っても比較的ラクに修正できるようになるので、メリットは十分あるのではないでしょうか?


Nuxt.jsでaxios-moduleを使ってAPIからデータを取得・表示する|Nuxt.jsの基本
ブログに見出しを設置できるjQueryプラグイン「TOC | jQuery Table of Contents」
さくらのレンタルサーバで.htaccessが原因で500エラーになってしまう場合のチェックリスト
SourceTreeを開くと「’git status’ failed with code 69:’」というポップアップが出てくる場合の解決方法
効率的なマークアップが出来るようになるEmmetでCSSを書く時の基本
WebPに対応して画像サイズを最適化する方法
EmmetのWrap with Abbreviationで複数行のマークアップを効率的に行う
iOS Safariで文章の最後の1文字だけ改行されてしまう現象の対処法
mac環境にnodebrew経由でNode.jsをインストールしてバージョンを管理する方法
Nuxt.jsの「layouts」を使用してレイアウトの共通化を行う方法|Nuxt.jsの基本
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
AirPodsで片耳を外しても再生が止まらないようにする方法
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」
Gitで1行しか変更していないはずのに全行変更した判定になってしまう
Macでアプリごとに音量を調節できるアプリ「Background Music」
Macのターミナルでパスワード付きのZIPファイルを作成する方法
MacBook Proでディスプレイのサイズ調整をして作業スペースを広げる
SteerMouseの「自動移動」機能で保存ダイアログが表示されたら自動でデフォルトボタンへカーソルを移動させる
iPhoneでタッチが一切効かなくなった場合に強制再起動する方法