我们已经知道了如何通过Node像浏览器发送简单的文本信息,但是如果要向浏览器发送复杂内容的话,还是应该使用网页模板
在项目目录之中,建立一个子目录views,用于存放网页模板。
假定这个项目有三个路径可用:根路径(/)、自我介绍(/about)、文章(/article)
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.sendfile('./views/index.html');
});
app.get('/about', function(req, res) {
res.sendfile('./views/about.html');
});
app.get('/article', function(req, res) {
res.sendfile('./views/article.html');
});
app.listen(3000);
这样,当用户访问不同路径时,就会返回不同的模板
但是网站真正的魅力在于动态网页
动态网页模板需要使用模板引擎,也就是视图,视图决定了用户最终能看到什么
模板引擎(Template Engine)是将页面模板和要显示的数据结合起来生成HTML 页面的工具,它既可以运行在服务器端又可以运行在客户端,大多数时候它都在服务器端直接被解析为HTML,解析完成后再传输给客户端,因此客户端甚至无法判断页面是否是模板引擎生成的
在MVC 架构中,模板引擎包含在服务器端。控制器得到用户请求后,从模型获取数据,调用模板引擎。模板引擎以数据和页面模板为输入,生成HTML 页面,然后返回给控制器,由控制器交回客户端
基于JavaScript的模板引擎有很多实现,这里使用ejs(Embedded JavaScript :嵌入式JavaScript)
首先在app.js中设置模板所在位置和模板引擎
app.set('views', path.join(__dirname, 'views')); //页面模板在views目录下
app.set('view engine', 'ejs'); //表明要使用的模板引擎
**注:__dirname为全局变量,表示当前执行的脚本所在的目录**
注:通过 express -e test 只是初始化了一个使用 ejs 模板引擎的工程而已,比如 node_modules 下添加了 ejs 模块,views 文件夹下有 index.ejs 。并不是说强制该工程只能使用 ejs ,真正使用哪个模板引擎由 app.set('view engine', 'ejs')决定
然后在routes/index.js的exports.index函数中调用
res.render('index', { title: 'express' });
res.render 的功能是调用模板引擎,并将其产生的页面直接返回给客户端
第一个参数是模板的名称,即views 目录下的模板文件名(不包含文件的扩展名)
第二个参数是传递给模板的数据,用于模板翻译
index.ejs的内容如下
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
</body>
</html>
代码中的 <%= title %>,用于模板变量显示,它们在模板翻译时会被替换成 express,因为 res.render 传递了 { title: 'express' }
**注:app.js里有app.use(express.static(path.join(__dirname, 'public')));设置了静态文件目录为 public 文件夹,所以上面代码中的 href='/stylesheets/style.css' 就相当于href='public/stylesheets/style.css'**
ejs的标签系统非常简单,只有三个标签
<% code %>:JavaScript 代码,直接执行
<%= code %>:显示替换过 HTML 特殊字符的内容
<%- code %>:显示原始 HTML 内容
实例
<% for(var i = 0 ; i<10;i++){ %>
<p><%= title %></p>
<% } %>
当很多个页面公用一部分时,我们可以使用include来布局(不再使用layout.ejs)
index.ejs
<%- include a %>
hello,world!
<%- include b %>
a.ejs
this is a.ejs
b.ejs
this is b.ejs
最终 index.ejs 会显示:
this is a.ejs
hello,world!
this is b.ejs