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

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

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

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

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

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

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

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

模板代码:

<style>
h1 {
color: #f00;
}
</style>
<div id="$ROOT">
<h1>Hello <?=@name?></h1>
</div>

调用:

nodetpl.render(html, {
name: 'zhangsan'
}, function(d) {
console.log(d);
});

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

<style>#nodetpl_g_002501583635846283 h1 {  color: #f00;}</style>
<div id="nodetpl_g_002501583635846283">
<h1>Hello zhangsan</h1>
</div>

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

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

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

模板代码:

<style>
...
</style>
<div id="$ROOT">
<h1>Hello <?=@name?></h1>
</div>
<script>
ROOT.style.border = '1px solid #00f';
</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语法,比如:

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

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

5. 支持复杂的多模板

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

<template name="main">
// template code 1
</template>
<template name="othertemplate">
// template code 2
</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. Linux驱动的两种加载方式过程分析

    一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...

  2. java基础 (六)面向对象(一)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  3. JavaScript高级程序设计11.pdf

    与操作字符串有关的最后一个方法是localeCompare(),这个方法比较两个字符串,按照字符串的字母表中的位置分别返回-1,0,1 var stringValue="yellow&quo ...

  4. verilog 双向IO实现

    网上搜索了一番,示例挺多,但发现都写的是 input in; output out; 然后  assign io= (oe)?out:1'bz;就有点想不明白了,当IO方向为输出时,应该输出out的值 ...

  5. Java Struts2 的请求处理流程详解

    一.Struts2的处理流程: 客户端产生一个HttpServletRequest的请求,该请求被提交到一系列的标准过滤器(Filter)组建链中(如ActionContextCleanUp:它主要是 ...

  6. 深入理解jvm之内存区域与内存溢出

    文章目录 1. Java内存区域与内存溢出异常 1.1. 运行时数据区域 1.1.1. 程序计数器 1.1.2. java虚拟机栈 1.1.3. 本地方法栈 1.1.4. Java堆(Java Hea ...

  7. 常用iptables规则整理

    1.仅允许内部合法的IP地址访问服务器 #setting access rules #one,in access rules,allow all the ips of hudong.com iptab ...

  8. 【Android - MD】之FloatingActionButton的使用

    FloatingActionButton(FAB) 是 Android 5.0 新特性--Material Design 中的一个控件,是一种悬浮的按钮. FloatingActionButton 是 ...

  9. spark 启动job的流程分析

    从WordCount開始分析 编写一个样例程序 编写一个从HDFS中读取并计算wordcount的样例程序: packageorg.apache.spark.examples importorg.ap ...

  10. SAE 上传根目录不存在!请尝试手动创建:./Uploads/Picture/

    请在Application\Common\Conf\config.php中,添加'FILE_UPLOAD_TYPE' => 'Sae'