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

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

    说说你在web开发中是怎么进行版本管理的 在web开发中,我首先将系统框架搭建完成后,我会发布到服务器上,然后给小组成员进行分工,为他们划分各自的模块,他们每天早上上班时就从服务器上先将自己机器上面的 ...

  2. 在.net MVC中异步上传图片或者文件

      @using (Ajax.BeginForm("AddMessages", "MenuInfo", new AjaxOptions { HttpMethod ...

  3. 网络流(最大流):CodeForces 499E Array and Operations

    You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...

  4. rspec学习02

    元数据 RSpec-core存储元数据哈希每实例和组,其中包含他们的描述,声明的位置等等,这个hash控制很多RSpec核心的功能,包括输出格式化程序(访问描述和位置),和before,after钩子 ...

  5. Myriad2 简介

    本文翻译自英文: Myriad2图像处理器是一个永远在线的移动视觉处理器系统.它提供了非常强处理能力和及其高效了内存带宽以满足计算机视觉和计算成像应用的需求. Myriad2同时也满足移动设备的非常低 ...

  6. Delphi:窗体自适应屏幕分辨率的改进

    在窗体依据屏幕分辨率自适应调整尺度方面,昨天的工作可以说是一个突破点.昨天的工作找到了长期以来我的原有方案的问题所在,这是非常关键的.但是昨天晚上的解决方案并不完美,今天的这个才是比较完美的解决版. ...

  7. Centos 6.4 openNebula4

    我们实验室的 OpenNebula 3.2 已经很稳定的运行了两年,除了开头一个月不熟悉这套云计算软件有点乱.容易犯错外接下来的时间里都很稳定,期间还包括一次防火演习(突然拉闸似断电)和安全检查(计划 ...

  8. Google视频搜索

    本博文的主要内容有 .Google视频搜索的介绍    .Google视频搜索之一:普通搜索    .Google视频搜索之二:高级搜索 1.Google视频搜索的介绍 https://zh.wiki ...

  9. tl;drLegal ——开源软件license的搜索引擎

    TLDRLegal - Open Source Licenses Explained in Plain English可以很方便查询各个开源license的总结(能做什么,不能做什么),还能比较不同的 ...

  10. 【设计模式 - 5】之适配器模式(Adapter)

    1      模式简介 适配器模式解决的问题:让原本因为接口不兼容而不能一起工作的类可以一起工作. 适配器模式的UML原理图如下图所示: 从上图可见,客户想要用Target接口实现Adaptee接口中 ...