NodeJs——(9)jade的基础和进阶

(28)jade的简单说明

正好我也是刚学,我会尽量结合实例和效果进行说明,如果有多种方式的话,我会尽量都写到。(另外,或许因为版本问题,有些结果和之前是有一定差异的,我写的都是经过我测试,目前最新版本Express所使用的jade)。

注:jade的文件创建,同

 

①对照的两端代码:

HTML版:

<!DOCTYPE html>
<html>
<head><title>Express</title>
    <link rel="stylesheet" href="/stylesheets/style.css">
</head>
<body></body>
</html>

jade版:

doctype html
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body

 

 

②说明:

【1】第一行不解释,直接这么写就行了,知道两行等价就行(等后面就明白意思了);

【2】<html></html>变为了html;

<head></head>变成了head

head相对于html有缩进,head是html的下级标签;

 

最简单直接的说明是:html是树形结构,写在jade里,下级标签比上级标签多缩进一格;

 

如果不懂的继续看下面:

我们知道,html是树形结构的,树的根是html,

然后是head和body两个一级子;

而像title之类,又依赖于head或者body这两个一级子,成为二级子;

然后还有三级子,四级子等,无论如何,下级子肯定会有一个上级的父。

在写HTML的时候,我们为了方便识别,必然是下级子相对于上一级父要多缩进一格。而在jade里,我们也是这么写的;

根节点html不缩进,一级子head和body相对于html缩进一格(2个或者4个空格),二级的title和link标签,是head的子,因此相对于head再缩进一格;

 

然后依次类推,比如某个div是五级子,因此他缩进5格,而input是这个div的子,因此他缩进6格;

 

这样就解释了如何缩进的问题了。

 

 

【3】我们的标签往往会有属性,比如class,或者id,或者name,或者link那样的rel、href等属性。

在写成jade格式时,这些属性需要紧跟标签,比如link或者是div等;

例如:

<link rel="stylesheet" href="/stylesheets/style.css">

写成jade格式就是:

link(rel='stylesheet', href='/stylesheets/style.css')

 

用括号将属性包含起来,用逗号分隔不同的属性。

假如我们要写class、id、name属性,那么就这么写:

div(class="aaa",name="bb",id="cc") ppp

其表示:

<divname="bb" id="cc" class="aaa">ppp</div>

当然,我们也可以这么写:

div#cc.aaa(name="bb") ppp

 

和上面是等价的

 

于是,我们就会简单的jade模板写法了。

 

③其他说明:

以下两个和标签写在一起(中间无空格)

#            表示id

.             表示class,

 

写在括号里的:

class=变量名             可以是一个数组(数组成员需要是字符串)

 

注释:

//           必须写在单独一行,不能写在块内,输出在html时会以注释形式输出

如:

h1!= title
//aaa
div First line.

 

<!--注释内容-->                正常输出,但由于是注释,因此浏览器不会显示

h1!= title
<!--这是一个注释-->
div First line.

 

条件注释,如代码

<!--[if IE]>
div 注释内容
<![endif]-->

 

按照说明,条件注释只有在IE10,和以下版本的浏览器才会支持。

比如if IE 8就是指IE8。具体等实际使用的时候再行查看。

 

输出非转义字符

假如我们需要输出<script><script>这样的字符,方法有

【1】注意,不能省略引号,不然会出错,等号后可以空格也可以不空格;

div= "<script></script>"

 

【2】同样,空格可有可无(如果是!=的话,<script>将被解释为一个标签,即不显示)

- var html = "<script></script>"
div= html

 

【3】但不能用<script></script>来替代html

- var html = "<script></script>"
div This is #{html}

 

【4】使用管道“|”符号

-var m ="<script></script>"
p.
|   #{m}

 

应该除此之外还有其他的,不过我还没搞懂#{},!{},=,!=之间的区别

注:= 、!=之间的区别见进阶版最后

 

(32)jade进阶

①较长的jade文本:

假如有一段文本,有两行(或者实际换行了),那么在jade里我们显然是不能写在一行的;

但是又不能简单的另起一行缩进写,因为这样的话,第一个单词会被认为是标签名。如:

div
     Welcome to #{title},
     this is another row in div

显示结果为:

<div>

       <welcome>toExpress,</welcome>

       <this>is another row indiv</this>

</div>

 

显然不是我们想要的。因此这么做:

【方法一】

div Welcome to #{title},
    | this is another row in div

 

每个新起的一行,都以“|”开头,缩进。

 

显示结果:

<div>Welcometo Express,

this is anotherrow in div</div>

 

正是我们想要的。

 

【方法二】

div.
    Welcome to #{title},
    this is another row in div

 

注意,标签名后以英文句号为结尾,但是后面不跟任何单词(因此不是类名);

内容另起一行(不然同行的无法显示)。

 

 

②jade的变量调用

【方法一】#{表达式}     ——如#{title}

【方法二】=表达式          ——返回表达式的值

【方法三】!=表达式        ——这个的具体效果,参照最后

 

 

③if else判断语句

【1】首先,标签的父子兄弟关系,根据if和else的缩进情况决定;

【2】if else的内部语句,是不能由“{}”包住的。

【3】标签相对于if和else要缩进一格;

【4】if和else,可以以“-”开头,外加一个额外的空格(或者直接以if、else为开头)

【5】if和else的缩进程度要相同(同样的空格数量)

【6】unless关键字表示if的判断语句结果取反。假设原判断语句是unless(a==1),那么相当于if(a!=1)

 

如代码:(title为“Express”,不包含引号)

 

【1】例如:

extends layout

block content
    h1!= title
    div First line.
    if ( title == "express" )
        div.
            Welcome to #{title},
            this is another row in div
    else
        div another line.
    div Last line

输出

Express

First line.

another line.

Last line

【2】例如:

extends layout

block content
    h1!= title
    div First line.
    - if ( title == "express" )
        div.
            Welcome to #{title},
            this is another row in div
    - else
        div another line.
    div Last line

 

输出同上。

 

例如:

extends layout

block content
    h1!= title
    div First line.
    unless ( title == "express" )
        div.
            Welcome to #{title},
            this is another row in div
    else
        div another line.
    div Last line

输出:

Express

First line.

Welcome to Express, this is another row in div

Last line

 

需要注意,unless前面不能有“-”,这点和if else不同。

 

 

④循环语句

【1】for in语句      :

在JavaScript中,for in语句是遍历对象的key,然后根据key值来取得value。

在jade不同!他在for后,有两个参数,第一个参数是遍历获取对象的value,第二个参数才是key。简单来说,如代码:

- var obj = {a:"111",b:"222",c:"333",d:"444"};
for value, key in obj
    div The key is #{key}, the value is #{value}

 

这段代码如果在js中,输出的是a、b、c、d这样。但是在jade里,输出的是:

The key is a, the value is 111

The key is b, the value is 222

The key is c, the value is 333

The key is d, the value is 444

 

说明这里的i是value,而非key。

 

另外,标签的兄弟关系,根据for的缩进情况而定

 

 

【2】for循环

需要在for之前加“-”;

for循环内部的需要缩进,其兄弟关系根据for而定;

可以改变外部变量的值;

如代码:

- var num = 0;
- for(; num < 5; num++)
    div num = #{num}
div At last , the num = #{num}

 

输出内容为:

num = 0

num = 1

num = 2

num = 3

num = 4

At last , the num = 5

 

 

【3】each in

each in和for in几乎是相同的,(事实上我没发现有什么不同)

 

所以略过

 

 

【4】case ,when

类似switch case,但具体还是有所不同。如代码:

- var str = "test"
div The word is #{str},now is case begin.
case str
    when "a": div first when is a
    when "test": div second row is test
    when "b"
        div third when is b
    default: The words is #{str}
div It's end.

 

结果为:

The word is test,now is case begin.

second row is test

It's end.

 

特点:

《1》只执行符合条件的一行(c++的switch中,是从匹配那行开始执行到结尾)

《2》两种写法,标签写在when后面的,用冒号加空格分隔;或者另起一行然后缩进写。

《3》匹配失败的情况下,执行default那行的代码

 

 

⑤过滤器
没看懂,待补充

 

 

⑥Mixin:

简单来说,就是jade里,某一个模块可以复用。比如有一行<div>A line</div>,

如果我想让他连续出现100次,我可以直接使用for循环;

但假如我需要出现30次,然后插入一行代码,再出现10次,再插入一行代码,最后出现60次呢?当然,你可以说可以写3个for循环。

 

那么假如这块div有100行长呢?复制这100行代码去三个地方么?虽然也可以,但显然不美观。

 

因此解决办法是,使用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++}

 

解释:

《1》node是一个html块,可以理解为声明一个html块,在声明时是不会被展现在页面上的。

《2》+node() 是调用这个html块,可以理解为将这个html块插入到某一个位置。他会实质的对变量、页面产生影响。

《3》记得缩进!

《4》显然是可以用for循环的,比如这样

-for (var i = 0 ; i < 10;i++)
  +node()

 

 

⑦模板继承和包含

假如,我们有A模板,然后B、C模板都要复用A模板,我们有两种做法:

【1】在A模板里进行判断,然后决定调用B模板还是C模板;

【2】在B模板和C模板里调用A模板。

 

前者的缺陷在于,假如有不定数个模板要调用A模板,那么A模板会很复杂,所以弃用。

因此,我们通常采用方法【2】。

 

具体做法有:

【方法1】我们需要把B模板嵌套在A模板中:

使用extends

 

在layout.jade里有如下代码:

block content

注意:block是关键字,不能被修改,content可以被修改

 

在index.jade里这么写:

extends layout
block content
    div It's index.jade
block content1
    div It's another line

第一行表示导入layout.jade

第二行表示将第三行(直到遇到第四行这样的代码之前的所有代码),替换到layout中的block content处。

如果在layout中是content1,那么将会调用第四行,将第五行导入其中。

 

 

 

【方法2】我们需要把A模板放在B模板的某个位置

我们需要调用include来做到

 

假如我们有这么一段代码:(当然,为了方便,这里写的很简单)

div The block in test

我们将其放在test.jade之中

 

当需要在其他地方调用时,我们这么写:

div Will include test.jade after this
include test

通过这样的显示,成功调用了test.jade中的模板

显示:

Will include test.jade after this

The block in test

 

注:当在不同路径时,例如在views文件夹(这是当前模板所在文件夹)中的test文件夹下的test1.jade文件,我们这么写就ok了:

include test/test1

 

⑧缩进的标签:

需求:

<div>
       <p>a line with twoindentation</p>
</div>

 

【方法一】

div: p a line with two indentation

注意,第一个div后面有一个英文冒号,然后空格再是p标签

 

 

【方法二】

div
    p a line with two indentation

用缩进来控制

 

 

⑨输出和非输出:

【1】假如我们需要输出一段,那么就使用普通的方式写代码;

【2】假如我们不需要输出一段代码,例如我们对变量的操作,那么就用“-”开头(不含引号)。写在这里的代码将会被正常执行,但是不会被输出到浏览器上。

 

 

⑩转义和非转义

以下每段代码都是这段代码开头:

- var <span style="font-family: Arial, Helvetica, sans-serif;">scr</span>
 = "<script></script>"

【1】

div= <span style="font-family:Arial, Helvetica, sans-serif;">scr</span>

输出

<script></script>

注意,以上是文字形式

 

 

【2】

div!= scr

输出

<script></script>

注意,以上是标签形式

 

【3】

div scr

 

输出:

scr

这里是文字scr

 

总结:

无任何:直接将变量名解释为文字;

有等号:将变量名解释为其值

!=的形式:将变量名解释为其值,然后对其值进行二次解释(解释为html语言)

原文链接(本文CSDN的链接):http://blog.csdn.net/qq20004604/article/details/51773574

(话说这样的链接真的有用?我不知道喔)

时间: 2024-11-10 08:00:32

NodeJs——(9)jade的基础和进阶的相关文章

Java编程那些事儿14——Eclipse基础使用进阶

2.2.4 Eclipse基础使用进阶 熟悉了Eclipse基本的使用以后,下面再补充一下Eclipse其它常见的操作,主要包含以下一些技巧: l分类项目目录 l打开项目 l添加JDK l添加源代码 l快捷键速查 2.2.4.1 分类项目目录 在默认的Eclipse项目目录下,源代码和class文件都存储在项目根目录下,这样项目目录显得比较凌乱,可以通过以下设置来设置项目目录的结构: 菜单"Window">"Preferences-">"Jav

c++-有谁看过《由浅入深学C++—基础、进阶与必做300题》,有问题想请教

问题描述 有谁看过<由浅入深学C++-基础.进阶与必做300题>,有问题想请教 1C 这是系统中的一部分,想要添加人员信息.本书的最后一章<人事管理系统开发实例>有问题请教.里面的Link是个什么东西?代码很长,无法全部粘贴,还望看过此书的人给予帮助. 解决方案 http://baike.baidu.com/link?url=b2nUFFYcHlAdXbDP0i1p87HOUNWR4KHZKpZIOuH3F3ilFc3MI-6DwaL1ThAD8EcXi9zgQoHtWPvPuCy

jQuery基础---Ajax进阶

原文:jQuery基础---Ajax进阶 内容提纲: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 发文不易,转载请注明出处!   在 Ajax 基础一篇中,我们了解了最基本的异步处理方式.本篇来了解一下 Ajax 的一些全局请求事件.跨域处理和其他一些问题. 一.加载请求 在 Ajax 异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长的问题.而超过一定时间的请求, 用户就会变得不再耐烦而关闭页面. 而如果在请求期间能给用户一些提示,比

nodejs+express+jade实现的相册

去年年底迎来了my little star.从此人生多了一个最重要的牵挂.生了宝宝全家人都太忙了.最近宝宝稍微大点了,终于有空可以研究下技术了.这是14年第一帖.废话不多了.开始吧 1.安装NTVS 最为一个资深.NET程序员我还是喜欢用VS来开发(不喜勿喷),使用VS开发node需要开发NTVS.安装NTVS,这个不多说了,已经有人介绍过了.去这里下载吧http://nodejstools.codeplex.com/ 装好后就可以开始了. 2.第一个hello world 新建一个nodejs

jade模板引擎学习笔记(WebsStorm9.0.3+ nodejs+express+jade)

jade环境搭建  jade标签写法  jade注释 jade添加类名.id.属性   jade添加脚本,css jade变量 jade多行文本显示 jade流程代码:for,each,while jade流程代码:if - else - unless ,case 可重用的jade块Mixins 模板继承(extends) 模板包含(include) jade环境搭建       打开WebsStorm9.0.3,File-New Project-,project type选择Node.js E

JavaScript DOM进阶方法_基础知识

DOM自身存在很多类型,在上一章中有介绍,比如Element类型:表示的是元素节点;再比如Text类型;表示的是文本节点; 一 DOM类型 类型名                        说明 Node                 表示所有类型值的统一接口,IE不支持; Document             表示文档类型; Element              表示元素节点类型; Text                 表示文本节点类型; Comment           

Nodejs express框架一个工程中同时使用ejs模版和jade模版_node.js

在某些项目中,比如你接手了一个别人的项目然后你不想用蛋疼的ejs,或者你不想用蛋疼的jade.你有不想重写之前的页面,那么你现在可能需要新引入ejs或者jade模块,你仅仅需要做下面两步也许就能完成使用两个模版的工作 1.consolidate.js cd 到项目目录: npm install consolidate --save 打开项目的app.js(也许你的叫其他名字) 把app.js的形如下面的代码片段 app.set('view engine', 'jade'); 改为 var eng

ES6 你可能不知道的事 - 进阶篇

前言 这篇文章主要会针对上篇未涉及到的进阶特性展开:而与前一篇文章相同,本文主要介绍这些特性的一些容易忽略的部分,希望能对大家正确认识和使用 ES6 有帮助. 还是那句话,时间和能力有限,针对文章中的问题或不同意见,欢迎随时拍砖.指正! 正文 Module 模块化是个进行了很久的话题,发展历程中出现过很多模式,例如 AMD, CommonJS 等等. Module 是 ES6 的新特性,是语言层面对模块化的支持. 与之前模块加载机制不同,Module 是动态的加载,导入的是变量的 只读引用 ,而

小白学数据之NoSQL数据库 进阶篇

写在前面 这篇是小白学数据系列的NoSQL数据库的第二篇:进阶篇.数据分析方向的从业人员可以从中获取数据仓库软件市场的现状和分析,以增加自己的知识储备,为可能的技术转型打基础.而工程师可以找到关于NoSQL主流产品的分析介绍以及选择数据库的一些准则.NoSQL不是万能药,采用技术最好不要跟风,选择适合自己数据和应用的才是最好的哟~没有看过NoSQL基础篇的读者可以在文末的历史文章回顾中找到. ◆ ◆ ◆ 小白问:上次问了NoSQL,SQL的区别,好像有点忘了,我们可以温故而知新一下吗? 答:..