Nodejs Jade 模板引擎使用

Nodejs Jade 模板引擎使用

  • 在 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

其上的 jade 模板会被解析成

<p>hello jade</p>

虽然平常我们修改 node.js 代码之后需要重启来查看变化,但是 jade 引擎不在此列,因为是动态加载的,所以我们修改完 jade 文件之后可以直接刷新网页来查看效果的。

如果文本比较长可以使用

p
  | foo bar baz
  | rawr rawr

或者

p.
  foo bar baz
  rawr rawr

两种情况都可以处理为

<p>foo bar baz rawr rawr</p>

jade 变量调用

jade 的变量调用有 3 种方式

    1. #{表达式}
    1. =表达式
    1. !=表达式

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

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

会被渲染成为

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

以下代码效果相同

- var s = 'world'
p hello #{s}
p= 'hello' + s

方式1可以自由的嵌入各个地方 方式2返回的是表达式的值 = 与 方式3 != 雷同,据说前者会编码字符串,如 <stdio.h> 变成 <stdio.h> 后者不会,不过博主没试出来不知道什么情况。

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

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

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

if 判断

<h2>方式1</h2>

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

<h2>方式2</h2>

上述的方式有种省略写法

- var user = { description: '我喜欢猫' }
#user
  if user.description
    h2 描述
    p.description= user.description
  else
    h1 描述
    p.description 用户无描述

<h2>方式3</h2>

使用 Unless 类似于 if 后的表达式加上了 ! 取反

- var user = { name: 'Alan', isVip: false }
unless user.isVip
  p 亲爱的 #{user.name} 您并不是 VIP

结果

<p>亲爱的 Alan 您并不是 VIP</p>

注意这个 unless 是 jade 提供的关键字,不是运行的 js 代码

循环

<h2>for 循环</h2>

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

<h2>each</h2> 同样的 jade 对于循环液提供了省略 “-” 减号的写法

ul
  each val, index in ['西瓜', '苹果', '梨子']
    li= index + ': ' + val

结果

<ul>
  <li>0: 西瓜</li>
  <li>1: 苹果</li>
  <li>2: 梨子</li>
</ul>

该方法同样适用于 json 数据

ul
  each val, index in {1:'苹果',2:'梨子',3:'乔布斯'}
    li= index + ': ' + val

结果:

<ul>
  <li>1: 苹果</li>
  <li>2: 梨子</li>
  <li>3: 乔布斯</li>
</ul>

Case

类似 switch 里面的结果,不过这里的 case 不支持case 穿透,如果 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

结果:

<p>you have a friend</p>

在模板中调用其他语言

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

再来搬运一发,原文地址:http://www.lellansin.com/Jade-模板引擎使用.html


22 回复

Node.js Jade 模板引擎使用

Jade 是一个简洁高效的模板引擎,它在 Node.js 中被广泛使用,尤其是在 Express 框架中。本文将详细介绍如何在 Express 中使用 Jade 模板引擎,并涵盖变量调用、条件判断、循环、选择语句、调用其他语言、可重用的 Jade 块(Mixins)、模板包含(Includes)以及模板引用(Extends)。

在 Express 中调用 Jade 模板引擎

首先,我们需要在 Express 应用中设置 Jade 作为视图引擎:

var express = require('express');
var http = require('http');
var app = express();

// 设置模板引擎为 Jade
app.set('view engine', 'jade');

// 设置模板文件存放的目录
app.set('views', __dirname);

// 定义路由
app.get('/', function(req, res) {
    res.render('test'); // 渲染当前目录下的 test.jade 模板
});

// 创建 HTTP 服务器
var server = http.createServer(app);
server.listen(3002);
console.log('server started on http://127.0.0.1:3002/');

test.jade 文件内容如下:

p hello jade

上述 Jade 模板会被解析成 HTML:

<p>hello jade</p>

Jade 变量调用

Jade 支持多种变量调用方式,包括 #{表达式}=表达式!=表达式。这些方式分别用于不同的场景。

- var s = 'hello world';
p #{s}  // 直接插入变量值
p= s    // 输出变量值

以上代码会被解析为:

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

if 判断

Jade 提供了多种 if 判断方式,包括标准的 if-else 结构、省略写法以及 unless(相当于 if 表达式取反)。

- var user = { description: '我喜欢猫' };
#user
  if user.description
    h2 描述
    p.description= user.description
  else
    h1 描述
    p.description 用户无描述

结果:

<div id="user">
  <h2>描述</h2>
  <p class="description">我喜欢猫</p>
</div>

循环

Jade 支持 for 循环和 each 循环,可以方便地遍历数组或对象。

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

// 使用 each 循环
ul
  each val, index in ['西瓜', '苹果', '梨子']
    li= index + ': ' + val

结果:

<ul>
  <li>0: 西瓜</li>
  <li>1: 苹果</li>
  <li>2: 梨子</li>
</ul>

Case 选择

Jade 提供了类似于 switch 的 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>

在模板中调用其他语言

Jade 允许你在模板中调用其他语言,如 Markdown 和 CoffeeScript。

:markdown
  # Markdown 标题
  这里使用的是 MarkDown 格式

script
  :coffee
    console.log '这里是 coffee script'

结果:

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

可重用的 Jade 块 (Mixins)

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>

模板包含 (Includes)

你可以使用 Includes 在模板中包含其他模板的内容。

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

结果:

<!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
block content
  h1 文章列表
  p 习近平忆贾大山 李克强:将启动新核电项目
  p 朴槿惠:"岁月号"船长等人弃船行为等同于杀人
  p 普京疑换肤:眼袋黑眼圈全无 领导人整容疑云
  p 世界最大兔子重45斤长逾1米 1年吃2万元食物

结果:

<html>
  <head>
    <title>我的网站</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"></script>
  </head>
  <body>
    <h1>文章列表</h1>
    <p>习近平忆贾大山 李克强:将启动新核电项目</p>
    <p>朴槿惠:"岁月号"船长等人弃船行为等同于杀人</p>
    <p>普京疑换肤:眼袋黑眼圈全无 领导人整容疑云</p>
    <p>世界最大兔子重45斤长逾1米 1年吃2万元食物</p>
  </body>
</html>

以上是 Jade 模板引擎的基本使用方法,希望对大家有所帮助。


Nice!

不错 啊,最近正在学,楼主还有没有jade的相关资料。。

fucking so good

so fucking good

如果加上个ejs的教程更好,jade这个感觉不太习惯

请问,express项目里的jade要用过滤器:markdown 该怎么配置呢?

mark

这个的优点似乎没有写出来

比较明了

Jade 不是已经改名了吗…?

sss

来自酷炫的 CNodeMD

Node.js Jade 模板引擎使用

Jade(现在称为Pug)是一种简洁且功能强大的模板引擎,用于生成HTML。下面是一些在Node.js中使用Jade的常见场景。

在Express中调用Jade模板引擎

首先,我们需要设置Express框架,并配置模板引擎为Jade。

var express = require('express');
var http = require('http');
var app = express();

// 设置模板引擎为Jade
app.set('view engine', 'jade');

// 设置模板文件夹
app.set('views', __dirname);

app.get('/', function(req, res) {
    res.render('test', { message: 'Hello Jade!' });
});

var server = http.createServer(app);
server.listen(3002);
console.log('Server started on http://127.0.0.1:3002/');

对应的 test.jade 文件:

p #{message}

这将生成HTML:

<p>Hello Jade!</p>

Jade变量调用

Jade支持多种变量调用方式:

- var s = 'world';
p hello #{s}       // 直接插入变量
p= s               // 返回变量的值
p!= s              // 原样输出变量,不进行转义

if判断

Jade中的条件判断类似于JavaScript:

- var user = { description: '我喜欢猫' };
- if user.description
    h2 描述
    p.description= user.description
- else
    h1 描述
    p.description 用户无描述

简化版:

#user
  if user.description
    h2 描述
    p.description= user.description
  else
    h1 描述
    p.description 用户无描述

循环

Jade支持基本的循环结构:

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

// 或者使用each
ul
  each val, index in ['西瓜', '苹果', '梨子']
    li= index + ': ' + val

Case选择

类似于switch-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

在模板中调用其他语言

Jade支持嵌入其他脚本语言:

:markdown
  # Markdown 标题
  这里使用的是 MarkDown 格式
script
  :coffee
    console.log '这里是 coffee script'

可重用的Jade块 (Mixins)

Jade允许创建可重用的块:

mixin list
  ul
    li foo
    li bar
    li baz

+list()
+list()

模板包含 (Includes)

使用include包含其他模板文件:

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

模板引用 (Extends)

使用extends引用外部的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

在另一个模板中:

extends ../layout
block content
  h1 文章列表
  p 习近平忆贾大山 李克强:将启动新核电项目

通过这些例子,你可以看到Jade模板引擎的强大和灵活性,可以帮助你快速生成复杂的HTML页面。

回到顶部