Expressフレームワークでは、動的なWebページを効率的に生成するためにテンプレートエンジンが利用されます。これにより、HTML構造と動的データを分離し、コードの再利用性と保守性を向上させます。Expressで一般的に使用されるテンプレートエンジンには、JadeとEJS(Embedded JavaScript)の2種類があります。
テンプレートエンジンの種類と特徴
-
Jade: HTMLの構文を簡略化するための独自の記法を採用しています。インデントに基づいて構造を定義するため、HTMLファイルは非常にコンパクトになります。学習コストはありますが、習得すれば効率的なテンプレート作成が可能です。
-
EJS: 通常のHTMLファイル内に
<%= %>や<% %>といった特殊なタグを用いてJavaScriptコードを埋め込む形式です。HTMLの知識があれば容易に移行できますが、HTMLファイルが複雑になる傾向があります。
テンプレートエンジンの設定と利用
Expressアプリケーションでテンプレートエンジンを使用するには、いくつかのステップが必要です。
-
モジュールのインストール: まず、使用したいテンプレートエンジンのモジュールをnpmでインストールします。
npm install jade ejs -
テンプレートエンジンの設定: Expressアプリケーションの初期設定で、デフォルトのテンプレートエンジンとテンプレートファイルの格納場所を指定します。
app.set('view engine', 'jade');: デフォルトのテンプレートエンジンを'jade'に設定します。app.set('views', './views');: テンプレートファイルを格納するディレクトリを'./views'に指定します。
-
テンプレートエンジンの登録:
app.engine(extension, callback)メソッドを使用して、特定のファイル拡張子に対応するテンプレートエンジンを登録します。app.engine('jade', require('jade').__express);: '.jade' 拡張子のファイルに対してJadeエンジンを登録します。- EJSの場合、
.ejs拡張子にはrequire('ejs').__expressを、.html拡張子にEJSを使いたい場合はrequire('ejs').renderFileを使用します。app.engine('ejs', require('ejs').__express); app.engine('html', require('ejs').renderFile);
-
ローカル変数の設定: テンプレートに動的なデータを渡すために、ローカル変数を使用します。
app.localsオブジェクトにプロパティとして追加するか、オブジェクトを渡す形で設定できます。// プロパティとして設定 app.locals.title = 'My Application'; // オブジェクトで一括設定 app.locals({ version: 1.0 }); -
テンプレートファイルの作成:
- EJS:
<%= variable %>はエスケープされた変数値を、<%- variable %>はエスケープされない変数値を表示します。JavaScriptのロジックは<% %>タグ内に記述します。<!DOCTYPE html> <html> <head> <title><%= pageTitle %></title> </head> <body> <h1><%= user.name %></h1> <p><%- welcomeMessage %></p> </body> </html> - Jade: インデントベースの構文で記述します。変数は
#{variable}で展開します。doctype html html head title= pageTitle body h1= user.name p!= welcomeMessage
- EJS:
-
テンプレートのレンダリング: テンプレートをレンダリングしてレスポンスとして送信するには、
app.render()またはres.render()メソッドを使用します。app.render(viewName, [locals], callback): 指定されたビューをレンダリングし、結果をコールバック関数に渡します。res.render(viewName, [locals]): ビューをレンダリングし、結果を直接クライアントに応答として送信します。
// res.render() を使用する例 app.get('/users/:name', (req, res) => { const userData = { name: req.params.name }; res.render('profile', { user: userData, pageTitle: 'User Profile' }); });
デモコード
以下は、EJSとJadeを使用した基本的な設定とレンダリングの例です。
サーバーサイド (app.js)
const express = require('express');
const jade = require('jade');
const ejs = require('ejs');
const path = require('path');
const app = express();
const port = 3000;
// ビューディレクトリとデフォルトのテンプレートエンジンを設定
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); // デフォルトをJadeに設定
// Jadeエンジンの登録
app.engine('jade', jade.__express);
// EJSエンジンの登録 (HTML拡張子でejsを使用)
app.engine('html', ejs.renderFile);
// ローカル変数の設定
app.locals.systemName = 'MyApp';
app.locals.currentUser = { name: 'Alice' };
// EJSテンプレート '/ejs-example' ルート
app.get('/ejs-example', (req, res) => {
const data = {
pageTitle: 'EJS Example Page',
message: 'Welcome to EJS rendering!',
items: ['Apple', 'Banana', 'Cherry']
};
// 'example.html' は views ディレクトリ内のEJSテンプレートファイル
res.render('example.html', data);
});
// Jadeテンプレート '/jade-example' ルート
app.get('/jade-example', (req, res) => {
const data = {
pageTitle: 'Jade Example Page',
description: 'This is a demonstration of Jade templating.',
details: { id: 101, status: 'Active' }
};
// 'example.jade' は views ディレクトリ内のJadeテンプレートファイル
// デフォルトビューエンジンがJadeなので拡張子は不要
res.render('example', data);
});
app.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
});
ビューファイル (views/example.html - EJS)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= pageTitle %> - <%= systemName %></title>
</head>
<body>
<h1><%= pageTitle %></h1>
<p><%- message %></p>
<h2>Items:</h2>
<ul>
<% items.forEach(function(item) { %>
<li><%= item %></li>
<% }); %>
</ul>
<p>Rendered by EJS.</p>
</body>
</html>
ビューファイル (views/example.jade - Jade)
doctype html
html(lang="en")
head
meta(charset="UTF-8")
title= pageTitle + " - " + systemName
body
h1= pageTitle
p!= description
h2 Details:
ul
li ID: #{details.id}
li Status: #{details.status}
p Rendered by Jade.