7.Node学习:模板引擎

我们已经知道了如何通过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

ejs的标签系统非常简单,只有三个标签

<%  code  %>:JavaScript 代码,直接执行
<%=  code  %>:显示替换过 HTML 特殊字符的内容
<%-  code  %>:显示原始 HTML 内容

实例

<% for(var i = 0 ; i<10;i++){ %>
	<p><%= title %></p>
<% } %>

1. 页面布局

当很多个页面公用一部分时,我们可以使用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

你可能感兴趣的:(node)