app.get('https://www.jb51.net/', function(req, res){
res.render('index.jade', { title: 'My Site' });
});
新的 view engine 设置允许我们指定默认的模板引擎,例如当我们使用 jade 时可以这样设置:
复制代码 代码如下:
app.set('view engine', 'jade');
允许我们这样处理:
复制代码 代码如下:
res.render('index');
对应于:
复制代码 代码如下:
res.render('index.jade');
当 view engine 被设定,扩展名实属可选,但我们依然可以混着匹配模板引擎:
复制代码 代码如下:
res.render('another-page.ejs');
Express 同时还提供了 view options 设置,这将应用于一个 view 每次被渲染的时候,譬如你不希望使用 layouts 的时候可能会这样做:
复制代码 代码如下:
app.set('view options', {
layout: false
});
在需要的时候,这可以在 res.render() 调用的内部进行重载:
复制代码 代码如下:
res.render('myview.ejs', { layout: true });
当有需要变更一个 layout,我们通常需要再指定一个路径。譬如当我们已经把 view engine 设置为 jade,并且这个文件命名为 ./views/mylayout.jade,我们可以这样简单地进行传参:
复制代码 代码如下:
res.render('page', { layout: 'mylayout' });
否则(译注:没有把 view engine 设置为 jade 或者其他的引擎时),我们必须指定一个扩展名:
复制代码 代码如下:
res.render('page', { layout: 'mylayout.jade' });
它们同样可以是绝对路径:
复制代码 代码如下:
res.render('page', { layout: __dirname + '/../../mylayout.jade' });
对于这点有一个不错的例子 —— 自定义 ejs 的起始和闭合标签:
复制代码 代码如下:
app.set('view options', {
open: '{{',
close: '}}'
})
十五、View 部件
Express 的 view 系统内置了部件(partials) 和集合器(collections)的支持,相当于用一个 “迷你” 的 view 替换一个文档碎片(document fragment)。示例,在一个 view 中重复渲染来显示评论,我们可以使用部件集:
复制代码 代码如下:
partial('comment', { collection: comments });
如果并不需要其他选项或者本地变量,我们可以省略整个对象,简单地传进一个数组,这与上述是等价的:
复制代码 代码如下:
partial('comment', comments);
在使用中,部件集无偿地提供了一些 “神奇” 本地变量的支持:
1.firstInCollection true,当它是第一个对象的时候
2.indexInCollection 在集合器对象中的索引
3.lastInCollection true,当它是最后一个对象的时候
4.collectionLength 集合器对象的长度
本地变量的传递(生成)具备更高的优先级,同时,传到父级 view 的本地变量对于子级 view 同样适应。例如当我们用 partial('blog/post', post) 来渲染一个博客文章,它将会生成一个 post 本地变量,在调用这个函数的 view 中存在本地变量 user,它将同样对 blog/post 有效。(译注:这里 partial 比较像 php 中的 include 方法)。
注意: 请谨慎使用部件集合器,渲染一个长度为 100 的部件集合数组相当于我们需要处理 100 个 view。对于简单的集合,最好重复内置,而非使用部件集合器以避免开销过大。
十六、View 查找
View 查找相对于父级 view (路径)执行,如我们有一个 view 页面叫作 views/user/list.jade,并且在其内部写有 partial('edit') 则它会尝试加载 views/user/edit.jade,同理 partial('../messages') 将会加载 views/messages.jade。
View 系统还支持模板索引,允许你使用一个与 view 同名的目录。例如在一个路由中,res.render('users') 得到的非 views/users.jade 即 views/users/index.jade。(译注:先处理 <path>.<engine> 的情况,再处理 <path>/<index.<engine> 的情况,详情可见 view.js。)
当使用上述 view 索引,我们在与 view 同一个目录下,使用 partial('users') 中引用 views/users/index.jade,与此同时 view 系统会尝试索引 ../users/index,而无须我们调用 partial('users')。
十七、Template Engines
下列为 Express 最常用的模板引擎:
1.Haml:haml 实现
2.Jade:haml.js 继位者
3.EJS:嵌入式 JavaScript
4.CoffeeKup:基于 CoffeeScript 的模板
5.jQuery Templates
十八、Session 支持