Jade(Pug) 模板引擎使用文档
本篇内容
- 在 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 <b>you</b></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}
//结果
<script></script>
如要得到不转义的,用!替换#来调用
- 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) 模板引擎使用文档的更多相关文章
- pug模板引擎(原jade)
前面的话 为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示 在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致 ...
- JSP利用freemarker生成基于word模板的word文档
利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...
- Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构
分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...
- poi根据模板导出word文档
POI结构与常用类 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI ...
- 使用Spire.Doc组件利用模板导出Word文档
以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...
- 使用freemarker模板生成word文档
项目中最近用到这个东西,做下记录. 如下图,先准备好一个(office2003)word文档当做模板.文档中图片.姓名.性别和生日已经使用占位符代替,生成过程中将会根据实际情况进行替换. 然后将wor ...
- JAVA Freemarker + Word 模板 生成 Word 文档 (普通的变量替换,数据的循环,表格数据的循环,以及图片的东替换)
1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理 ...
- JAVA Asponse.Word Office 操作神器,借助 word 模板生成 word 文档,并转化为 pdf,png 等多种格式的文件
一,由于该 jar 包不是免费的, maven 仓库一般不会有,需要我们去官网下载并安装到本地 maven 仓库 1,用地址 https://www-evget-com/product/564 ...
- java通过word模板生成word文档
介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱 ...
随机推荐
- ssm+dubbo/zk
1.原始 Connection conn = null; String url = "jdbc:mysql://localhost:3306/emps?user=root&passw ...
- 分享知识-快乐自己:solr 伪集群搭建
前言:在你搭建集群之前先去搭建一个单机版的 跳转 Solr 集群构建图: 1):部署(4个)Tomcat 下载 更改每一个 tomcat 启动端口号: [root@VMSolr tomcat_clus ...
- 一种解决 MacBook 里的 App Store 无法登录的问题
刚刚买回来的 2018 款带有 touchbar 的 MacBook Pro 15 inc 在用 App Store 安装 app 时一直无法登录成功(网络链接都是好的),导致软件都无法更新,折腾了挺 ...
- Struts2 - ModelDriven 拦截器、Preparable 拦截器
开篇:拦截器在Struts中的作用 在我们的web.xml中,我们配置了一个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类.一旦接受到任意action的请求,该 ...
- 根据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 ...
- Java Main Differences between HashMap HashTable and ConcurrentHashMap
转自这篇帖子:http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以 ...
- 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 ...
- bzoj 3671 随机数生成器 —— 暴力
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 原来256M是可以开两个3e7的数组的: 因为答案只有 n+m-1 个数,所以暴力判断 ...
- UVa11624(逃离火焰问题)
#include"cstdio" #include"queue" #include"cstring" using namespace std ...
- 关于系统中:/dev/mem
1)参考:https://blog.csdn.net/lsn946803746/article/details/52948036 博主:lsn946803746 2)参考:https://blog ...