<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[刘新修]]></title> 
<link>http://pic1.liuxinxiu.com:80/index.php</link> 
<description><![CDATA[刘新修的个人博客 (Liuxinxiu'S Blog)]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[刘新修]]></copyright>
<item>
<link>http://pic1.liuxinxiu.com:80/node_template/</link>
<title><![CDATA[几个模板引擎的对比]]></title> 
<author>刘新修 &lt;admin@yourname.com&gt;</author>
<category><![CDATA[NodeJs平台]]></category>
<pubDate>Mon, 05 Sep 2016 15:56:12 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/node_template/</guid> 
<description>
<![CDATA[ 
	<p><span style="color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">渲染html到页面中，在koa中可以这么干：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>app.get(</span><span class="string">'/'</span><span>,</span><span class="keyword">function</span><span>*()&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.body = </span><span class="string">&quot;&lt;p&gt;'+title+'&lt;/p&gt;&quot;</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;)&nbsp;&nbsp;</span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">但问题很大，模板混入到js逻辑了，非常不利于维护，基于 mvc 模式，我们需要将html模板抽离到 view 中方便维护，这时候我们就需要一款模板渲染引擎。</p><h2 id="为什么选择xtemplate" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; line-height: 1.7; margin: 20px 0px 10px; font-size: 24px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; padding: 0px; cursor: text; position: relative; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238);">为什么选择xtemplate</h2><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">适用于 koa 的模板引擎选择非常多，比如 <a href="https://www.npmjs.com/package/koa-jade" target="_blank" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; color: rgb(65, 131, 196); text-decoration: none;">jade</a>、<a href="https://www.npmjs.com/package/koa-ejs" target="_blank" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; color: rgb(65, 131, 196); text-decoration: none;">ejs</a>、<a href="https://www.npmjs.com/package/koajs-nunjucks" target="_blank" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; color: rgb(65, 131, 196); text-decoration: none;">nunjucks</a>、<a href="https://github.com/xtemplate/xtemplate" target="_blank" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; color: rgb(65, 131, 196); text-decoration: none;">xtemplate</a> 等。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">为什么选择 xtemplate 呢？</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px;"><span style="color: rgb(0, 0, 0);"><strong><font face="Helvetica Neue, Helvetica, Hiragino Sans GB, Microsoft YaHei, 微软雅黑, SimSun, sans-serif"><span style="font-size: 16px; ">上手难度</span></font></strong></span></p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">jade 无疑是最独特，上手难度最高，特别是将 html 转成 jade 风格的代码，需要一些成本和适应，特别是空格敏感，经常引起模块渲染报错：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>body&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;h1 Jade - node template engine&nbsp;&nbsp;</span></li><li class="alt"><span><span class="preprocessor">&nbsp;&nbsp;&nbsp;&nbsp;#container.col</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span> youAreUsingJade&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p You are amazing&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p Get on it!&nbsp;&nbsp;</span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">但 jade 在 express 中拥有广泛的群众基础，所以从 express 转到 koa，jade 是个不错的选择，但我一直认为 jade 不是最佳的模板选择。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">ejs、nunjucks、xtemplate 的上手难度差不多，但ejs的扩展写法有些诡异，特别是 filter 的写法：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&lt;p&gt;&lt;%=: users &#124; first &#124; capitalize %&gt;&lt;/p&gt;&nbsp;&nbsp;</span></span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">xtemplate 相对于 nunjucks 的优势是，模板的逻辑写法体验更接近js（ejs的逻辑表达也很接近js），上手更为简单，来看下同样一个 if 判断的写法差异。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">xtemplate:</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&#123;&#123;#</span><span class="keyword">if</span><span>(variable===0)&#125;&#125;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;It is <span class="keyword">true</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#123;&#123;/<span class="keyword">if</span><span>&#125;&#125;&nbsp;&nbsp;</span></span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;"><span style="line-height: 28.8px;">nunjucks:</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&#123;% </span><span class="keyword">if</span><span> variable == 0 %&#125;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;It is <span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#123;% endif %&#125;&nbsp;&nbsp;</span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">所以上手难度：xtemplate &lt; nunjucks &lt; ejs &lt; jade 。</p><h3 id="功能的强大度" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; line-height: 1.7; margin: 20px 0px 10px; font-size: 18px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; color: rgb(92, 107, 119); padding: 0px; cursor: text; position: relative;">功能的强大度</h3><p>四款模板引擎必备几样功能都具备：变量、逻辑表达式、循环、layout、include、宏、扩展等。</p><p>nunjucks 无疑是功能最全面的模板引擎，xtemplate 拥有 nunjucks 大部分的特性，除了filter，但 xtemplate 拥有非常强悍的拓展性：</p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>xtpl.addCommand(</span><span class="string">'money'</span><span>,</span><span class="keyword">function</span><span>(scope, option)&#123;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> money = option.params[0];&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span> money !== </span><span class="string">'number'</span><span>) </span><span class="keyword">return</span><span> </span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//金额除以100（接口返回的金额都是以分为单位，转成元）</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span> s = Number(money)/100;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span> s;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#125;)&nbsp;&nbsp;</span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;"><span style="line-height: 28.8px;">模板中使用：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&#123;&#123;money(10000)&#125;&#125;&nbsp;&nbsp;</span></span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;"><span style="line-height: 28.8px;">nunjucks 与 xtemplate 都拥有实用的宏定义功能：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&#123;&#123;#macro(</span><span class="string">&quot;test&quot;</span><span>,</span><span class="string">&quot;param&quot;</span><span>, </span><span class="keyword">default</span><span>=1)&#125;&#125;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;param is &#123;&#123;param&#125;&#125; &#123;&#123;<span class="keyword">default</span><span>&#125;&#125;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&#123;&#123;/macro&#125;&#125;&nbsp;&nbsp;</span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;"><span style="line-height: 28.8px;">模板中使用：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>&#123;&#123;macro(</span><span class="string">&quot;test&quot;</span><span>,</span><span class="string">&quot;2&quot;</span><span>)&#125;&#125;&nbsp;&nbsp;</span></span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;"><span style="line-height: 28.8px;">输出内容：</span></p><div class="codeText"><div class="codeHead">JavaScript代码</div><ol start="1" class="dp-c"><li class="alt"><span><span>param is 2 1&nbsp;&nbsp;</span></span></li></ol></div><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">jade 中的 Mixins，ejs 中的 function 也可以实现类似的抽取公用html代码块的目的 。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">如果真要分个高下：nunjucks &gt; xtemplate &gt; jade &gt; ejs 。</p><h3 id="是否支持前后端混用" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; line-height: 1.7; margin: 20px 0px 10px; font-size: 18px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; color: rgb(92, 107, 119); padding: 0px; cursor: text; position: relative;">是否支持前后端混用</h3><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">jade 直接淘汰，相信在前端js领域一般不会选择 jade 来渲染。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">nunjucks 也使用的比较少（ejs其实也少），更多人会选择使用 handlebars 。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">xtemplate 目前在阿里的系统中前后端混用中已经得到论证，节约了模板前后端转换的时间。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">事实上是否支持前后端混用不是决定性因素，特别是在 angularjs 盛行的年代。</p><h3 id="性能考量" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; line-height: 1.7; margin: 20px 0px 10px; font-size: 18px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; color: rgb(92, 107, 119); padding: 0px; cursor: text; position: relative;">性能考量</h3><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px; color: rgb(102, 102, 102); font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, SimSun, sans-serif; font-size: 16px; line-height: 28.8px;">它们都很快，其实性能都不是问题，真要较真的话，xtemplate 会更优秀些，可以看 <a href="https://github.com/xtemplate/xtemplate/blob/master/benchmark/result/2014-09-22-benchmark.md" target="_blank" style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; color: rgb(65, 131, 196); text-decoration: none;">xtemplate benchmark</a>。</p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px;"><font color="#666666" face="Helvetica Neue, Helvetica, Hiragino Sans GB, Microsoft YaHei, 微软雅黑, SimSun, sans-serif"><span style="font-size: 16px; line-height: 28.8px;">个人觉得性能不是决定性因素。</span></font></p><p style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; margin-top: 15px; margin-bottom: 15px;"><font color="#666666" face="Helvetica Neue, Helvetica, Hiragino Sans GB, Microsoft YaHei, 微软雅黑, SimSun, sans-serif"><span style="font-size: 16px; line-height: 28.8px;">基于上述几点考虑，推荐使用 xtemplate 。</span></font></p><br/>Tags - <a href="http://pic1.liuxinxiu.com:80/tags/node/" rel="tag">node</a> , <a href="http://pic1.liuxinxiu.com:80/tags/template/" rel="tag">template</a>
]]>
</description>
</item><item>
<link>http://pic1.liuxinxiu.com:80/node_template/#blogcomment</link>
<title><![CDATA[[评论] 几个模板引擎的对比]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://pic1.liuxinxiu.com:80/node_template/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>