第十二节: ejs与pug模板引擎

模板引擎

node框架express, koa可以像php一样使用后台语言模板,常用的模板引擎有ejs和pug


1. 认识模本引擎

1.1 什么是模板引擎

模板引擎(Tempalte Engine)是一个将页面模板和要显示的数据结合起来生成HTML页面的工具。

模板引擎的功能是将页面模板和要显示的数据结合起来生成HTML页面,它既可以运行在服务器端,又可以运行在客户端。大多时候,它都是在服务器端直接被解析为HTML的,解析完成后,再传输到客户端,因此客户端甚至无法判断页面是不是由模板引擎生成的。当然,模板引擎也可以运行在客户端,这里所说的客户端是指浏览器。考虑到浏览器的兼容性问题,还是由服务器端运行模板引擎为好。


1.2 模板引擎的原理

简单说来,HTML = Template + Data。值得一提的是,这里的Data是JS对象,不能使用JSON数据单纯的JSON字符串是渲染不出来的。
在MVC设计模式中,模板引擎放在了服务器端。当控制器得到用户的请求后,从模型(Model)获取到数据,再调用模板引擎。模板引擎以数据和页面模板为输入,生成HTML页面,然后返回控制器,由控制器交回给客户端。

模板引擎的种类有很多,我们先说 EJS


2. 认识ejs

2.1 什么是ejs

EJS是Embedded JavaScript的缩写 翻译为: 嵌入式Javascript。

EJS 是一套简单的模板语言,通过嵌入具有JavaScript特色的功能来进行HTML模板的渲染。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。

EJS比较通俗易懂,从代码展示效果来看,它仍然是HTML结构,但同时又具有额外的功能,可以有效地复用已有的代码块。如果有一个现有的HTML项目,所需要做的全部工作就是用.ejs扩展名重新命名文件,然后,就可以使用EJS的特殊功能了。


2.2 ejs的特点
  1. 快速编译与绘制输出
  2. 简洁的模板标签:<% %>
  3. 自定义分割符(例如:用 <? ?> 替换 <% %>)
  4. 引入模板片段
  5. 同时支持服务器端和浏览器 JS 环境
  6. JavaScript 中间结果静态缓存
  7. 模板静态缓存
  8. 兼容 Express视图系统


2.3. ejs的使用
2.3.1 安装ejs
npm install ejs --save


2.3.2 node原生开发使用ejs模板
const http = require("http");
const ejs = require("ejs");

const app = http.createServer((req,res) =>{
    if(req.url == "/"){
        res.writeHead(200, {
            'Content-Type': 'text/html' 
        });
        // ejs模板编译
        ejs.renderFile("./views/index.ejs",{
            title:"wuwei"
        },(err,data)  =>{
            if(err){
                console.log(err)
                return;
            }
            console.log(data)
            res.end(data)
        })
    }
})

app.listen(3000, () =>{
    console.log("Server start at 3000 port");
})


2.3.3. express使用ejs模块
// 固定写法,引入模块,执行
const express = require('express');
const app = express();

// 设置默认的模板,此时express将会帮你引入ejs,
// 所以你的提前安装ejs
app.set("view engine", "ejs");

app.get("/",(req,res) =>{
    // 渲染index.ejs模板, 第二个参数是向模板中添加的数据
    res.render("index",{
        title:'标题'
    })
})

// 监听端口
app.listen(3000);
console.log("Server start at 3000 port")

此时当用户访问/的时候,会自动使用views文件夹中的wuwei.ejs文件当做模板,

向模板中传入的参数就是后面传入的对象.


2.3.4 配置ejs目录
// 配置ejs目录,默认就是views目录
app.set("views",path.join(__dirname,"views"))
// 配置视图模板引擎为ejs
app.set("view engine","ejs")


2.4. ejs模板的语法
2.4.1 标签
  1. <% '脚本' 标签,用于流程控制,无输出。
  2. <%_ 删除其前面的空格符
  3. <%= 输出数据到模板(输出是转义 HTML 标签)
  4. <%- 输出非转义的数据到模板
  5. <%# 注释标签,不执行、不输出内容
  6. <%% 输出字符串 '<%'
  7. %> 一般结束标签
  8. -%> 删除紧随其后的换行符
  9. _%> 将结束标签后面的空格符删除


2.4.2 执行javascript的代码

<% code %>用于执行javascript的代码

<% if(isTrue){ %>
    <div>是的,我吃过了</div>
<% }else{ %>
    <div>不,我还没吃</div>
<% } %>


2.4.3 将代码内容嵌入html

<%= code %>会对code进行html转义;

<title><%=title%></title>


2.4.4 Layouts 布局

EJS 不会特别地支持区块,但是可以采用包含头部和尾部的方法来实现局部,像这样:

<%- include('header') -%>
<h1>
  Title
</h1>
<p>
  My page
</p>
<%- include('footer') -%>


2.4.5 包含

通过 include 指令将相对于模板路径中的模板片段包含进来。

<% for(var i= 0; i< dogs.length; i++){ %>
    <%- include("./aa.ejs",{
        name:dogs[i]
    })%>
<% } %>


2.4.6 App locals

任何属性设置app.locals将混合的数据对象传递到渲染的视图引擎,和那些名称匹配选择属性将被传递给EJS称为选择:

app.locals.name = 'wuwei'


2.5 express使用ejs

express设置模板引擎

//把./views目录设置为模板文件的根,html文件模板放在view目录中
app.set('views','./views');
 
//设置模板引擎为ejs
app.set('view engine','ejs');
 
//为html扩展名注册ejs
app.engine('html',ejs.renderFile);


3. Pug模板引擎

pug模板就是原来的jade模板,语法最简单的模块引擎,性能高于ejs


3.1.pug中文网

网址: https://pug.bootcss.com/api/getting-started.html


3.2. pug的安装
$ npm i -S pug


3.3. 配置模板引擎

将pug模板引擎注册到koa模板上,需要借助视图工具koa-views

koa-views专门来管理koa跟视图有关的,这是为模板引擎而生,就是将我们模板引擎和我们使用的服务框架结合起来

模板引擎不需要导入到项目中,因为安装了koa-views后,views会自动识别模板引擎

const Koa = require('koa')
const views = require('koa-views')
const { join } = require('path')

const app = new Koa;

// 配置模板引擎
// 官网配置模板路径
/*
app.use(views(__dirname + '/views'),{
    map: {
        html: 'underscore'
    }
})
*/
app.use(views(join(__dirname,'/views')),{
    extension: 'pug'
})

app.use(async (ctx)=>{
    await ctx.render('index')
})
app.listen(3003)


3.4. pug模板语法

pug模板语法建议看官网
官网地址: https://www.pugjs.cn/api/getting-started.html

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

推荐阅读更多精彩内容