pug的新手指南

468 阅读4分钟

Pug简介

什么是Pug?它是一个用于服务器端Node.js应用程序的模板引擎。

Express能够处理服务器端的模板引擎。模板引擎允许我们向视图添加数据并动态生成HTML。

Pug是一个老东西的新名字。它是Jade 2.0

由于商标问题,该项目在2016年发布第二版时,名字从Jade改为Pug。你仍然可以使用Jade(又名Pug 1.0),但往后最好使用Pug 2.0。

也请看Jade和Pug之间的区别

Express使用Jade作为默认版本。如上所述,Jade是Pug的旧版本--特别是Pug 1.0。

虽然Jade的最后一个版本已经3年了(在撰写本文时,即2018年夏天),但出于向后兼容的原因,它仍然是Express中的默认版本。

Pug的官方网站是pugjs.org/。

帕格看起来怎么样?

p Hello from Flavio

这个模板将创建一个p 标签,内容为Hello from Flavio

正如你所看到的,Pug是相当特别的。它把标签的名字作为一行的第一件事,其余的就是里面的内容了。

如果你习惯于使用HTML和插值变量的模板引擎;比如Handlebars(接下来介绍),你可能会遇到一些问题,特别是当你需要将现有的HTML转换成Pug时。这个从HTML到Jade的在线转换器(与Pug非常相似,但有一点不同)将是一个很大的帮助:https://jsonformatter.org/html-to-jade

安装Pug

安装Pug就像运行npm install 一样简单。

设置Pug为Express中的模板引擎

并在初始化Express应用程序时,我们需要对其进行设置。

const path = require('path')
const express = require('express')
const app = express()
app.set('view engine', 'pug')
app.set('views', path.join(__dirname, 'views'))

你的第一个Pug模板

创建一个关于视图。

app.get('/about', (req, res) => {
  res.render('about')
})

views/about.pug 中的模板。

p Hello from Flavio

这个模板将创建一个p 标签,内容为Hello from Flavio

在Pug中对变量进行插值

你可以用插值法来插值一个变量。

app.get('/about', (req, res) => {
  res.render('about', { name: 'Flavio' })
})
p Hello from #{name}

插值一个函数的返回值

你可以用以下方法插值一个函数的返回值。

app.get('/about', (req, res) => {
  res.render('about', { getName: () => 'Flavio' })
})
p Hello from #{getName()}

为元素添加id和class属性

p#title
p.title

设置doctype

doctype html
html
  head
    meta(charset='utf-8')
    meta(http-equiv='X-UA-Compatible', content='IE=edge')
    meta(name='description', content='Some description')
    meta(name='viewport', content='width=device-width, initial-scale=1')

添加脚本和样式

html
  head
    script(src="script.js")
    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')

    link(rel='stylesheet', href='css/main.css')

内联脚本

script alert('test')

script.
  (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=
  function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;
  e=o.createElement(i);r=o.getElementsByTagName(i)[0];
  e.src='//www.google-analytics.com/analytics.js';
  r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));
  ga('create','UA-XXXXX-X');ga('send','pageview');

循环

ul
  each color in ['Red', 'Yellow', 'Blue']
    li= color

ul
  each color, index in ['Red', 'Yellow', 'Blue']
    li= 'Color number ' + index + ': ' + color

条件语句

if name
  h2 Hello from #{name}
else
  h2 Hello

else-if也可以。

if name
  h2 Hello from #{name}
else if anotherName
  h2 Hello from #{anotherName}
else
  h2 Hello

另一个例子。

if users.length > 2
    each user in users
    ...

设置变量

你可以在Pug模板中设置变量。

- var name = 'Flavio'
- var age = 35
- var roger = { name: 'Roger' }
- var dogs = ['Roger', 'Syd']

递增变量

你可以使用++ 来增加一个数字变量。

age++

将变量分配给元素值

p= name
span.age= age

遍历变量

你可以使用foreach ,它们是可以互换的,没有区别。

for dog in dogs
    li= dog
ul
  each dog in dogs
    li= dog

你可以使用.length 来获得项目的数量。

p There are #{values.length}

while 是另一种形式的循环。

- var n = 0;

ul
  while n <= 5
    li= n++

包括其他Pug文件

在一个Pug文件中,你可以包括其他Pug文件。

include otherfile.pug

定义块

一个组织良好的模板系统会定义一个基本的模板,然后所有其他的模板都从它延伸出来。

模板的一部分可以通过使用块来扩展。

html
  head
    script(src="script.js")
    script(src='//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js')

    link(rel='stylesheet', href='css/main.css')
    block head
  body
    block body
      h1 Home page
      p welcome

在这个例子中,有一个块,body ,有一些内容,而head 没有。head 是用来给标题添加额外的内容,而body 的内容是用来被其他页面覆盖的。

扩展一个基础模板

一个模板可以通过使用extends 关键字来扩展一个基础模板。

extends home.pug

一旦这样做了,你需要重新定义块。模板的所有内容都必须进入块中,否则引擎不知道该把它们放在哪里。

例子。

extends home.pug

block body
  h1 Another page
  p Hey!
  ul
    li Something
    li Something else

你可以重新定义一个或多个块。没有被重新定义的将与原来的模板内容一起保留。

Pug中的注释可以有两种类型:在生成的HTML中可见或不可见。

可见的

内联。

// some comment

块。

//
  some
  comment

不可见

内联。

//- some comment

块状。

//-
  some
  comment