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

简介: (28)jade的简单说明 正好我也是刚学,我会尽量结合实例和效果进行说明,如果有多种方式的话,我会尽量都写到。(另外,或许因为版本问题,有些结果和之前是有一定差异的,我写的都是经过我测试,目前最新版本Express所使用的jade)。 注:jade的文件创建,同   ①对照的两端代码: HTML版: <!DOCTYPE html><html&g


(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

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


目录
相关文章
|
9天前
|
JavaScript 前端开发 搜索推荐
从零开始:用Python和Vue开发个人博客
【4月更文挑战第10天】本文指导无技术背景的读者使用Python和Vue从零开始搭建个人博客。选择Python的Django框架因其易学和高效,通过环境搭建、创建Django项目和应用、定义数据模型、构建Vue前端、整合前后端及部署博客等步骤,逐步实现个人博客的建立。这个过程不仅帮助你分享知识和观点,同时也助力提升编程技能。
|
4月前
|
JavaScript 前端开发
Nodejs 第六章(npx)
Nodejs 第六章(npx)
44 0
|
6月前
|
JavaScript 前端开发 API
Vue.js入门指南:从基础到进阶,掌握现代JavaScript框架的核心概念与高级特性(2W字小白教程)
Vue.js入门指南:从基础到进阶,掌握现代JavaScript框架的核心概念与高级特性(2W字小白教程)
63 0
|
8月前
|
JavaScript 前端开发 中间件
Nodejs 学习
Nodejs 学习
43 0
|
前端开发 JavaScript IDE
千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)
我曾经多次向人推荐Vim,其热情程度有些类似现在卖保险的,有的时候,人们会因为一些弥足珍贵的美好暗暗渴望一个巨大的负面,比如因为想重温手动挡的快乐而渴望买下一辆二十万公里的老爷车,比如因为所谓完美的音质而舍不得一个老旧的有线耳机,比如因为一个铜炉火锅而期待北京那漫长而寒冷的冬天。
千姿百态,瞬息万变,Win11系统NeoVim打造全能/全栈编辑器(前端/Css/Js/Vue/Golang/Ruby/ChatGpt)
|
XML 人工智能 前端开发
前端框架:第三章:NodeJS的安装与配置
前端框架:第三章:NodeJS的安装与配置
前端框架:第三章:NodeJS的安装与配置
|
JavaScript 前端开发 Java
Nodejs 入门基础
Nodejs 入门基础
110 0
|
Web App开发 缓存 开发框架
Vue05之ElementUI入门+nodejs环境搭建+运行nodejs项目
Vue05之ElementUI入门+nodejs环境搭建+运行nodejs项目
Vue05之ElementUI入门+nodejs环境搭建+运行nodejs项目
|
前端开发 JavaScript
svelte教程(1)简介
什么是svelte? Svelte是用于构建快速Web应用程序的工具。 它类似于React和Vue这样的JavaScript框架。但是有一个关键的区别:Svelte在构建时将您的svelte代码转换为理想的JavaScript 代码,而不是在运行时解释您的代码。
2034 0