jade学习笔记

Jade和Sass一样通过空格来控制格式,一般推荐使用tab(2个空格键大小)来进行缩进。

一.Jade 小技巧

:

表示不用换行, 在jade中叫block expansion

li: a(href="#") Home
// 等同于
li
  a(href="#") Home

|

表示这行不用添加任何标签,只有内容存在

示例1:

.glyphicon.glyphicon-email
|  3 days ago
// 表示图标后面直接添加日期

.glyphicon.glyphicon-email
days ago
// 如果省略"|" jade会认为上面的email图标叫days
// 结果只会显示 图标+ ago

示例2:写一个ul>li>a>{文字}

ul
  li(role="presentation")
    a(href="#"): |Home
  li(role="presentation")
    a(href="#"): |Maps

// 利用 : 和 |
// 等同于
<ul>
    <li><a>Home</a></li>
    <li><a>Maps</a></li>
</ul>

添加图标

比如说添加一些fontAwesome图标, 注意下面的a后面的写法

dl
  dd CONTACT US
    dl
      // Twitter前面2个空格
      a(href=""): i.fa.fa-twitter  Twitter
    dl
      a(href=""): i.fa.fa-facebook  Facebook
    dl
      a(href=""): i.fa.fa-google  Google+

相当于

<dl>
    <a href="">
        <i class="fa fa-twitter"></i> Twitter
    </a>
</dl>

二.注释

单行注释

Jade可以像JS一样的注释, 使用

  • //: 在编译出来的html中显示出来
  • //-: 在编译出来的html中不显示出来

比如:

// 注释1
p.
  我们添加一个单行注释,并且注释将在html中显示出来

//- 注释2,这是第二段
p 
  | 我们添加另一个单行注释,这个注释不会在html中显示出来

多行注释

多行注释在单行注释的基础上对注释文字进行缩进即可

//
  这是另一种注释
  这是一个多行注释
p hello world

# 编译结果
<!--
这是另一种注释
这是一个多行注释-->
<p>hello world</p>
# 同样可以通过 //- 来设置在编译之后不显示出来

三.定义变量

jade 作为模板语言,首先将语句转换成js,然后由js生成dom,我们可以像js一样定义变量, 通过 - 来声明一个变量

- var some_text = 'hello world';
- list = ['bob', 'james', 'kobe']
- obj = {'type': 'text', 'value': 'anything'}

变量的使用,是通过类似其它模板语言一样, 使用 #{}.(ES6 中使用${})

p #{some_text}
// 或者
p= some_text
// 都等同于
p 'hello world'

和ES6模板一样,jade模板也可以使用计算操作

p 23 * 10 = #{23 * 10}
// 等同于
p 23 * 10 = 230

在元素属性中使用变量我们需要使用ES6语法:`${variableName}`

// 比如定义变量
- dog = 'mary'
// 在img 元素中
// '#{dog}'是pug语法
// `images/${dog}` 是ES6
img(src=`images/${dog}`, alt=`${dog}`) #{dog}

更多示例:

- base_url = 'http://www.baidu.com' 
a(href='base_url/maps') 百度地图

- i = {'type': 'text', 'name': 'Bob'}
input(tupe='#{i.type}', value='#{i.name}')

- content = 'whatever the content is'

p #{content}
// 或者
p= content

转义

jade为防止XSS攻击, 对于html代码需要进行转义

- html_content = 'hello <em>world</em>'
p= #{html_content}
// 转换成html,变为
<p>hello <em>world<\em></p>
// 在浏览器页面中显示为
<p>hello <em>world</em></p>

转义的方法有以下2种:

p!= html_content
// 或者
p !{html_content}

3.逻辑操作

jade也可以进行一般的逻辑操作和流程控制,主要由以下几个方面:

  • if/else
  • unless/else
  • case...when
  • for loop
  • each
  • while

1.if/else

一般写法:

- name = 'Bob'
- if (name == 'Bob'){
    h1 Hello Bob
- } else {
    h1 My name is #{name} 
- }

还可以进行三元运算:

- name = 'Bob'
- greeting = (name == 'Bob' ?
'Hello': 'My name is')
h1 #{greeting} #{name}

简写方法,这个也是我们一般书写的方法

- name = 'Bob'
if name == 'Bob'
  h1 hello Bob
else
  h1 My name is #{name}

同样, 可以加入 else if:

- name = 'Bob'
if name == 'Bob'
  h1 hello bob
else if name == 'James'
  h1 hello James
else
  h1 my name is #{name}

2.unless...

这个其实就是对条件加一层否定, 等同于 if(!(expr))

- name = 'Bob'
unless name == 'Bob'
  h1 my name is #{name}
else
  h1 hello Bob

3.case...when

这个起始等同于switch...case

- name = 'Bob'
case name
  when 'Bob'
    p Hi Bob!
  when 'Alice'
    p Hi Alice
  default
    p Hello #{name}!

4.for loops

和js中for一样

- list = ['one', 'two', 'three']

ul
  - for (var i = 0, i < list.length; i++) {
      li= list[i]
  - }

// 等同于
ul>li*3

5.Each loops

语法为 each VAL[, KEY] in OBJ, 上面的for循环可写为:

- list = ['one', 'two', 'three']  
ul
  each item in list
    li=item

// 另一个例子
- books = ['A', 'B', 'C']
select
  each book, i in books
    option(value=i) Book name: #{book}

// 写成对象的形式也可以
- books = {'001': 'A', '002': 'B', '003': 'C'}
select
  each book, i in books
    option(value=i) Book name: #{book}

6.while loops

本质上和上面的for loops没有什么差别

- list = ['one', 'two', 'three']
- i = 0

ul
  while i < list.length
    li=list[i]
    i++; // 注意这里的;不能省略

四.Mixins

这个功能和sass中的一样,都是为了代码重用设计的。jade中的mixin有以下几种形式:

1.一般形式

mixin book(name, price)
  li #{name}: #{price}$

使用mixin,用 +

ul#books-list
  +book('Pride and Prejudice', 25.00)
  +book('Jane Eye', 13.67)

2.不带参数的mixin

mixin copyright // 没有参数
  | ©

// 调用   
p
  +copyright
  |  2015-2016

3.传递 block

除了传递参数以外,还可以传递整个块作为mixin,block当作占位符

mixin input(name)
  li(id=name.replace(/\s/g, '-'))
    label= name + ':'
    block    //这里的 block 本质上是占位符

form: ul
  +input('favorite color')
    input('type'='text') // 取代上面的block
  +input('cpmments')
    textarea Type your comment here. // 取代上面的block

4.arguments类数组对象

jade中也可以使用arguments对象,实现mixin参数可变的情况

mixin list()
  ul
    - var args = [].slice.call(arguments);
    for item in args // 注意这里的for...in
      li= item

// 调用
+list('one', 'two', 'three')

五.模板继承

使用Jade可以将页面分成各个小的部分,然后通过 extends, includemixin 组装在一起。

1.blocks 函数

blocks函数在jade中是一个小的容器, 通过block我们可以 追加(append), 向前添加(prepend)取代(replace) 某些内容。其实上面我们已经使用到blocks充当占位符的功能了。

比如:

// layout.jade
doctype html
html
  head
    block scripts
      script(src='jquery.js')
    block styles
  body
    block content
      p there's no content here

等价于:

<doctype html>
<html>
  <head>
    <script src='jquery.js'></script>
  </head>
  <body>
    there's no content here
  </body>
</html>

extends

extends 关键词允许我们指定一个特定的模板扩展其他模板

例如下面表示

1.替代(replace)原有的模板

// page1.jade(假设和layout.jade相同路径)

extends layout // .jade扩展名可以省略

block scripts  // 替代原模板中的 block scripts
  script(src='jquery.js')
  script(src='underscore.js')

block content // 替代原模板中的 block content

等价于

<doctype html>
<html>
  <head>
    <script src='jquery.js'></script>
    <script src='underscore.js'></script>
  </head>
  <body>
  </body>
</html>

2.追加append:

// page2.jade
extends layout

append scripts
  script(src='underscore.js')

block content
// 结果同上

3.向前追加

// page3.jade
extends layout

prepend scripts
  script(src='underscore.js')

block content

// 结果
<doctype html>
<html>
  <head>
    <script src='underscore'></script> // 注意两者的顺序
    <script src='jquery.js'></script>
  </head>
  <body>
    there's no content here
  </body>
</html>

2.include 关键词

通过include关键词是最简单的组合方式,当这样会使语言动态性降低, 当然这也是一种好的方法。可以include 各种类型的文件, 如html, js, css等

比如:

style.css文件

p {
  color: white;
  text-decoration: underline;
}

content.html文件

<h1>includes something</h1>
<p>this is a file for demonstrationg the use of includes</p>

example.jade文件

doctype html
html
  head
    style(type='text/css')
      include style.css
  body
    include content.html

等同于:

<doctype html>
<html>
  <head>
    <style type='text/css'>
        p {
          color: white;
          text-decoration: underline; 
        }
    </style>
  </head>
  <body>
    <h1>includes something</h1>
    <p>this is a file for demonstrationg the use of includes</p>
  </body>
</html>

当然最常用的还是将页面的header, footer等各部分分成各个小的组件来写,来组成一个页面,实现重用

总结

Jade作为模板语言写html感觉还是十分的简洁的,同时语法也十分容易上手,学习成本低,用处大。现在Jade更名为pug了,原来漂亮的兔子图标也没有了,但是语言本身没有太多的变化。

参考连接:

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

推荐阅读更多精彩内容

  • 编译jade index.jade,得到压缩后的代码(也就是没有空格)jade -P index.jade,得到格...
    亲爱的孟良阅读 615评论 0 0
  • Express框架里内嵌了Jade模板引擎。正好项目里也要用到,本篇整理了下Jade的相关用法。 安装与执行 标签...
    张歆琳阅读 25,477评论 8 42
  • Beetl2.7.16中文文档 Beetl作者:李家智 <xiandafu@126.com> 1. 什么是Beet...
    西漠阅读 2,600评论 0 0
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,721评论 1 92
  • 轻轻地泛起新夜雨 窗外玉兰换上白衣 我走出门看见庭院的你 笑里藏些许真情 海棠染红你面庞 挽意潜进我心房 回首相望...
    言星桐阅读 164评论 9 2