NodeJS模板引擎一枚!
发布于 12 年前 作者 fish 12777 次浏览 最后一次编辑是 8 年前

语法有点类似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);
18 回复

顶起,有空看源码? 虽然模板已经琳琅满目,但是还是要顶

用这个写出的模板,不知道可读性如何。

附上样稿一份:) :

<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使用.

还没有,需要适配一个,呵呵,改天适配一枚

回到顶部