语法有点类似velocity,比ejs要节省点键盘,呵呵。目前只运行于NodeJS上,浏览器版本待续~
如果你在寻找web框架里的模板引擎,除了ejs,jada神码的,还可以试试这个 liteview
###安装
npm install liteview
###github地址
https://github.com/fishbar/liteview
syntax:
* variable
#{var} #var
* if else
#{if(#var)} #{elseif(#var1)} #{else} #{end}
* foreach
#{foreach(#var)} #{end}
variable in foreach using #{[xxx]} , #[xxx]
magic var : #{[-]} , #{[_]} , #{[%]} // array index , array item , array length
* expression
#{(#a+1)}
#{(func(#a+1))}
api:
* init(base); init template base
* debug(bool); set debug
* reg(name,func); regist functions that called in the tpl
* preload(tpl); pre-compile the tpl file, and tpl will be cached ,so when call render, no more compile;
* render(tpl,data); return string (usually html code);
顶起,有空看源码? 虽然模板已经琳琅满目,但是还是要顶
用这个写出的模板,不知道可读性如何。
附上样稿一份:) :
<html>
<head></head>
<body>
#{if(#list)}
<ul>
#{foreach(#list)}
<li>
#{[-]} : #{[name]} - #{[address]}
#{foreach(#[child])}
<span>#{[item]}</span>
#{end}
#{foreach(#[array])}
<i>#{[_]}</i>
#{end}
</li>
#{end}
</ul>
#{end}
</body>
</html>
一直在找一款像smarty那样的支持编译缓存,静态局部不缓存和模版传参功能的模版,可惜jade,ejs都没有。 希望fish您能把这个模版发扬光大啊,不知道我说的您明白不?
这个支持缓存吗?没见类似于ejs的语法
呵呵,这个可以有,但是会把引擎本身变胖好多。
局部不缓存的场景能给我个例子么? 传参数的情况大概能想到一点
局部特别复杂的逻辑,我都想不太起来~,如果复杂,一般都会被发放到前端来渲染,节省服务器开销,呵呵
preload 会将模板编译的结果缓存与内存中,render调用的也是preload接口,所以模板只会编译一次就进驻内存中。
客户端的缓存,就不再这里处理了。不过倒是可以提供一个方便静态化的接口,呵呵,cms之类的系统还是蛮需要静态化接口的。
@fish 我觉得snoopy的意思是不是局部是动态信息那种,一般这种会用ajax处理吧
wow,都自己写模板引擎了。
很久前对各种模板进行了性能对比和如何做性能优化的总结:Javascript模板引擎性能对比及几点优化
看过你的这个文章,呵呵,回头再看看有没有漏掉的。我这个老早以前就写了~,之前在浏览器跑,这回改了一些地方,跑node上来了,哈哈哈
@fish 局部不缓存确实可以通过前端AJAX来实现,这功能倒不是大问题,不过有时候为了便于开发这么做,具体实现你可以参考下smarty 3.0。
模版传参的例子是:
比如有一个head.tpl是公用的头部,有一个{$title}变量,表示网页的标题。
如果我是user.tpl调用的 {include file=“common/head.tpl” title=“用户中心”}这样来传参给head.tpl模版,这样就省去了每次render模版时传递一些静态的东西,便于前后端分离,和合作开发。
@snoopy 参数这个,liteview里有一个特殊的实现 。
在liteview中,有 const 类型的变量, #{const:xxx}
var _const = {
xxx : 1
}
view.init(base,_const);
还有一种实现方式,就是像velocity,可以在模板里自定义变量。 我试试哪种更合适,呵呵
@fish 好像您没明白我的意思呀,就是一个a模版include另外一个b模版的时,可以像render那样传参给那个被include的b模版。这样一些css样式表,js等就可以根据a模版的功能来获取不同的css或js文件了,不必在node.js端每次render a模版时传递,比如以后a模版要增加加载一个js文件,则只需要改a模版就可以了。
@snoopy 明白你的意思,用过这个功能,呵呵,加入TODO
请问API方面可以支持下express的接口么?或者提供接口导入到express使用.
还没有,需要适配一个,呵呵,改天适配一枚
@fish thx