详解Node.js模板引擎Jade入门


Posted in Javascript onJanuary 19, 2018

Jade是Node.js的一个模板引擎,它借鉴了Haml的很多地方,所以语法上和Haml比较相近。并且,Jade也支持空格。

1、标签

在Jade里,一行开头的任何文本都被默认解释成HTML标签。并且你只需要你写开始标签——注意:不需要加“<>”。因为Jade会帮我们渲染闭合和开始标签。例如:

body 
  div 
    h1 Jade是Node.js的一个模板引擎
    p  它借鉴了Haml的很多地方,所以语法上和Haml比较相近。
  div 
    footer © Pandora

上面的Jade模板最终渲染出的HTML代码是:

<body>
  <div>
    <h1> Jade是Node.js的一个模板引擎</h1>
    <p>它借鉴了Haml的很多地方,所以语法上和Haml比较相近。</p>
  </div>
  <div>
    <footer>© Pandora</footer>
  </div>
</body>

注意:如果没有写标签名,则默认就是div标签。

2、变量/数据

传给Jade模板的数据我们称之为locals。 使用等号“=”来输出一个变量的值。

(locals):

{
  title: "Express.js Guide",
  body: "The Comprehensive Book on Express.js"
}

Jade code :

h1= title
p= body

渲染输出的HTML :

<h1>Express.js Guide</h1>
<p>The Comprehensive Book on Express.js</p>

3、读取变量

Jade中读取变量的值是通过#{name}来实现的。例如:

- var title = "Node"

p I love #{title}

在模板被编译时变量的值就会被处理,所以,不要在可执行JavaScript(-)里使用它。

4、属性

属性紧跟在标签之后,且用“()”括起来,多属性用“,”分隔。例如:body (name1 = “value1”, name2 = “value2”)。

div(id="content", class='main')
  a(href='http://csdn.net', title='csdn主页', target='_blank') CSDN:中国软件联盟
  form(action="/login")
    button(type="submit", value="提交")

输出:

<div id="content" class='main'>
  <a href='http://csdn.net' title='csdn主页' target='_blank'> CSDN:中国软件联盟</a>
  <form action="/login">
    <button type="submit" value="提交">
  </form>
</div>

动态属性:

动态属性即属性的值是动态的,即用一个变量来表示属性的值。符号“|”可以在新的一行里写HTML节点内容。例如:

a(href=url, data-active=isActive)
label
  input(type="checkbox", checked=isChecked)
  | yes / no

提供给上面模板的数据:

{
  url: "/logout",
  isActive: true,
  isChecked: false
}

最终渲染后输出的HTML:

<a href="" data-active=" rel="external nofollow" data-active"></a>
<label>
  <input type="checkbox" />yes / no
</label>

注意:属性值为false的属性在输出HTML代码时将被忽略;而没有传入属性值时,将默认为true.

5、字面量

为了省事,可以直接在标签名之后写类名和ID名。例如:

div#content
  p.lead.center
    | Pandora_galen
    #side-bar.pull-right // 没有标签名,默认为“div”
    span.contact.span4
      a(href="/contact" rel="external nofollow" rel="external nofollow" ) contact me

渲染输出的HTML:

<div id="content">
  <p class="lead center">
  Pandora_galen
  <div id="side-bar" class="pull-right"></div>
  <span class="contact span4">
    <a href="/contact" rel="external nofollow" rel="external nofollow" > contact me </a>
  </span>
</div>

6、文本

使用“|”符号输出原始文本。

div 
  | 我两年前开始学习前端
  | 在此之间,我学过了html, jQuery, JavaScript, Python, Css3, HTML5, Bootstrap, D3.js, SVG...而现在我在学Node。并且我已经深深的爱上了前端。

7、Script 和 Style块

使用“.”符号在HTML里创建

script.
  console.log("Hello world!");
  setTiemout(function() {
    window.location.href = "http://csdn.net"
  }, 1000);

  console.log("Good bye!");

生成的代码:

<script>
  console.log("Hello world!");
  setTiemout(function() {
    window.location.href = "http://csdn.net"
  }, 1000);

  console.log("Good bye!");
</script>

同理,style.生成的是<style></style>。

8、JavaScript代码

使用-,=或!=这三个符号在Jade中写可以操纵输出的可执行JS代码。这在要输出HTML元素和注入JavaScript时是很有用的。不过,这么做一定要小心避免跨站脚本(XSS)的攻击。

比如,可以使用!=定义一个array, 输出标签数据:

- var arr = ['<a>', '<b>', '<c>']
ul
  -for (var i = 0; i < arr.length; i++)
    li
      span= i
      span!= "unescaped:" + arr[i] + "vs."
      span= "escaped:" + arr[i]

生成的代码如下:

<ul>
  <li><span>0</span><span>unescaped: <a>vs. </span><span>escaped: <a></span></li>
  <li><span>1</span><span>unescaped: <b>vs. </span><span>escaped: <b></span></li>
  <li><span>2</span><span>unescaped: <c>vs. </span><span>escaped: <c></span></li>
</ul>

模板引擎Jade和Handlebars的一个主要的区别就是: Jade允许在代码里写几乎所有的JavaScript ; 但是,Handlebars则限制了开发人员只能使用少量的内置和自定义的helpers。

9、注释

Jade的注释有两种:

<1>. 输出到页面的——“//”
<2>. 不输出到页面的—— “//-”

// 普通注释,会输出到渲染后生成的HTML页面
p Hello Jade content

//- 特殊注释,不会输出到HTML页面
p (id="footer") copyright 2016

输出:

<!-- 普通注释,会输出到渲染后生成的HTML页面 -->
<p> Hello Jade content </p>

<p id="footer">copyright 2016</p>

10、if 语句

给if语句加个前缀-,这样就可以写标准的JavaScript代码了; 也可以不用前缀、不用括号,当然后者更简洁。

- var user = {}
- user.admin = Math.random() > 0.5

if user.admin
  button(class = "launch") Launch Spacecraft
else 
  button(class = "login") Log in

此外,还有unless, 它相当于不或者!。

注意: 每行的代码结尾处并没有分号“;”

11、each语句

在Jade里迭代很简单,只需要使用each语句就行了。

- var language = ['JavaScript', 'Node', 'Python', 'Java']
div
  each value, index in language
    p= index + "," + value

输出:

<div>
  <p>0. JavaScript</p>
  <p>1. Node</p>
  <p>2. Python</p>
  <p>3. Java</p>
</div>

示例2:

- var language = ['JavaScript': -1, 'Node': 2, 'Python': 3, 'Java': 1]

div 
  each value, key in languages
    p= key + ":" + value

输出:

<div>
  <p>JavaScript: -1</p>
  <p>Node: 2</p>
  <p>Python: 3</p>
  <p>Java: 1</p>
</div>

12、过滤器

过滤器的作用是: 用另一种语言来写一个文本块;

p
  :markdown
    # practical Node.js
    [This book](http://csdn.net) really helps to grasp many coponents needed for modern-day web development.

注意: 要想使用Markdown过滤器,需要安装Markdown模块,以及Marked和Markdown NPM包。

13、case

- var coins = Math.round(Math.random() * 10)

case coins
  when 0
    p You have no money
  when 1
    p You have a coin
  default
    p You have #{coins} coins!

14、Function mixin

如果你使用过sass又或者compass的mixin你肯定不会陌生,而Jade 里mixin的使用方法和它们基本相同。

声明的语法: mixin name(param, param2, …….)

调用: +name(data)

mixin row(items)
  tr
    each item, index in items
      td= item

mixin table(tableData)
  table
    each row, index in tableData
      +row(row)

- var node = [{name: "express"}, {name: "Jade"}, {name: "Handlebars"}]
+table(node)

- var js = [{name: 'backbone'}, {name: 'angular'}, {name: "emberJS"}]
+table(js)

输出:

<table>
  <tr>
    <td>express</td>
  </tr>
  <tr>
    <td>Jade</td>
  </tr>
  <tr>
    <td>Handlebars</td>
  </tr>
</table>

<table>
  <tr>
    <td>backbone</td>
  </tr>
  <tr>
    <td>angular</td>
  </tr>
  <tr>
    <td>emberJS</td>
  </tr>
</table>

15、include

include与引入JS和CSS外部文件很相似。它是自顶向下的方法: 在include其它文件的主文件里,我们决定要用什么。主文件会被首先处理(可以在主文件了定义数据locals),然后才会再接着处理主文件里所包含进来的子文件(子文件里可以使用主文件中定义的数据locals);

包含一个Jade模板,用include /path/filename.

例如,在文件A里:

include ./includes/header

注意: 这里不用给模板名以及路径添加双引号或者单引号。

再例如,从父目录开始查找:

include ../includes/footer

注意:不能再文件名和文件路径中使用变量,因为includes/partials是在编译时处理的,而不是在执行时。

对于使用Sass、Compass又或者Less的人这些事再熟悉不过的了。

16、extend

extend与include“唱对台戏”,正好相反,extend是一种自底向上的方法。它所包含的文件决定它要替换主文件中哪那一部分。

使用格式: extend filename 和 block blockname;

示例-1: 在文件file_a里:

block header
  p some default text
block content
  p loading...
block footer
  p copyright

示例-2: 在文件file_b里:

extend file_a
block header
  p very specific text
block content
  .main-content

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery setTimeout()函数使用方法
Apr 07 Javascript
moment.js轻松实现获取当前日期是当年的第几周
Feb 05 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
Apr 25 Javascript
PHP+mysql+Highcharts生成饼状图
May 04 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
Jun 12 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
Vue分页组件实例代码
Apr 17 Javascript
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
React 实现拖拽功能的示例代码
Jan 06 Javascript
基于Vue插入视频的2种方法小结
Apr 02 Javascript
JS实现简单的表格增删
Jan 16 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 Javascript
JS实现碰撞检测的方法分析
Jan 19 #Javascript
angular1配合gulp和bower的使用教程
Jan 19 #Javascript
浏览器调试动态js脚本的方法(图解)
Jan 19 #Javascript
Angular实现搜索框及价格上下限功能
Jan 19 #Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 #Javascript
web前端vue实现插值文本和输出原始html
Jan 19 #Javascript
解决Linux无法正常安装与卸载Node.js的方法
Jan 19 #Javascript
You might like
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
探讨PHP删除文件夹的三种方法
2013/06/09 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
JavaScript代码复用模式实例分析
2012/12/02 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
js实现放大镜特效
2017/05/18 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
2018/08/30 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
python黑魔法之编码转换
2016/01/25 Python
python 排序算法总结及实例详解
2016/09/28 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
初中生期末考试的自我评价
2013/12/17 职场文书
优质服务演讲稿
2014/05/14 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
2014年度培训工作总结
2014/11/27 职场文书
建筑工程催款函
2015/06/24 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
 python中的元类metaclass详情
2022/05/30 Python