駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

ejsとパーシャル

パーシャル・・・テンプレートの一部を部品化して後の変更をやりやすくすることです。

※テンプレート内の小さな部品を”パーシャル”と呼びます。

例えば、この下記のコードを全部のテンプレートで使用したい場合、コピペするのは大変です。また後からコード追加や変更もかなり手間になります。

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
My Site
</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<script src="/js/jquery-3.6.1.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
</head>

そこで必要なのが「複数箇所で使われるコードを再利用できる別のテンプレート」です。

 

パーシャルの構文

<%- incluede('パーシャルのファイル名',{受け渡す値}) %>

※{ 受け渡す値 }は省略できます

では早速サンプルを見ていきます。

・head.ejs

<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
My Site
</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
<script src="/js/jquery-3.6.1.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
</head>

<body>

・navbar.ejs

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="#">Express Demo</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav"
aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/">ホーム <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="/rand">Random</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/r/soccer">Soccer</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/r/chickens">Chickens</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/r/newsokur">ニュー速R</a>
</li>
</ul>
</div>
</nav>

・footer.ejs 

<footer>
フッター!!!
</footer>
</body>
</html>

3つのファイルを作成しておきます。

構文を用いてそれぞれのejsファイルを読み込みます。

<%- include('partials/head') %>
<%- include('partials/navbar') %>
<div class="container">
<h1>
<%= name %> subredditのページ
</h1>
<h2>
<%= description %>
</h2>
<p>
<%= subscribers %>人が購読中
</p>
<hr>
<% for(let post of posts) { %>
<article>
<p>
<%= post.title %> - <b><%= post.author %></b>
</p>
<% if (post.img) { %>
<img src="<%= post.img %>" alt="">
<% } %>
</article>
<% } %>
</div>
<%- include('partials/footer') %>

ちなみに、復習ですが「<%- %>」はejsの記法です。

このタグの中に、出力したいコードを書きます。HTMLエスケープされないで出力されるものになります。