LoginSignup
39
36

More than 5 years have passed since last update.

Node.js express で設定できるテンプレート・エンジンのメモ

Last updated at Posted at 2017-05-07

Node.js の Express のアプリケーション生成プログラムから指定できるテンプレート・エンジンのメモです。

Node.js バージョン 4.x系 の express コマンド

$ ndenv version
v4.4.7 (set by /home/tkr/express_work2/.node-version)

$ express -V
4.13.4

$ express -h

  Usage: express [options] [dir]

  Options:

    -h, --help          output usage information
    -V, --version       output the version number
    -e, --ejs           add ejs engine support (defaults to jade)
        --hbs           add handlebars engine support
    -H, --hogan         add hogan.js engine support
    -c, --css <engine>  add stylesheet <engine> support (less|stylus|compass|sass) (defaults to pl\
ain css)
        --git           add .gitignore
    -f, --force         force on non-empty directory

Node.js バージョン 6.x 系の express コマンド

$ ndenv version
v6.10.3 (set by /home/tkr/express_work/.node-version)

$ express --version
4.15.0

$ express --help

  Usage: express [options] [dir]

  Options:

    -h, --help           output usage information
        --version        output the version number
    -e, --ejs            add ejs engine support
        --pug            add pug engine support
        --hbs            add handlebars engine support
    -H, --hogan          add hogan.js engine support
    -v, --view <engine>  add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults\
 to jade)
    -c, --css <engine>   add stylesheet <engine> support (less|stylus|compass|sass) (defaults to p\
lain css)
        --git            add .gitignore
    -f, --force          force on non-empty directory

テンプレート・エンジンのリンク集

EJS

JSP (JavaServer Pages) に良く似ているので、一番馴染みやすい印象があります。

Jade / Pug

JadeはPugに名前が変わったとの事で、両者は同じものです。

handlebars

hogan.js

JADEのテンプレートを追加する方法

テンプレート・エンジンに、JADEを選択して、ジェネレートされたアプリに、ページを追加してみます。デフォルトがJADEなので、オプション無しで、以下の様に実行します。

$ express myapp2

   create : myapp2
   create : myapp2/package.json
   create : myapp2/app.js
   create : myapp2/public
   create : myapp2/public/javascripts
   create : myapp2/public/images
   create : myapp2/public/stylesheets
   create : myapp2/public/stylesheets/style.css
   create : myapp2/routes
   create : myapp2/routes/index.js
   create : myapp2/routes/users.js
   create : myapp2/views
   create : myapp2/views/index.jade
   create : myapp2/views/layout.jade
   create : myapp2/views/error.jade
   create : myapp2/bin
   create : myapp2/bin/www

   install dependencies:
     $ cd myapp2 && npm install

   run the app:
     $ DEBUG=myapp2:* npm start

これにより作成されたディレクトりやファイルに注釈をつけると以下の様になります。npm start で実行されるのは、bin/www ですが、HTTPサーバーに関する設定が切り出されたファイルで、この中から、app,jsを実行しています。 このため、アクションを追加するには、app.js に変更を加えます。

myapp2$ tree
.
├── app.js  アプリケーションの設定
├── bin
│   └── www サーバーの設定、リスナー起動、上記のapp.jsの呼び出し
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js   / に対するアクションを定義
│   └── users.js   /user に対するアクションを定義
└── views
    ├── error.jade
    ├── index.jade  / のビュー
    └── layout.jade

新たに /list を追加するために、下記の2箇所を追加します。

app.js
<中略>
var routes = require('./routes/index');
var users = require('./routes/users');
var list = require('./routes/list');   // 追加(1)

var app = express();
<中略>
app.use('/', routes);
app.use('/users', users);
app.use('/list', list);   // 追加(2)
<中略>

追加(1)に対応する myapp2/routes/list.js のファイルを作成します。

list.js
var express = require('express');
var router = express.Router();
var profiles = require('../profiles');  // 表示用のデータ

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('list', { title: 'Profiles', profiles: profiles});
});

module.exports = router;

以下は表示用のデータです。 実際のアプリではデータベースから取得するものとなります。

profiles.js
var profiles = [
    [ 'さくら', '女性', '25', '東京都中央区日本橋23'],
    [ 'ゆり', '女性', '28', '神奈川県小田原市根府川483'],
    [ 'うめ', '男性', '31', '千葉県千葉市緑区土気町22']
];

module.exports = profiles;

そして、追加(2)に対応するテンプレートのファイル myapp2/views/list.jade を作成します。

list.jade
extends layout

block content
  h1= title

  table#profiles
    tr
      th 名前
      th 性別
      th 年齢
      th 住所
    each profile, id in profiles
          tr(id= id)
            each val in profile
              td #{val}

これで作業終了です。続いて、express のアプリを起動します。

myapp2$ npm start

> myapp2@0.0.0 start /home/tkr/express_work2/myapp2
> node ./bin/www

ブラウザからアクセスして、動作を確認します。

スクリーンショット 2017-05-09 0.40.07.png

EJSのテンプレートを追加する方法

JADEと対比しながら、異なる部分に注目して書いていきます。 テンプレート・エンジンをEJSに指定するため -e ejs を指定して、アプリケーションを生成します。

$ express -e ejs myapp1

   create : myapp1
   create : myapp1/package.json
   create : myapp1/app.js
   create : myapp1/public
   create : myapp1/public/javascripts
   create : myapp1/public/images
   create : myapp1/public/stylesheets
   create : myapp1/public/stylesheets/style.css
   create : myapp1/routes
   create : myapp1/routes/index.js
   create : myapp1/routes/users.js
   create : myapp1/views
   create : myapp1/views/index.ejs
   create : myapp1/views/error.ejs
   create : myapp1/bin
   create : myapp1/bin/www

   install dependencies:
     $ cd myapp1 && npm install

   run the app:
     $ DEBUG=myapp1:* npm start

以下のフォルダーとファイルのリストの中で、JADEの時と異なる追加は、list.ejs のみです。

myapp1$ tree
.
├── app.js   <-- JADEの時と同じ変更
├── bin
│   └── www
├── package.json
├── profiles.js  <--- JADEの時と同じ内容
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   ├── index.js
│   └── list.js  <--- JADEの時と同じ内容
└── views
    ├── error.ejs
    ├── list.ejs  <--- 異なる内容
    └── index.ejs

7 directories, 8 files

list.ejs のファイルの内容を以下にリストします。殆どHTMLで、 <% %>でプログラム・コードを囲むところは、JSPと同じですね。

list.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %>  EJS version</h1>
    <table>
      <tr>
    <th>名前</th>
    <th>性別</th>
    <th>年齢</th>
    <th>住所</th>
      </tr>
      <% Object.keys(profiles).forEach(function(id) {%>
      <tr>
    <% Object.keys(profiles[id]).forEach(function(val) {%>
    <td><%= profiles[id][val] %></td>
    <% }); %>
      </tr>
      <% }); %>
    </table>
  </body>
</html>

出来たら、アプリをスタートして、ブラウザでアクセスして、動作を確認します。

$ npm start

スクリーンショット 2017-05-09 22.24.50.png

以上です。

39
36
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
36