本篇内容

  • 在 Express 中调用 jade 模板引擎
  • jade 变量调用
  • if 判断
  • 循环
  • Case 选择
  • 在模板中调用其他语言
  • 可重用的 jade 块 (Mixins)
  • 模板包含 (Includes)
  • 模板引用 (Extends)

在 Express 中调用 jade 模板引擎

var express = require('express');
var http = require('http');
var app = express();
app.set('view engine', 'jade'); // 设置模板引擎
app.set('views', __dirname); // 设置模板相对路径(相对当前目录) app.get('/', function(req, res) {
res.render('test'); // 调用当前路径下的 test.jade 模板
}) var server = http.createServer(app);
server.listen(3002);
console.log('server started on http://127.0.0.1:3002/');

test.jade

p hello jade    //<p>hello jade</p>

如果文本比较长可以使用

p
| foo bar baz
| rawr rawr //或 p.
foo bar baz
rawr rawr //结果为
<p>foo bar baz rawr rawr</p>

标签和属性

传统的HTML标签写尖括号很麻烦,Jade里可以省略尖括号,直接写标签名。标签间的嵌套关系用换行加空格来实现。紧接在标签名后加上.xx或#xx,就能给标签添加css类名和id

doctype html
html
head
body
h1.titleClass#titleID My First Jade Page //编译出来的结果
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1 id="titleID" class="titleClass">My First Jade Page</h1>
</body>
</html>

标签属性的正统写法应该是写入()括号内,多个属性用逗号隔开(css类名和id也可以写入()括号内)

a(href='http://www.adoctors.cn, target='_blank') 我的主页

//编译出来的结果
<a href="http://www.adoctors.cn" target="_blank">我的主页</a>

HTML里最常用的标签就是div了,所以Jade提供了第二种简化写法,如果不写标签名默认就是div:

.divClass#divID 我是一个div

//编译出来的结果
<div id="divID" class="divClass">我是一个div</div>

这里注意一下 =默认会转义内容

p= 'Welcome to wandoujia fe, we want <b>you</b>'
//转换为
<p>Welcome to wandoujia fe, we want &lt;b&gt;you&lt;/b&gt;</p>

如果不想被转义的,在=前面添加!

p!= 'Welcome to wandoujia fe, we want <b>you</b>'
//转换为
<p>Welcome to wandoujia fe, we want <b>you</b></p>

jade 变量调用

  • {表达式}

  • =表达式
  • !=表达式

注意:符号 - 开头在 jade 中属于服务端执行的代码

- console.log('hello'); // 这段代码在服务端执行
- var s = 'hello world' // 在服务端空间中定义变量
p #{s}
p= s //或 - var s = 'world'
p hello #{s}
p= 'hello' + s

会被渲染成为

<p>hello world</p>
<p>hello world</p>

方式1可以自由的嵌入各个地方

方式2返回的是表达式的值

除了直接在 jade 模板中定义变量,更常见的应用是在 express 中调用 res.render 方法的时候将变量一起传递进模板的空间中,例如这样:

res.render(test, {
s: 'hello world'
});

调用模板的时候,在 jade 模板中也可以如上方那样直接调用 s 这个变量

变量中的特殊字符会被转义,如:

- var name = '<script></script>'
| #{name} //结果
&lt;script&gt;&lt;/script&gt;

如要得到不转义的,用!替换#来调用

- var name = '<script></script>'
| !{name} //结果
<script></script>

|其实就是管道,一般也可以定义一段文本

if 判断

//方式1:
- var user = { description: '我喜欢猫' }
- if (user.description)
h2 描述
p.description= user.description
- else
h1 描述
p.description 用户无描述 //结果 <div id="user">
<h2>描述</h2>
<p class="description">我喜欢猫</p>
</div> //方式2:(方式1的简写) - var user = { description: '我喜欢猫' }
#user
if user.description
h2 描述
p.description= user.description
else
h1 描述
p.description 用户无描述 //方式3:
使用 Unless 类似于 if 后的表达式加上了 ! 取反 //unless 是 jade 提供的关键字 - var user = { name: 'Alan', isVip: false }
unless user.isVip
p 亲爱的 #{user.name} 您并不是 VIP //结果 <p>亲爱的 Alan 您并不是 VIP</p>

循环

for循环

- var array = [1,2,3]
ul
- for (var i = 0; i < array.length; ++i) {
li hello #{array[i]}
- } //结果 <ul>
<li>hello 1</li>
<li>hello 2</li>
<li>hello 3</li>
</ul>

each

ul
each val, index in ['西瓜', '苹果', '梨子']
li= index + ': ' + val //或 ul
each val, index in {1:'苹果',2:'梨子',3:'乔布斯'}
li= index + ': ' + val //结果 <ul>
<li>0: 西瓜</li>
<li>1: 苹果</li>
<li>2: 梨子</li>
</ul>

Case

- var friends = 10
case friends
when 0
p you have no friends
when 1
p you have a friend
default
p you have #{friends} friends //结果
<p>you have 10 friends</p> //简写 - var friends = 1
case friends
when 0: p you have no friends
when 1: p you have a friend
default: p you have #{friends} friends

在模板中调用其他语言

:markdown
# Markdown 标题
这里使用的是 MarkDown 格式
script
:coffee
console.log '这里是 coffee script' //结果
<h1>Markdown 标题</h1>
<p>这里使用的是 MarkDown 格式</p>
<script>console.log('这里是 coffee script')</script>

可重用的 jade 块 (Mixins)

//- 申明可重用的块
mixin list
ul
li foo
li bar
li baz //- 调用
+list()
+list() //结果 <ul>
<li>foo</li>
<li>bar</li>
<li>baz</li>
</ul>
<ul>
<li>foo</li>
<li>bar</li>
<li>baz</li>
</ul>

你也可以给这个重用块指定参数

mixin pets(pets)
ul.pets
- each pet in pets
li= pet +pets(['cat', 'dog', 'pig']) //结果 <ul class="pets">
<li>cat</li>
<li>dog</li>
<li>pig</li>
</ul>

Mixins 同时也支持在外部传入 jade 块

mixin article(title)
.article
.article-wrapper
h1= title
//- block 为 jade 关键字代表外部传入的块
if block
block
else
p 该文章没有内容 +article('Hello world') +article('Hello Jade')
p 这里是外部传入的块
p 再写两句 //结果 <div class="article">
<div class="article-wrapper">
<h1>Hello world</h1>
<p>该文章没有内容</p>
</div>
</div>
<div class="article">
<div class="article-wrapper">
<h1>Hello Jade</h1>
<p>这里是外部传入的块</p>
<p>再写两句</p>
</div>
</div>

Mixins 同时也可以从外部获取属性。

mixin link(href, name)
a(class!=attributes.class, href=href)= name +link('/foo', 'foo')(class="btn") //结果
<a href="/foo" class="btn">foo</a>

模板包含 (Includes)

你可以使用 Includes 在模板中包含其他模板的内容。就像 PHP 里的 include 一样。

index.jade

doctype html
html
include includes/head
body
h1 我的网站
p 欢迎来到我的网站。
include includes/foot

includes/head.jade

head
title 我的网站
script(src='/javascripts/jquery.js')
script(src='/javascripts/app.js')

includes/foot.jade

#footer
p Copyright (c) foobar

调用 index.jade 的结果:

<!doctype html>
<html>
<head>
<title>我的网站</title>
<script src='/javascripts/jquery.js'></script>
<script src='/javascripts/app.js'></script>
</head>
<body>
<h1>我的网站</h1>
<p>欢迎来到我的网站。</p>
<div id="footer">
<p>Copyright (c) foobar</p>
</div>
</body>
</html>

模板引用 (Extends)

通过 Extends 可以引用外部的 jade 块,感觉比 include 要好用

layout.jade

doctype html
html
head
title 我的网站
meta(http-equiv="Content-Type",content="text/html; charset=utf-8")
link(type="text/css",rel="stylesheet",href="/css/style.css")
script(src="/js/lib/jquery-1.8.0.min.js",type="text/javascript")
body //注意这句
block content //注意这句

article.jade

//- extends 拓展调用 layout.jade
extends ../layout
block content //注意这句
h1 文章列表
p ***忆贾大山 ***:将启动新核电项目
p ***:"岁月号"船长等人弃船行为等同于杀人
p **疑换肤:眼袋黑眼圈全无 领导人整容疑云
p 世界最大兔子重45斤长逾1米 1年吃2万元食物

res.render(‘article’) 的结果:

<html>
<head>
<title>我的网站</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<link type="text/css" rel="stylesheet" href="/css/style.css"></head>
<script src="/js/lib/jquery-1.8.0.min.js" type="text/javascript"></script>
</head>
<body>
<h1>文章列表</h1>
<p>***忆贾大山 ***:将启动新核电项目</p>
<p>***:"岁月号"船长等人弃船行为等同于杀人</p>
<p>**疑换肤:眼袋黑眼圈全无 领导人整容疑云</p>
<p>世界最大兔子重45斤长逾1米 1年吃2万元食物</p>
</body>
</html>

jade中使用js

script
| window.onload =function(){
| var box =123;
| };
解析后为:
<script>
window.onload =function(){
var box =123;
}
</script>
更方便的方法:
script. //加一个点号,所有的下一级内容都是原样输出
window.onload =function(){
var box =123;
};
另一种方法:通过引入方式来
include a.js //引入a.js文件,格式为字符串,引用路径不加‘’

注意不要空格和tab混用

中文文档:https://pug.bootcss.com/api/getting-started.html

Jade(Pug) 模板引擎使用文档的更多相关文章

  1. pug模板引擎(原jade)

    前面的话 为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示 在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致 ...

  2. JSP利用freemarker生成基于word模板的word文档

    利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...

  3. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  4. poi根据模板导出word文档

    POI结构与常用类 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...

  5. 使用Spire.Doc组件利用模板导出Word文档

    以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...

  6. 使用freemarker模板生成word文档

    项目中最近用到这个东西,做下记录. 如下图,先准备好一个(office2003)word文档当做模板.文档中图片.姓名.性别和生日已经使用占位符代替,生成过程中将会根据实际情况进行替换. 然后将wor ...

  7. JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)

    1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...

  8. JAVA Asponse.Word Office 操作神器,借助 word 模板生成 word 文档,并转化为 pdf,png 等多种格式的文件

    一,由于该 jar 包不是免费的, maven 仓库一般不会有,需要我们去官网下载并安装到本地 maven 仓库 1,用地址   https://www-evget-com/product/564  ...

  9. java通过word模板生成word文档

    介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱 ...

随机推荐

  1. ssm+dubbo/zk

    1.原始 Connection conn = null; String url = "jdbc:mysql://localhost:3306/emps?user=root&passw ...

  2. 分享知识-快乐自己:solr 伪集群搭建

    前言:在你搭建集群之前先去搭建一个单机版的 跳转 Solr 集群构建图: 1):部署(4个)Tomcat 下载 更改每一个 tomcat 启动端口号: [root@VMSolr tomcat_clus ...

  3. 一种解决 MacBook 里的 App Store 无法登录的问题

    刚刚买回来的 2018 款带有 touchbar 的 MacBook Pro 15 inc 在用 App Store 安装 app 时一直无法登录成功(网络链接都是好的),导致软件都无法更新,折腾了挺 ...

  4. Struts2 - ModelDriven 拦截器、Preparable 拦截器

    开篇:拦截器在Struts中的作用 在我们的web.xml中,我们配置了一个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类.一旦接受到任意action的请求,该 ...

  5. 根据sid或sqlID查询SQL

    根据sid查询已经执行过的sql select sql_text from v$sqlarea a,v$session b where a.SQL_ID=b.PREV_SQL_ID and b.SID ...

  6. Java Main Differences between HashMap HashTable and ConcurrentHashMap

    转自这篇帖子:http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以 ...

  7. ACM学习历程—HDU5490 Simple Matrix (数学 && 逆元 && 快速幂) (2015合肥网赛07)

    Problem Description As we know, sequence in the form of an=a1+(n−1)d is called arithmetic progressio ...

  8. bzoj 3671 随机数生成器 —— 暴力

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 原来256M是可以开两个3e7的数组的: 因为答案只有 n+m-1 个数,所以暴力判断 ...

  9. UVa11624(逃离火焰问题)

    #include"cstdio" #include"queue" #include"cstring" using namespace std ...

  10. 关于系统中:/dev/mem

    1)参考:https://blog.csdn.net/lsn946803746/article/details/52948036   博主:lsn946803746 2)参考:https://blog ...