NodeJS框架Express的模板视图机制分析 |
本文标签:Express,模板视图 模板引擎Express支持许多模板引擎,常用的有:
视图渲染(view randering)视图的文件名默认需遵循“<name>.<engine>”的形式,这里<engine>是要被加载的模块的名字 。比如视图layout.ejs就是在告诉视图系统要require(‘ejs),被加载的模块必须输出exports.compile(str, options)方法,并要返回一个函数来遵守Express的模板接口约定 。我们也可以使用app.register()来映射模板引擎到其它文件扩展名,从而实现更灵活的模板引擎行为,如此一来就可以实现“csser.html”可以被ejs引擎所渲染 。 下面我们将用Jade引擎来渲染index.html,因为我们没有设置layout:false,index.jade渲染后的内容将被作为body本地变量传入layout.jade 。
Local variables passed (or generated) take precedence, however locals passed to the parent view are available in the child view as well. So for example if we were to render a blog post with partial(‘blog/post, post) it would generate the post local, but the view calling this function had the local user, it would be available to the blog/post view as well. 传入(或生成)的本地变量优先,但传入父视图的本地变量在子视图仍有效 。因此如果我们用partial(‘blog/post, post)来渲染博客日志时,将生成post的本地变量,但调用本函数的视图拥有本地用户,它在blog/post视图依然有效 。(一回注:这段翻译感觉有问题,请高人指点) 。 性能提示:当使用局部集合渲染100长度的数组就意味着需要渲染100次视图,对于简单的集合你可以将循环内联,而不要使用局部集合,这样可以减少系统开销 。 视图查找(View Lookup)视图查找是相对于父视图进行的,比如我们有一个名为“views/user/list.jade”的页面视图,如果在该视图中调用 partial(‘edit),视图系统将会尝试查找并加载“views/user/edit.jade”,而partial(‘.. /messages)将加载“views/messages.jade” 。 视图系统还支持索引模板,这样你就可以使用一个同名的目录 。比如,在一个路由中我们执行res.render(‘users),这将指向“views/users.jade”或者“views/users/index.jade” 。 当使用上面的索引视图时,我们可以通过partial(‘users)从同名目录下引用“views/users/index.jade”,同时视图系统会尝试“../users/index”,这能减少我们调用partial(‘index)的需要 。 |