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 &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

原文地址:https://www.cnblogs.com/adoctors/p/9216008.html

时间: 2024-08-05 01:58:13

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

pug模板引擎(原jade)

前面的话 为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示 在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致DOM结构的混乱甚至是错误.所以,有人发明了HAML,它最大的特色就是使用缩进排列来代替成对标签.受HAML的启发,pug进行了javascript的实现. Pug原名不叫Pug,是大名鼎鼎的jade,后来由于商标的原因,改为Pug,哈巴狗.其实只是换个名字,语法都与jade一样.丑话说在前面,Pu

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

使用模板生成word文档

使用poi-tl根据模板生成word文档,在porm.xml中添加poi-tl依赖,直接上代码 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.render.RenderAPI; import com.thinkge

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

以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件.开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的:但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题.最终找到了Spire.Doc组件,轻松实现! Spire的官网地址:https:

java通过word模板生成word文档

介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱于是采用这个,正常生成成功了还挺高兴的于是修改优化部署测试,出问题了,由于我一直使用wps可以正常打开,但是同事使用office打不开,于是各种查找原因都没好,于是只能转变思路又试了两种还是不好用,直到发现这款模板生成 poi-tl 真的做的很不错,而且是国人写的,关于学习这个东西还是看官方文档的好

Java iText使用PDF模板生成PDF文档

我们系统需要生成一个可以打印的PDF文档,老板给了我一个Word文档,按照这个Word文档的格式生成PDF文档. 第一步:下载AdobeAcrobat DC,必须使用这个来制作from域. 第二步:使用AdobeAcrobat DC将Word导成PDF文档. 第三步:由于还要加水印的效果,所以还是使用AdobeAcrobat DC来添加水印,非常方便: 添加水印的方法:使用AdobeAcrobat DC打开PDF文档,"工具"->"编辑PDF"->&qu

【Win 10应用开发】Adaptive磁贴模板的XML文档结构

在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win 10的API中也是支持的,此外,Win10 App还支持全新的自适应磁贴模板,本文老周就给大家先讲一下基本结构,下一篇文章中咱们再说一说复杂排版. 应用程序的图标可以分为两类:第一类是应用商店上专用的,就是你的应用提交到商店后,给用户看的图标:另一类就是应用本身的一些图标或磁贴. 磁贴其实也就这么

jade模板引擎

jade是使用JavaScript实现,可供nodejs使用的高性能模板引擎(性能高不高,有些争议.姑且称之为高性能吧!).模板引擎有很多,主要使用比较广泛的是jade和ejs,modejs项目默认使用jade作为模板引擎,我也就不多说了至于如何选择,还是得就事论事综合各种因素来考虑.在此不对优缺点进行分析.插一句嘴,ejs的语法更像jsp.asp这样的技术而jade更像python的语法风格,缩进来缩进去,有点绕.不过这并不影响代码的可读性(我是这么认为的).不管是jade还是ejs语法都比较

Node.js开发入门—使用jade模板引擎

在"Node.js开发入门--Express安装与使用"里,我们曾经使用express generator创建了一个HelloExpress网站,express工具为我们生成了基本的目录结构.模板.stylesheet.routers等.虽然那只是一个简单的HelloWorld类的小东西,可里面包含的内容还是有些多了,为了更好的理解Express所支持的jade模板引擎的用法,我们这次提供一个手动创建的小网站,可以显示来访者的IP,并对访问进行计数. 安装jade npm instal