| この記事の要点 |
|
EJS のタグ一覧
EJS には用途別に複数のタグがあります。最低限この 3 つを覚えれば実用上ほぼ困りません。
| タグ | 意味 | 出力 |
|---|---|---|
<%= 値 %> | 値を出力(HTML エスケープあり) | < 等に変換される |
<%- 値 %> | 値を出力(エスケープなし、生 HTML) | そのまま出る |
<% 文 %> | JavaScript 文の実行(if / for など) | 何も出ない |
<%# コメント %> | テンプレート内コメント | 何も出ない |
<%% / %%> | リテラルの <% / %> を出力 | <% / %> |
最小サンプル ─ http モジュールで動かす
素の Node.js(Express を使わない)構成で、EJS を使って test.ejs をレンダリングしてレスポンスする最小例です。
server.js
const http = require('http');
const ejs = require('ejs');
const fs = require('fs');
// テンプレートを 1 回だけ読み込む(毎リクエストで読むと遅い)
const template = fs.readFileSync('test.ejs', 'utf-8');
const server = http.createServer((req, res) => {
// EJS でレンダリング(第 2 引数のオブジェクトがビューに渡る変数)
const html = ejs.render(template, {
val1: 'val1',
});
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write(html);
res.end();
});
server.listen(8000);
console.log('サーバー起動中... http://localhost:8000/');
test.ejs
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>EJSサンプル</title>
</head>
<body>
<!-- エスケープなし(生 HTML 込み) -->
<p><%- val1 %></p>
<!-- エスケープあり(推奨) -->
<p><%= val1 %></p>
<!-- for ループ -->
<% for (let i = 0; i < 5; i++) { %>
<p><%= i %></p>
<% } %>
</body>
</html>
起動と動作確認
# ejs をインストール
npm install ejs
# サーバ起動
node server.js
# ブラウザで開く
# http://localhost:8000/
ブラウザでアクセスすると、val1 の中身と 0〜4 の数字が表示されます。
出力結果

<%= %> と <%- %> の使い分け
| タグ | 用途 |
|---|---|
<%= %> | ユーザ入力 / DB から読んだ値 / 文字列全般。XSS 対策のため標準はこちら |
<%- %> | 事前に安全と分かっている HTML 断片を埋め込みたいとき(部分テンプレートやサニタイズ済みエディタ出力) |
区別を間違えると Cross-Site Scripting(XSS)に直結します。デフォルトは必ず <%= %> を使い、<%- %> は明確に意図したときだけにしてください。
if 文 / 配列ループ
<!-- 条件分岐 -->
<% if (user) { %>
<p>こんにちは <%= user.name %> さん</p>
<% } else { %>
<p>ログインしてください</p>
<% } %>
<!-- 配列を回す -->
<ul>
<% items.forEach(item => { %>
<li><%= item.name %> ─ <%= item.price %>円</li>
<% }) %>
</ul>
Express で使う場合
素の http サーバではなく Express を使うと、ビューエンジン登録だけで res.render から呼び出せます。
const express = require('express');
const app = express();
app.set('view engine', 'ejs');
app.set('views', './views'); // ./views/*.ejs を探す
app.get('/', (req, res) => {
res.render('index', { val1: 'val1', items: [1, 2, 3] });
});
app.listen(3000);
関連
子ページ
子ページはありません
同階層のページ
- インストール
- 値の表示と処理の記述
- テンプレートの共通化(組み込み)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38