<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>EJS &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/ejs/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Thu, 19 Dec 2013 01:46:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;Template&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/19/jaac2013-t-template.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 19 Dec 2013 01:46:39 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[EJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mustache]]></category>
		<category><![CDATA[Template]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3771</guid>

					<description><![CDATA[&#8220;T&#8221; は Template の &#8220;T&#8221;。 テンプレート 動的なWebアプリケーションを制作する上で、 テンプレートは非常に強力な味方になります。 それだけにテンプレートエ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;T&#8221; は Template の &#8220;T&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-ln2nacy3ZKQ/UqR4laWBsFI/AAAAAAAACYg/bPA0l76eL5o/s400/ac2013-t.png" alt="T"/></figure>



<p></p>



<span id="more-3771"></span>



<h2 class="wp-block-heading">テンプレート</h2>



<p>動的なWebアプリケーションを制作する上で、 テンプレートは非常に強力な味方になります。 それだけにテンプレートエンジンはまさに群雄割拠で、 それぞれ個性や独自の趣向をもったライブラリが至る所で開発されています。</p>



<h3 class="wp-block-heading">基本的な機能</h3>



<p>どのテンプレートエンジンも記法こそ様々ですが、提供する機能や使い方は基本的に共通しています。 出力用の関数が用意されており、その関数に元となるテンプレート文字列と、 その中で展開したいデータを格納したオブジェクトを渡します。</p>



<p>例えば <strong>Mustache</strong> では <strong>render</strong> メソッドがそれにあたります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> output = Mustache.render(template, data);
</code></span></pre>


<p>render の中では、テンプレートの記述を元にして data オブジェクトの内容を展開していきます。 例えばこのようなテンプレートが文字列で用意されているとして、</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"mailto:{{email}}"</span>&gt;</span>{{name}}<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></span></pre>


<p>これを次のような data オブジェクトで展開したいとします。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> data = {
    <span class="hljs-attr">name</span>: <span class="hljs-string">"John"</span>,
    <span class="hljs-attr">email</span>: <span class="hljs-string">"john@example.com"</span>
};
</code></span></pre>


<p>これらを Mustache.render メソッドに渡すと、次のような出力が文字列で返されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"mailto:john@example.com"</span>&gt;</span>John<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">制御構文</h3>



<p>テンプレートエンジンは、データのコレクションをループで回して全部出力させたり、 条件分岐を行なって true の場合のみ出力させたりといった機能を提供してくれます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- products（配列）の中のオブジェクトを全て出力 --&gt;</span>
    {{#products}}
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>{{name}} : {{price}}<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    {{/products}}
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>

<span class="hljs-comment">&lt;!-- isError が true の場合だけ出力 --&gt;</span>
{{#isError}}
<span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>エラーです<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
{{/isError}}
</code></span></pre>


<p>これは Mustache での制御構文の例です。（制御構文の書き方はライブラリによって大きく異なります）</p>



<h3 class="wp-block-heading">テンプレートのコンパイル</h3>



<p>Mustache.render のようにテンプレートとデータを渡して出力する方法の他に、 テンプレートをコンパイルしてしまって繰り返し再利用可能な関数にしてしまう事もできます。 コンパイルも多くのテンプレートエンジンで実装されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> render = Mustache.compile(template);
<span class="hljs-keyword">var</span> output = render(data);
</code></span></pre>


<p>何度も繰り返し使うようなパーツはコンパイルしてしまったほうが、 人にもパフォーマンスにも優しそうです。</p>



<h3 class="wp-block-heading">テンプレート文字列</h3>



<p>Web開発においてテンプレート文字列の内容は主に HTML であり、JavaScript の文字列リテラルで表現するには長過ぎます。 そこで、次のように script 要素の中に閉じ込めてしまう手法がよくとられます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/template"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"template-profile"</span>&gt;</span><span class="handlebars"><span class="xml">
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"profile"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"name"</span>&gt;</span></span><span class="hljs-template-variable">{{name}}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"email"</span>&gt;</span></span><span class="hljs-template-variable">{{email}}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</span></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-keyword">var</span> template = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"template-profile"</span>).innerHTML;
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<h2 class="wp-block-heading">テンプレートエンジンライブラリの色々</h2>



<p>どのライブラリも記法・機能が千差万別です。 自分のスタイルや、プロジェクトに合ったテンプレートエンジンを選択しましょう。</p>



<h3 class="wp-block-heading">Mustache</h3>



<p><a href="http://mustache.github.io/">http://mustache.github.io/</a></p>



<p>Mustache の特徴として、「多言語に対応している」事と、「ロジックレスである」事が挙げられます。 JavaScript の他にも20言語（2013年12月現在）にわたって実装されていて、 サーバサイドでもフロントでも同じ記法でテンプレートを書くことができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>{{title}}<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    {{#onsale}}<span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>セール中！<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>{{/onsale}}
    <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    {{#items}}
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>{{name}} : {{price}}<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    {{/items}}
    <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>
</code></span></pre>


<p>ループや条件分岐は {{#name}} で表現する為、複雑な制御は出来ません。</p>



<h3 class="wp-block-heading">hogan.js</h3>



<p><a href="http://twitter.github.io/hogan.js/">http://twitter.github.io/hogan.js/</a></p>



<p>hogan.js は Mustache 互換のテンプレート記法を採用した、Twitter が提供するテンプレートエンジンです。 Mustache と変わらない記述で、本家よりも速く動作するとしています。 出力の仕方は Mustache と変わりありません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> output = hogan.render(template, data); <span class="hljs-comment">// 出力</span>
<span class="hljs-keyword">var</span> render = hogan.compile(template); <span class="hljs-comment">// コンパイル</span>
</code></span></pre>


<h3 class="wp-block-heading">EJS</h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/visionmedia/ejs
</div></figure>



<p>Ruby の ERB スタイルでテンプレートを書ける JavaScript のライブラリです。 Mustache系と違って、テンプレート内にそのまま JavaScript コードを記述する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">section</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">%=</span> <span class="hljs-attr">title</span> %&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">%</span> <span class="hljs-attr">if</span>(<span class="hljs-attr">onsale</span>) { %&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">strong</span>&gt;</span>セール中！<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">%</span> } %&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">%</span> <span class="hljs-attr">items.forEach</span>(<span class="hljs-attr">function</span>(<span class="hljs-attr">item</span>){ %&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">%=</span> <span class="hljs-attr">item.name</span> %&gt;</span> : <span class="hljs-tag">&lt;<span class="hljs-name">%=</span> <span class="hljs-attr">item.price</span> %&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">%</span> }) %&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">section</span>&gt;</span>
</code></span></pre>


<p>テンプレートにロジックが必要な場合は非常に強力な味方になりますね。 記述もタグで囲むだけのシンプルなもので、 Ruby 開発者は勿論、PHP の開発者にとっても馴染みのある書き方なのではないでしょうか。</p>



<p>出力に使うメソッド名は上に上げたものと変わりません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> output = ejs.render(template, data); <span class="hljs-comment">// 出力</span>
<span class="hljs-keyword">var</span> render = ejs.compile(template); <span class="hljs-comment">// コンパイル</span>
</code></span></pre>


<h3 class="wp-block-heading">underscore</h3>



<p><a href="http://underscorejs.org/">http://underscorejs.org/</a></p>



<p>underscore.js は便利なメソッドを多数提供してくれる大変有難いライブラリですが、 その中の <strong>_.template</strong> メソッドがテンプレートエンジンとして働いてくれます。</p>



<p>テンプレートの記述は ERB に倣った物で、上の EJS で書いたテンプレートがそのまま _.template で動作します。 出力もコンパイルも同じメソッドで行います。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> output = _.template(template, data); <span class="hljs-comment">// 出力</span>
<span class="hljs-keyword">var</span> render = _.template(template); <span class="hljs-comment">// コンパイル</span>
</code></span></pre>


<p>一番の魅力は、この機能が underscore.js の一部でしかないという点だと思います。 他の便利なメソッドを使う為に、あるいは Backbone.js を使う為にインクルードしておいた underscore.js がテンプレートエンジンとしても働き、 新たに別のライブラリを読み込む必要がないのです。</p>



<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="http://mustache.github.io/">{{ mustache }}</a></li>



<li><a href="http://twitter.github.io/hogan.js/">Hogan.js</a></li>



<li><a href="https://github.com/visionmedia/ejs">visionmedia/ejs</a></li>



<li><a href="http://underscorejs.org/">Underscore.js</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
