Express全系列教程之(十):渲染jade模板引擎

一、前言

随着前端业务的不断发展,页面交互逻辑的不断提高,让数据和界面实现分离渐渐被提了出来。JavaScript的MVC思想也流行了起来,在这种背景下,基于node.js的模板引擎也随之出现。

什么是模板引擎?

它用于解析动态数据和静态页面所生成的视图文件,将原本静态的数据变为动态,快速地实现页面交互;

目前使用较广的模板引擎有以下几种:Jade / Pug、EJS、Handlebars。

jade模板引擎

jade模板引擎相较于原来的html会显得更加简洁,它将标签原本的"<>"符号去掉,用括号代替,层级使用tab缩进来分,并且也支持js语法;

二、jade的基本使用

安装jade:

cnpm install jade --save

在程序中引入jade:

app.set('views',"public"); //设置视图的对应目录

app.set("view engine","jade"); //设置默认的模板引擎

app.engine('jade', require('jade').__express); //定义模板引擎

特定路由渲染:

app.use("/",function(req,res){

res.render("index.jade");

});

完整实例:

const express=require("express");

const jade=require("jade");

const fs=require('fs');

var app=express();

//引用jade

app.set('views',"public"); //设置视图的对应目录

app.set("view engine","jade"); //设置默认的模板引擎

app.engine('jade', jade.__express); //定义模板引擎

//获取jade文件

var str=jade.renderFile("./public/index.jade",{pretty:true});

console.log(str);

app.use("/",function(req,res){

res.render("index.jade");

});

app.listen(8080);

由上面的app.set('views',"public");可知,这里将jade文件放在了public文件夹下:


jade地址

在执行res.render时,会自动渲染public中的index.jade文件,之后转换为HTML5进行dom渲染显示。

三、jade基础语法

1、jade对很多html操作进行了简化,如下:

html

    head

        style

    body

        div(class="content")

            h1 正文

了解过html语句的,从结构上一定会发现,它将原本的双标签省略了,尖括号也不见了,而层级的划分则由缩进实现,默认的,jade会把几乎所有缩进后的字母变为标签(行内元素)。以下代码会变为:

<html>

   <head>

      <style></style>

   </head>

   <body>

        <div class="content">

            <h1>正文</h1>

        </div>

   </body>

</html>

<div class="content"></div>也将用div(class="content")代表,简化了代码的书写;

2、“|”符号的作用

有时我们想让我们的标签成为文字,那么“|”成为了绝好的工具:

div(class="content",id="content")

    | center

我们可以看到,他将center作为文字原封不动的写入了html中,而不是作为一个标签渲染。

当然我们用它来转换js语句:

script

    | var cli = document.getElementById("content");

    | cli.onclick=function(){

    | alert("aaa");

    | }

他将会变为:

<script>

    var cli = document.getElementById("content");

    cli.onclick=function(){

        alert("aaa");

    }

</script>

3、识别js语句:

可以通过 script. 来识别js语法:

script.

    var cli = document.getElementById("content");

    cli.onclick=function(){

        alert("aaa");

    }

他也会变为:

<script>

    var cli = document.getElementById("content");

    cli.onclick=function(){

        alert("aaa");

    }

</script>

我们可以看到,相比于用 | 使用script. 更加方便快捷。

4、引入其他js文件:

想在jade的js标签中引入其他js文件?没错,它也支持。前提请确保他们在同一文件夹下:


引入js

script

    include click.js

<script>var cli = document.getElementById("content");

    cli.onclick=function(){

           alert("aaa");

    }

</script>

5、表达式

“-”允许我们直接写js语法,在变量调用时,通过 #{a+b} 或 div=a+b 进行:

html

    head

    body

        -var a=10

        -var b=20

        div a+b为:#{a+b}

        div=a+b

会得到:

<html>

    <head></head>

    <body>

        <div>a+b为:30</div>

        <div>30</div>

    </body>

</html>

6、for循环:

"-"也可以用于循环语句的使用

html

    head

    body

        -var arr=0;

        -for(var i=5;i>arr;i--)

            div=i

        div the number = #{i}

得到:

<html>

    <head></head>

    <body>

        <div>5</div>

        <div>4</div>

        <div>3</div>

        <div>2</div>

        <div>1</div>

        <div>the number = 0</div>

    </body>

</html>

7、case ,when

类似于switch case语句:

html

    head

    body

        - var test = "汉子"

        -var none = "无"

        div The word is #{test}

        case test

            when "a": div the when is a

            when "b": div the second is b

            when "汉子": div the Third is 汉子

            default: The words is #{none}

得到:

<html>

    <head></head>

    <body>

        <div>The word is 汉子。</div>

        <div>the Third is 汉子</div>

    </body>

</html>

类似于switch case,只执行when中与case对应的代码块,在匹配后面用 : 来作为要执行的代码,后面跟上标签和对应语句

8、if else条件判断

html

    head

    body

        -for(var i=12;i>0;i--)

        -if(i%2==0)

            div(style={background:'#eee',width:'100%',height:'20px',color: '#333'}) 偶数

        -else

            div(style={background:'#333',width:'100%',height:'20px',color: '#eee'}) 奇数

得到:

<html>

    <head></head>

    <body>

        <div style="background:#eee;width:100%;height:20px;color:#333">    偶数</div>

        <div style="background:#333;width:100%;height:20px;color:#eee">    奇数</div>

        <div style="background:#eee;width:100%;height:20px;color:#333">    偶数</div>

        <div style="background:#333;width:100%;height:20px;color:#eee">    奇数</div>

        <div style="background:#eee;width:100%;height:20px;color:#333">    偶数</div>

        <div style="background:#333;width:100%;height:20px;color:#eee">    奇数</div>

        <div style="background:#eee;width:100%;height:20px;color:#333">    偶数</div>

        <div style="background:#333;width:100%;height:20px;color:#eee">    奇数</div>

        <div style="background:#eee;width:100%;height:20px;color:#333">    偶数</div>

        <div style="background:#333;width:100%;height:20px;color:#eee">    奇数</div>

        <div style="background:#eee;width:100%;height:20px;color:#333">    偶数</div>

        <div style="background:#333;width:100%;height:20px;color:#eee">    奇数</div>

    </body>

</html>

9、style的写法:

在对style样式进行修改时,与script相同,也可使用 . 对其进行编辑,之后对不同的标签在其后面加{},大括号里写css语句1,并使用 ; 隔开

html

    head

        meta(charset="utf-8")

        title jade测试页面

        style.

            body{margin:0;padding:0}

            div

            {width: 100px;height: 100px;background: #ccc;text-align: center;line-height: 100px;margin: 10px auto}

            div.last{clear:left}

    body

        -var a=0;

        while a<12

            if a%2==0 && a!=0

                div.last=a++

            else

                div=a++

得到:

<html>

  <head>

    <meta charset="utf-8"/>

    <title>jade测试页面</title>

    <style>

      body{margin:0;padding:0}

      div

      {width: 100px;height: 100px;background: #ccc;text-align: center;line-height: 100px;margin: 10px auto}

      div.last{clear:left}

    </style>

  </head>

  <body>

    <div>0</div>

    <div>1</div>

    <div class="last">2</div>

    <div>3</div>

    <div class="last">4</div>

    <div>5</div>

    <div class="last">6</div>

    <div>7</div>

    <div class="last">8</div>

    <div>9</div>

    <div class="last">10</div>

    <div>11</div>

  </body>

</html>

10、Mixin

Mixin的作用是对模块的复用,当重复代码有不同内容时,起作用就来了:

- var num = 0;

mixin node

    div The number in mixin node is #{num++}

+node()

+node()

+node()

div At last, the number in mixin node is #{num++}

得到:

<div>The number in mixin node is 0</div>

<div>The number in mixin node is 1</div>

<div>The number in mixin node is 2</div>

<div>At last, the number in mixin node is 3</div>

以上则是jade的一些常用语法,如果平常使用jade作为开发,那么这些是非常基础的,也希望大家有所体会

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

推荐阅读更多精彩内容