本来没想写这篇文章,但是网上误导大众的文章太多了,所以今天就抽出半小时时间谈一下我对前端模板引擎的感受吧。

前端模板引擎相信大家都再熟悉不过了,市面上非常多的号称最好、最快、最牛逼的,随便就能找到一大把,但是真的深层次的对比才能发现其中的优劣,经过这段时间对各个模板引擎的使用分析,最终选定一款,也是目前我见过的最为强大的模板引擎:nodetpl

官网地址:http://www.nodetpl.com/cn/

这篇博客是本人的使用心得,不同意见的可以留言一起讨论。

nodetpl 相比其它几款模板,有非常独特的地方:

1. 完美支持模板级样式,有效解决样式冲突问题,别的模板几乎都没做到

考察了市面上多款模板引擎,包括国外用的比较多的模板引擎,几乎都无法完美地支持模板级CSS和JS,这给平时开发带来许多不便。

模板应当是一个独立的模块,不管应用到任何一个页面,他都不应当由外部定义样式或者绑定事件,nodetpl 这一点做的比较好,下面是一个简单的例子:

模板代码:

  1. <style>
  2. h1 {
  3. color: #f00;
  4. }
  5. </style>
  6. <div id="$ROOT">
  7. <h1>Hello <?=@name?></h1>
  8. </div>

调用:

  1. nodetpl.render(html, {
  2. name: 'zhangsan'
  3. }, function(d) {
  4. console.log(d);
  5. });

最终编译后的结果是这样的:

  1. <style>#nodetpl_g_002501583635846283 h1 { color: #f00;}</style>
  2. <div id="nodetpl_g_002501583635846283">
  3. <h1>Hello zhangsan</h1>
  4. </div>

非常神奇,nodetpl 自动解析成一个 ID 为 nodetpl_g_002501583635846283 的DOM,样式能够完美地运行在当前模板中,而且不会影响到外部页面!

2. 支持模板级js,同样,别的模板也不具备这功能

同样,书写模板的 js 代码也和上面 CSS 一样做了强大的隔离:

模板代码:

  1. <style>
  2. ...
  3. </style>
  4. <div id="$ROOT">
  5. <h1>Hello <?=@name?></h1>
  6. </div>
  7. <script>
  8. ROOT.style.border = '1px solid #00f';
  9. </script>

在 js 里面直接操作 “ROOT” 就可以了。

可以认为一个模板就是一个完完全全独立的盒子,该盒子可以运行在任何页面中,而不会对任何环境引发冲突。

用过其他的模板,平时使用不感觉有问题,但是时间久了,就会引发这样那样的问题,原因就是模板没有很好地做好样式和JS的隔离,比如:调用了 a 模板,然后又调用了 b 模板,由于 a 模板 和 b 模板里面都定义了一个同名的 css,最终造成两个模板的样式乱掉,js也同样存在冲突的问题,这个问题将会非常被动。

3. 支持 AMD / CMD,甚至 ES6

由于公司涉及到前端项目、后端项目(node.js),同时由于历史原因,前端代码有用 seajs 的,有的是页面直接调用的,发现 nodetpl 能够兼容各种开发模式:

页面直接引用、seajs引用、node.js 服务端引用,perfect!

目前 ES6 公司还没用到,不过看似蛮吊的。

4. 支持所有js语法,上手容易,是团队开发不错的选型

当初公司选型的时候,对比过几款,不过最终因为学习成本较高而放弃,毕竟是团队开发,让一个团队的同事学习一门新的语法,执行起来还是不容易的。

nodetpl 做的不错,支持所有原生js语法,比如:

  1. <?
  2. var a=1;
  3. if(a === 1) {
  4. ?>
  5. <h1>Hello, <?=a?></h1>
  6. <?} else {?>
  7. <h1>Welcome</h1>
  8. <?}?>
    <ul>
    <?for(var i=0; i<@users.length; i++) {?>
    <li><?=@users[i]?></li>
    <?}?>
    </ul>

<??> 里面是纯 js,所有人都会写。

5. 支持复杂的多模板

若一个模板逻辑比较复杂,还可以将模板分割成多个小模板,通过下面的方式:

  1. <template name="main">
  2. // template code 1
  3. </template>
  4. <template name="othertemplate">
  5. // template code 2
  6. </template>

模板之间项目调用直接通过 include('othertemplate') 就包过来了,很方便。

6. 强大的技术支持(作者特勤快,当天反馈问题几乎当天就能发布新版)

遇到过一次,公司项目需要实现 amd 和 get 共用,nodetpl 当时未能支持,通过QQ与作者协商,作者说评估一下合理性,然后当晚就给回复,说更新一下新版本吧,你的需求已经支持到了。

7. 性能超级牛叉

别信网上别的一些模板吹嘘的什么性能对比结果什么的,有的直接做个缓存然后拿来跟别的不缓存的比,当然牛逼了,通过分析 nodetpl 的原理发现,nodetpl 几乎不占性能!

官网也给了说明,在有的模式下,直接都不需要引用 nodetpl 类库,就直接能跑起来!

8. 支持几乎所有浏览器,包括变态的IE6,还支持运行在 node 服务端

目前我司node项目已经在用,框架是express.js,模板引擎是nodetpl

上面只是我几个月来的感受,还有好多实用功能,就不写了,感兴趣的看官网上的文档吧。

好多年没写博客了,今天一口气写这么多,今天算是力推这款模板吧,不知nodetpl的作者看到会不会请我喝茶,哈哈。。。

js 模板引擎 - 超级强大的更多相关文章

  1. js模板引擎介绍搜集

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  2. Filter - Surge.js模板引擎过滤器

    版权所有,转载请注明出处:http://guangboo.org/2014/01/05/filter-surgejs-template-engine 过滤器在surge.js模板引擎中多处用到,其类似 ...

  3. 百度JS模板引擎 baiduTemplate 1.0.6 版

    A.baiduTemplate 简介 0.baiduTemplate希望创造一个用户觉得“简单好用”的JS模板引擎 注:等不及可以直接点左侧导航中的”C.使用举例“,demo即刻试用. 1.应用场景: ...

  4. 使用新一代js模板引擎NornJ提升React.js开发体验

    当前的前端世界中有很多著名的开源javascript模板引擎如Handlebars.Nunjucks.EJS等等,相信很多人对它们都并不陌生. js模板引擎的现状 通常来讲,这些js模板引擎项目都有一 ...

  5. Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整

    Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...

  6. doT js 模板引擎【初探】要优雅不要污

    js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...

  7. 各种JS模板引擎对比数据(高性能JavaScript模板引擎)

    最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...

  8. JS 模板引擎 BaiduTemplate 和 ArtTemplate 对比及应用

    最近做项目用了JS模板引擎渲染HTML,JS模板引擎是在去年做项目是了解到的,但一直没有用,只停留在了解层面,直到这次做项目才用到,JS模板引擎用了两个 BaiduTemplate 和 ArtTemp ...

  9. 掌握js模板引擎

    最近要做一个小项目,不管是使用angularjs还是reactjs,都觉得大材小用了.其实我可能只需要引入一个jquery,但想到jquery对dom的操作,对于早已习惯了双向绑定模式的我,何尝不是一 ...

随机推荐

  1. 【转】Android Listener侦听的N种写法

    原文网址:http://blog.csdn.net/ithomer/article/details/7489274 Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种 ...

  2. (转载)INSERT INTO .. ON DUPLICATE KEY 语法与实例教程

    (转载)http://www.111cn.net/database/mysql/ON_DUPLICATE_KEY%20.htm INSERT语句末尾指定了ON DUPLICATE KEY UPDATE ...

  3. 搜索(剪枝优化):HDU 5113 Black And White

    Description In mathematics, the four color theorem, or the four color map theorem, states that, give ...

  4. Unity3d shader之次表面散射(Subsurface Scattering)

    次表面散射是一种非常常用的效果,可以用在很多材质上如皮肤,牛奶,奶油奶酪,番茄酱,土豆等等  初衷是想做一个牛奶shader的,但后来就干脆研究了sss这是在vray上的次表面散射效果 这是本文在un ...

  5. Unity3d 基于物理渲染Physically-Based Rendering之实现

    根据前文的例子http://blog.csdn.net/wolf96/article/details/44172243(不弄超链接了审核太慢)弄一下真正的基于物理的渲染逃了节课= =,弄了一下.公式和 ...

  6. Hibernate(二)Hibernate 实例

    上篇Hibernate(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hibernate的优 ...

  7. C++之友元函数

    1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同 ...

  8. C++Primer第5版学习笔记(一)

    C++Primer第5版学习笔记(一) 第一.二章的重难点内容        这个笔记本主要记录了我在学习C++Primer(第5版,中文版)的过程中遇到的重难点及其分析.因为第一.二章都比较简单,因 ...

  9. swfupload 在ie9以上浏览器报错问题记录

    解决办法: swfuploadl.js line 840左右 SWFUpload.prototype.cleanUp if (typeof(movieElement[key]) === "f ...

  10. 使用Calendar获取近三年的财务信息

    1.