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 相关文章推荐
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
May 21 Javascript
js取消单选按钮选中示例代码
Nov 14 Javascript
JavaScript异步编程Promise模式的6个特性
Apr 03 Javascript
JavaScript动态修改网页元素内容的方法
Mar 21 Javascript
Javascript实现苹果悬浮虚拟按钮
Apr 10 Javascript
jquery easyui validatebox remote的使用详解
Nov 09 Javascript
react路由配置方式详解
Aug 07 Javascript
fullpage.js最后一屏滚动方式
Feb 06 Javascript
react router4+redux实现路由权限控制的方法
May 03 Javascript
Angularjs实现页面模板清除的方法
Jul 20 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
Sep 14 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 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
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
如何防止INPUT按回车自动提交表单FORM
2016/12/06 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
Django中modelform组件实例用法总结
2020/02/10 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
2014世界杯球队球队口号
2014/06/05 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
幼儿园六一主持词
2015/06/30 职场文书