Express学习-模板引擎(Template Engine)

模板引擎(Template Engine), 是用来解析对应类型模板文件然后动态生成由数据和静态页面组成的视图文件的一个工具。 它通过标签(tag)来响应各种解析动作,通过变量占位的方式动态的将对应数据展示到指定位置。

在 express web框架中,ejsjade都有很好的集成支持。在express中,在模板引擎使用上大多数应该都会偏向于ejs吧,ejs在代码编写上更直观,更易于理解,让开发者更多的专注于数据处理,而jade将html和数据处理揉杂在了一起,而且语法也比较怪异,看起来。 我比较喜欢ejs。 -_-#

ejs

ejs,它是一个开源的javaScript模板库或工具,ejs将数据和模板整合最终生成html文件,ejs使用起来相比jade要简单很多,语法非常像在jsp中使用 EL表达式($)动态处理数据。在html中,使用ejs动态输出数据看起来像这样:

  var  o = {tag1:'hello,ejs'} ;
    <p> <%= o.tag1 %></p>

输出到页面是这样的 :
<p>hello,ejs</p>
在jsp中使用EL表达式$同样也是对象.属性获取数据。这让我过度非常的容易。这也许是我更喜欢ejs的原因吧。

ejs 也可以独立于 express 框架使用,比如直接在html页面中引入就像jquery一样使用,如:

<div id="output"></div>
<script src="ejs.min.js"></script>
<script>
  var people = ['geddy', 'neil', 'alex'],
      html = ejs.render('<%= people.join(", "); %>', {people: people});
  // With jQuery: 
  $('#output').html(html);
  // Vanilla JS: 
  document.getElementById('output').innerHTML = html;
</script> 

这里下载./ejs.js 或者./ejs.min.js, 这种方式在jsp页面需要动态的生成公用的类似表格的页面的时候非常有用!

ejs使用

  • ejs 安装
  npm install ejs
  ## npm i ejs  --i 是 install的别名
  • 在express中使用
  //设置模板引擎为ejs
  app.set('view engine','ejs') ; //app = express() ; 
  //设置模板文件位置 => 项目根路径下views目录为模板文件存放目录
  app.set('views', __dirname + '/views') ;
  • render函数
    在express框架中使用ejs.render(dataAndOptions)就可以由一个模板文件生成静态html文件,并将数据嵌入到html文件中,这个函数有如下参数:
    • ejs模板文件名
    • 动态数据
    • 渲染个性化参数 -例如模板文件缓存,函数执行环境,打开debug模式等

如:

app.get('/',function(req,res) {
    res.render('index',{
        name:'ejs case'
    }) ;
}) ;

index 表示模板目录下的index.ejs文件,这个文件看起来像这样:

<!DOCTYPE html>
<html>
  <head><title>ejs example</title></head>
  <body>
    <h1><%= name %></h1>
  </body>
</html>

html中的css 什么的,都不需要关心,静态页面是什么样,在index.ejs中还是什么样,甚至,不懂html语法都可以,只需要知道在哪儿插入有效的ejs #tag就可以了,真的很方便。

ejs 标签
ejs #Tags是ejs动态处理数据的重要工具,通过不同的标签,ejs将生成不同类型的html元素,方便浏览器等客户端正确解析html文件。ejs目前共有如下标签支持:

  • <% 'Scriptlet' tag, for control-flow, no output
  • <%_ 'Whitespace Slurping' Scriptlet tag, strips all whitespace before it
  • <%= Outputs the value into the template (escaped)
  • <%- Outputs the unescaped value into the template
  • <%# Comment tag, no execution, no output
  • <%% Outputs a literal '<%'
  • %%> Outputs a literal '%>'
  • %> Plain ending tag
  • -%> Trim-mode ('newline slurp') tag, trims following newline
  • _%> 'Whitespace Slurping' ending tag, removes all whitespace after it

这些标签一般情况下是以%>结束的,但是也可以使用别的标签结束,例如最后两个就是用来做特殊处理的结束标签。-%> 、_%>
这些标签看起来,很像在jsp编写java代码使用的标签,也像JSTL标签,因为ejs#Tags支持javaScript执行,和jsp中的<% System.out.print("hello")%> 一样。ejs使用<%来执行标签内的js代码,更多标签文档在这里

和jsp一样,ejs也支持include, 来达到页面服用的目的,例如,大多数网站的首页展示的东西都比较多,特殊要求也越来越多,页面变更相对也是最频繁的,所以,一般这种首页都会有最少三部分组成: head.htmlbody.htmlfoote.html 通过这种方式,不仅能达到页面复用的目的,还可以分开维护,是首页能更加灵活的多样化展示,也是首页更加稳定。不会因为某一块的变更导致另一块也需要跟着变化。

ejs中使用标签<%- include('head') %>来将head.ejs文件引入。 如:

//head.ejs
<!DOCTYPE html>
<html>
  <head>
      <title>ejs example</title>
  </head>
//body.ejs
  <body>
    <h1><%= name %></h1>
    <p>hello, <%= name %></p>
  </body>
//foote
<div style="height:2px;border-bottom:1px #ccc solid;"></div>
</html>
<%- include('head') %>
  <%- include('body',{name:'ejs'}) %>
<%- include('foote') %>

这样,通过include引入,功能上一模一样,结构明显更加清晰了,而且模板复用不能再爽了。

jade

jade 是一个非常强大的模板引擎,有别与传统的模板技术,jade可以实现模板继承,据说同时性能还很强,jade粉随处可见,但是她风骚的语法和代码风格,我一直不敢尝试去爱,可能是因为我的要求很低,我只是需要一个可以填充数据的东东就可以了,有ejs已经足够了。 #-_-

有比较多的语言都有jade的实现,来实现前后端统一渲染,例如:

  • java
  • php
  • python
  • ruby
  • scala

我记得之前遇到过,github上也有类似开源项目,例如jade4j。

jade 风骚的语法支持简介
在我看来,jade语法看起来有点像Markdown, 如:

html

会被解析为

<html></html>

又有一点像jQuery,如:

div#container

会被解析为

<div id="container"></div>

如添加class语法:

div.user-details

解析结果为

<div class="user-details"></div>

使用jade编写的模板长这样的:

html
  head
    title Example
    script
      if (foo) {
        bar();
      } else {
        baz();
      }

看着这样,总感觉别扭,都只有一半,特别想去给他补完整,有木有,像我这种强迫症重症患者如何能忍。

所以,我看了一点语法就放弃了,jade语法体系庞大,他似乎是专门为html定制的,html有的元素他都有对应的标签,html没有的元素,他也有对应的标签处理。ejs跟他相比,确实很弱,但是jade的学习成本也很可观。而且,用好也不是那么容易的。 我个人觉得,ejs才是正确的选择,很多时候静态html和动态数据处理真的应该分开,动态数据处理基本都是后端猿/媛,对html的了解大多不可能赶得上前端大婶,所以让一个业余的人来干正儿八经的事,想想都知道是什么结果了,只能是专业坑队友了。

有这想法,一方面也是因为我对jade不懂,路过的大神,请轻拍! @^_^@

在express中使用ejs*

一个简单的通过ejs模板输出的栗子:

  • 新建一个项目目录,进入安装expressejs支持:
mkdir express-ejs && cd express-ejs
  • 安装expressejs
npm i express
  • 检查express安装成功后安装ejs
npm i ejs
  • 同样检查node_modules目录中是否有ejs目录。
  • 然后新建路由目录和模板文件存放目录
mkdir {routers,views}
##routers 是业务路由js文件存放目录,views是模板文件存放目录
  • 然后新建一个入口函数文件 - app.js

然后整个项目目录是这个样子:

/express/express-ejs>$ ls
app.js  node_modules  routes  views

然后在routers目录下新建index.js用来处理首页访问(这个栗子只是首页处理),如:

var express = require('express') ;

var route = express.Router() ;

route.get('/',function(req,res) {
    //
    // res.send('hello ,ejs.') ;
    res.render('index',{o:{
        name:'ejs case',
        content:'ejs'
    }}) ;
}) ;

route.use(function(req,res) {
    res.send('404 miss route.') ;
}) ;


module.exports =route ;

然后在app.js中设置模板引擎、模板文件位置、路由设置、服务启动,如:

var express = require('express') ;
var app = express() ;

var index = require('./routes/index') ;

app.set('views', __dirname + '/views') ;
app.set('view engine','ejs') ;

app.use('/',index) ;

app.listen(8080,function() {
    console.log('server has started......') ;
}) ;

然后是ejs模板文件(在/views目录下),这里采用了include方式:

//head.ejs
<!DOCTYPE html>
<html>
  <head>
      <title><%= title %></title>
  </head>
//body.ejs
  <body>
    <h1><%= o.name %></h1>
    <p>hello, <%= o.content %></p>
  </body>
//foote.ejs
<div style="height:2px;border-bottom:1px #ccc solid;"></div>
</html>
//index.ejs
<%- include('head',{title:'ejs example'}) %>
  <%- include('body') %>
<%- include('foote') %>

然后运行node命令启动服务,访问http://localhost:8080 就可以看到效果了,

ejs-demo.png

END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容