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

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

    RHCS集群理论暨 最佳实践 什么是集群?     集群是一组(>2)相互独立的,通过高速网络互联的计算机组成的集合.群集一般可以分为科学集群,负载均衡集群,高可用性集群三大类.     科学集 ...

  2. 【转】android 完全退出应用程序

    原文网址:http://www.yoyong.com/archives/199 android退出应用程序会调用android.os.Process.killProcess(android.os.Pr ...

  3. HTTP 错误 500.21 - Internal Server Error处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    HTTP 错误 500.21 - Internal Server Error处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipel ...

  4. CSS 概览(CSS2.1)更新时间2014-0406

    CSS和HTML结合 <link rel="stylesheet" type="text/css" href="sheet1.css" ...

  5. OpenStack Havana 部署在Ubuntu 12.04 Server 【OVS+GRE】——序

    OpenStack Havana 部署在Ubuntu 12.04 Server [OVS+GRE](一)——控制节点的安装 OpenStack Havana 部署在Ubuntu 12.04 Serve ...

  6. zoj 3659 Conquer a New Region(并查集)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4882 代码: #include<cstdio> #inc ...

  7. Circle - SGU 130(递推)

    题目大意:一个圆上有2K个点,用K个线把他们连接起来,求出这些线最少可以把这个圆分成P部分,有N种分割方法.输出N和P. 分析:分割线一定是相互不相交的线,所以可以把这写分成两部分,f[i] += f ...

  8. QUEUE——队列(procedure)

    #include <stdio.h> #include <stdlib.h> #include "queue.h" int main() {  int i; ...

  9. SVN 资源库报错 E175002

    遇到一个问题, svn: E175002: OPTIONS request failed on '/' Connection timed out: connect 试了网上好多办法,都没有,最后公司大 ...

  10. C# richTextBox 重下往上依次查找关键字

    private void richTextBox1_SelectionChanged(object sender, EventArgs e) {     pos = richTextBox1.Sele ...