node+express+ejs使用模版引擎做的一个示例demo


Posted in Javascript onSeptember 18, 2017

什么是模板引擎

模板引擎(Template Engine)是一个将页面模板和要显示的数据结合起来生成 HTML 页面的工具。如果说上面讲到的 express 中的路由控制方法相当于 MVC 中的控制器的话,那模板引擎就相当于 MVC 中的视图。

模板引擎的功能是将页面模板和要显示的数据结合起来生成 HTML 页面。它既可以运 行在服务器端又可以运行在客户端,大多数时候它都在服务器端直接被解析为 HTML,解析完成后再传输给客户端,因此客户端甚至无法判断页面是否是模板引擎生成的。有时候模板引擎也可以运行在客户端,即浏览器中,典型的代表就是 XSLT,它以 XML 为输入,在客户端生成 HTML 页面。但是由于浏览器兼容性问题,XSLT 并不是很流行。目前的主流还是由服务器运行模板引擎。

在 MVC 架构中,模板引擎包含在服务器端。控制器得到用户请求后,从模型获取数据,调用模板引擎。模板引擎以数据和页面模板为输入,生成 HTML 页面,然后返回给控制器,由控制器交回客户端。

前端常用的有哪些模板引擎

一、jade

jade是超高性能的node JavaScript模板引擎,有着非常强大的API和大量杰出的特性。它主要针对node的服务端。

二、EJS

EJS是模板引擎的一种,也是我们这个教程中使用的模板引擎,因为它使用起来十分简单,而且与 express 集成良好。

三、Handlebars

Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。它采用"Logic-less template"(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。Handlebars兼容Mustache,你可以在Handlebars中导入Mustache模板。

使用模板引擎

在app.js中通过以下两行代码设置了模板文件的存储位置和使用的模板引擎:

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs');

注意:我们通过  express -e blog 只是初始化了一个使用 ejs 模板引擎的工程而已,比如 node_modules 下添加了 ejs 模块,views 文件夹下有 index.ejs 。并不是说强制该工程只能使用 ejs 不能使用其他的模板引擎比如 jade,真正指定使用哪个模板引擎的是  app.set('view engine', 'ejs'); 。

在 routes/index.js 中通过调用 res.render() 渲染模版,并将其产生的页面直接返回给客户端。它接受两个参数,第一个是模板的名称,即 views 目录下的模板文件名,扩展名 .ejs 可选。第二个参数是传递给模板的数据对象,用于模板翻译。

打开 views/index.ejs ,内容如下:

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>

当我们 res.render('index', { title: 'Express' }); 时,模板引擎会把 <%= title %> 替换成 Express,然后把替换后的页面显示给用户。

渲染后生成的页面代码为:

<!DOCTYPE html> 
<html> 
 <head> 
  <title>Express</title> 
  <link rel='stylesheet' href='/stylesheets/style.css' /> 
 </head> 
 <body> 
  <h1>Express</h1> 
  <p>Welcome to Express</p> 
 </body> 
</html>

注意:我们通过  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 内容。

注意:

<%= code %> 和  <%- code %> 的区别,当变量 code 为普通字符串时,两者没有区别。当 code 比如为  <h1>hello</h1> 这种字符串时, <%= code %> 会原样输出  <h1>hello</h1> ,而  <%- code %> 则会显示 H1 大的 hello 字符串。

一个简单的例子

通过命令新建一个ejs的项目: express -e demo

node+express+ejs使用模版引擎做的一个示例demo

在index.js里添加如下代码:

var express = require('express'); 
var router = express.Router(); 
 
 
var items=[{title:'文章1'},{title:'文章2'}]; 
 
/* GET home page. */ 
router.get('/', function(req, res, next) { 
 res.render('index',{title:'文章列表',items:items}); 
}); 
 
router.get('/form', function(req, res, next) { 
  res.render('form',{title:'文章列表',message:'fendo8888'}); 
}); 
 
router.post('/form', function(req, res, next) { 
 res.redirect('/'); 
}); 
 
 
module.exports = router;

在views下新建form.ejs添加如下代码:

<!DOCTYPE html> 
<html> 
 <head> 
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title><%= title %></title> 
  <link rel='stylesheet' href='/stylesheets/style.css' /> 
 </head> 
 <body> 
  <form method="post" action="/form"> 
    <label>new article</label><br> 
    <textarea name="text" cols="100" row="5"></textarea> 
    <input type="submit" value="pus"></input> 
  </form> 
  <div><%=message%></div> 
 </body> 
</html>

在index.ejs里添加如下代码:

<!DOCTYPE html> 
<html> 
 <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title>文章列表页</title> 
  <link rel='stylesheet' href='/stylesheets/style.css' /> 
 </head> 
 <body> 
  <h1><%= title %></h1> 
  <p><a href="/form" rel="external nofollow" >发表新文章</a></p> 
  <ul> 
    <%items.forEach(function(item){%> 
     <li><%=item.title%></li> 
     <%})%> 
  </ul> 
 </body> 
</html>

运行项目: npm start

node+express+ejs使用模版引擎做的一个示例demo

访问:http://localhost:3000/

node+express+ejs使用模版引擎做的一个示例demo

点击发表新文章

node+express+ejs使用模版引擎做的一个示例demo

点击plus提交时,又回到首页

node+express+ejs使用模版引擎做的一个示例demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript下4个跨浏览器必备的函数
Mar 07 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
JS绘制微信小程序画布时钟
Dec 24 Javascript
AngularJS service之select下拉菜单效果
Jul 28 Javascript
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
react-router v4如何使用history控制路由跳转详解
Jan 09 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
如何根据业务封装自己的功能组件
Apr 19 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
jQuery实现对网页节点的增删改查功能示例
Sep 18 #jQuery
详解node服务器中打开html文件的两种方法
Sep 18 #Javascript
详解利用 Express 托管静态文件的方法
Sep 18 #Javascript
Express使用html模板的详细代码
Sep 18 #Javascript
Mongoose中document与object的区别示例详解
Sep 18 #Javascript
新手vue构建单页面应用实例代码
Sep 18 #Javascript
angularjs路由传值$routeParams详解
Sep 05 #Javascript
You might like
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
小程序如何写动态标签的实现方法
2020/02/05 Javascript
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
Python subprocess模块学习总结
2014/03/13 Python
python实现批量改文件名称的方法
2015/05/25 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
python科学计算之narray对象用法
2019/11/25 Python
使用K.function()调试keras操作
2020/06/17 Python
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
《逃家小兔》教学反思
2014/02/23 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
见义勇为事迹材料
2014/12/24 职场文书
党员年度个人总结
2015/02/14 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python