はじめに

ノードアプリケーションを即急に作成する際、アプリケーションを手軽にテンプレート化する必要が時としてあります。

Jadeは、Expressがデフォルトとして使用するビューエンジンですが、Jade構文は多くのユースケースにとってあまりに複雑です。EJSはその代用としてよく機能し、セットアップが非常に簡単です。簡単なアプリケーションを作成し、EJSを使用してサイトの繰り返し部分(パーシャル)をインクルードし、データをビューに渡す方法を見てみましょう。

デモアプリのセットアップ

ejs illustration for: デモアプリのセットアップ

アプリケーション用に2ページ作成します。1ページはfull width、もう1ページはsidebarにします。

ファイル構造

アプリケーションに必要なファイルは以下のとおりです。viewsフォルダ内でテンプレートを作成します。その他はごく標準的なノードのフォルダです。

				
					
- views

----- partials

---------- footer.ejs

---------- head.ejs

---------- header.ejs

----- pages

---------- index.ejs

---------- about.ejs

- package.json

- server.js

				
			

package.jsonにはノードアプリケーション情報と必要な依存関係(expressEJS)が、 server.jsにはExpressサーバーのセットアップと設定が保持されています。ここでは、ページへのルートを定義します。

ノードのセットアップ

package.jsonファイルを見て、プロジェクトをセットアップしましょう。

				
					
[label package.json]

{

 "name": "node-ejs",

 "main": "server.js",

 "dependencies": {

 "ejs": "^3.1.5",

 "express": "^4.17.1"

 }

}

				
			

必要なのはExpressとEJSだけです。ここで、定義したばかりの依存関係をインストールします。先に進み実行します。

				
					
[environment local]

npm install

				
			

すべての依存関係がインストールされたので、EJSを使用するようにアプリケーションを設定し、必要な2ページ、つまりindexページ(full width)とaboutページ(sidebar)へのルートをセットアップします。これらをすべてserver.jsファイルで行います。

				
					
[label server.js]

// load the things we need

var express = require('express');

var app = express();



// set the view engine to ejs

<^>app.set('view engine', 'ejs');<^>



// use res.render to load up an ejs view file



// index page

app.get('/', function(req, res) {

 res.render('pages/index');

});



// about page

app.get('/about', function(req, res) {

 res.render('pages/about');

});



app.listen(8080);

console.log('8080 is the magic port');

				
			

ここではアプリケーションを定義し、ポート8080で表示するように設定します。また、app.set('view engine', 'ejs');を使用して、EJSをExpressアプリケーションのビューエンジンとしてセットアップします。res.render()をどのように使用してビューをユーザーに送信するかに注目してください。注目すべき点として、ビューを求めてres.render()はviewsフォルダを検索します。したがって、フルパスがviews/pages/indexなので、pages/indexとだけ定義します。

サーバー起動

先に進み、次を入力してサーバーを起動します。

				
					
[environment local]

node server.js

				
			

これで、アプリケーションがブラウザ上のhttp://localhost:8080http://localhost:8080/aboutで表示されます。アプリケーションがセットアップされたので、ビューファイルを定義し、EJSがどのように機能するか確認します。

EJSパーシャルの作成

多くのアプリケーションと同様に、構築時に再利用されるコードがたくさんあります。これらのコードをパーシャルと呼び、サイト全体で使用する3ファイル、head.ejsheader.ejsfooter.ejsを定義します。早速これらのファイルを作成しましょう。

				
					
[label views/partials/head.ejs]

<meta charset="UTF-8">

<title>EJS Is Fun</title>



<!-- CSS (load bootstrap from a CDN) -->

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css">

<style>

 body { padding-top:50px; }

</style>

				
			
				
					
[label views/partials/header.ejs]

<nav class="navbar navbar-expand-lg navbar-light bg-light">

 <a class="navbar-brand" href="/">EJS Is Fun</a>

 <ul class="navbar-nav mr-auto">

 <li class="nav-item">

 <a class="nav-link" href="/">Home</a>

 </li>

 <li class="nav-item">

 <a class="nav-link" href="/about">About</a>

 </li>

 </ul>

</nav>

				
			
				
					
[label views/partials/footer.ejs]

<p class="text-center text-muted">© Copyright 2020 The Awesome People</p>

				
			

EJSパーシャルをビューに追加する

ここにパーシャルが定義されました。あとはビューに追加するだけです。index.ejsabout.ejsに移動し、include構文を使用してパーシャルを追加します。

EJSパーシャルをインクルードする構文

EJSパーシャルを別のファイルに埋め込むには<%<^>-<^> include(<^>'RELATIVE/PATH/TO/FILE'<^>) %>を使用します。

  • 単に<%ではなくハイフンを付けて<^><%-<^>とするのは、EJSに生のHTMLをレンダリングするように指示するためです。
  • パーシャルへのパスは、現在のファイルからの相対パスで示します。
				
					
[label views/pages/index.ejs ]

&lt;!DOCTYPE html&gt;

&lt;html lang="en"&gt;

&lt;head&gt;

 &lt;^&gt;&lt;%- include('../partials/head'); %&gt;&lt;^&gt;

&lt;/head&gt;

&lt;body class="container"&gt;



&lt;header&gt;

 &lt;^&gt;&lt;%- include('../partials/header'); %&gt;&lt;^&gt;

&lt;/header&gt;



&lt;main&gt;

 &lt;div class="jumbotron"&gt;

 &lt;h1&gt;This is great&lt;/h1&gt;

 &lt;p&gt;Welcome to templating using EJS&lt;/p&gt;

 &lt;/div&gt;

&lt;/main&gt;



&lt;footer&gt;

 &lt;^&gt;&lt;%- include('../partials/footer'); %&gt;&lt;^&gt;

&lt;/footer&gt;



&lt;/body&gt;

&lt;/html&gt;

				
			

これで、定義されたビューをブラウザのhttp://localhost:8080で見ることができます。!node-ejs-templating-index

aboutページにはブートストラップサイドバーも追加し、パーシャルがどのように構築され、さまざまなテンプレートやページで再利用されるのかを見ていきます。

				
					
[label views/pages/about.ejs ]

&lt;!DOCTYPE html&gt;

&lt;html lang="en"&gt;

&lt;head&gt;

 &lt;^&gt;&lt;%- include('../partials/head'); %&gt;&lt;^&gt;

&lt;/head&gt;

&lt;body class="container"&gt;



&lt;header&gt;

 &lt;^&gt;&lt;%- include('../partials/header'); %&gt;&lt;^&gt;

&lt;/header&gt;



&lt;main&gt;

&lt;div class="row"&gt;

 &lt;div class="col-sm-8"&gt;

 &lt;div class="jumbotron"&gt;

 &lt;h1&gt;This is great&lt;/h1&gt;

 &lt;p&gt;Welcome to templating using EJS&lt;/p&gt;

 &lt;/div&gt;

 &lt;/div&gt;



 &lt;div class="col-sm-4"&gt;

 &lt;div class="well"&gt;

 &lt;h3&gt;Look I'm A Sidebar!&lt;/h3&gt;

 &lt;/div&gt;

 &lt;/div&gt;



&lt;/div&gt;

&lt;/main&gt;



&lt;footer&gt;

 &lt;^&gt;&lt;%- include('../partials/footer'); %&gt;&lt;^&gt;

&lt;/footer&gt;



&lt;/body&gt;

&lt;/html&gt;

				
			

http://localhost:8080/aboutを表示すると、サイドバー付きのaboutページが確認できます。!node-ejs-templating-about

これで、EJSを使用してノードアプリケーションからビューにデータを渡せます。

ビューとパーシャルにデータを渡す

基本的な変数と一覧を定義してホームページに渡しましょう。server.jsファイルに戻り、app.get('/')ルート内に次を追加します。

				
					
[label server.js]

// index page

app.get('/', function(req, res) {

 var mascots = [

 { name: 'Sammy', organization: "the cloud provider", birth_year: 2012},

 { name: 'Tux', organization: "Linux", birth_year: 1996},

 { name: 'Moby Dock', organization: "Docker", birth_year: 2013}

 ];

 var tagline = "No programming concept is complete without a cute animal mascot.";



 res.render('pages/index', {

 mascots: mascots,

 tagline: tagline

 });

});

				
			

mascotという一覧とtaglineという簡単な文字列を作成しました。index.ejsファイルに移動してこれらを使ってみましょう。

EJSで単一の変数をレンダリング

変数を1つだけechoするために使うのは、<%= tagline %>だけです。これをindex.ejsファイルに追加しましょう。

				
					
[label views/pages/index.ejs]

...

&lt;h2&gt;Variable&lt;/h2&gt;

&lt;p&gt;&lt;%= tagline %&gt;&lt;/p&gt;

...

				
			

EJSでデータをループさせる

データをループさせるには、.forEachを使用します。これをビューファイルに追加しましょう。

				
					
[label views/pages/index.ejs ]

...

&lt;ul&gt;

 &lt;% mascots.forEach(function(mascot) { %&gt;

 &lt;li&gt;

 &lt;strong&gt;&lt;%= mascot.name %&gt;&lt;/strong&gt;

 representing &lt;%= mascot.organization %&gt;, born &lt;%= mascot.birth_year %&gt;

 &lt;/li&gt;

 &lt;% }); %&gt;

&lt;/ul&gt;

...

				
			

追加した新しい情報がブラウザで表示されています。

データをEJSのパーシャルに渡す

EJSパーシャルは、親ビューと全く同じデータにアクセスできます。ただし、パーシャルで変数を参照している場合、<^>パーシャルを使用するすべてのビューでそれを定義する必要がある<^>ので注意してください。さもないとエラーになります。

次のようなinclude構文でもEJSパーシャルに変数を定義したり渡したりできます。

				
					
[label views/pages/about.ejs]

...

&lt;header&gt;

 &lt;%- include('../partials/header', &lt;^&gt;{variant:'compact'}&lt;^&gt;); %&gt;

&lt;/header&gt;

...

				
			

しかしここでも、変数が定義されたと仮定することには注意が必要です。

必ずしも定義されていないかもしれないパーシャルの変数を参照し、初期値を付与したい場合、次のように入力します。

				
					
[label views/partials/header.ejs]

...

&lt;em&gt;Variant: &lt;%= typeof variant != 'undefined' ? variant : 'default' %&gt;&lt;/em&gt;

...

				
			

上記では、EJSコードは、変数が定義されていればその値を、定義されていなければデフォルト値をレンダリングします。

まとめ

EJSは、そこまで複雑なものでなければ、アプリケーションのスピード開発に役立ちます。パーシャルを使用して変数を簡単にビューに渡せるので、大きなアプリケーションでも手軽に構築できます。

EJSの詳細については、公式ドキュメントを参照してください。