日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pug

發(fā)布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pug 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

Pug,原名 Jade, 是一個很流行的 HTML 模板引擎,后來由于 Jade 被注冊為商標(biāo)的原因,改名為 Pug,中文官網(wǎng)在這里。

安裝和使用

npm install pug -g

如果需要使用命令行對 pug 模板進行編譯,還需要安裝 pug-cli

npm install pug-cli -g

Pug 和原來用過的 Smarty 模板、Ractive 模板類似,都是通過一個函數(shù)(Pug中是 pug.compile())將模板便以為 JavaScript 函數(shù),函數(shù)中通過{}傳入變量。最終編譯結(jié)果就是 HTML 代碼。

創(chuàng)建一個 hello.pug

divp Hello Pug

在命令行輸入:

pug hello.pug -w

就會編譯出 hello.html

<div><p>Hello Pug</p> <div>

其中 -w 選項為監(jiān)聽模式,自動相應(yīng)模板的改動并且實時編譯

使用 pug --help 查看命令行幫助

看一些基本的用法:

# 編譯 templates 文件夾下所有模板 $ pug templates# 編譯 foo 文件夾下和 bar 文件夾下的模板至 tmp 文件夾(絕對路徑) $ pug foo bar --out /tmp# 編譯 foo.pug 并美化 html 代碼 $ pug foo.pug -P

在 webtorm 中配置 pug 的 watcher

關(guān)鍵點就是找到 pug.cmd 文件的全局位置:

C:\Users\xxxxx\AppData\Roaming\npm\pug.cmd

其中 xxxx 是用戶名

這樣在 pug 模板的同級目錄下, websotrm就會自動編譯一份 HTML

這樣的缺點是代碼的格式還需要手動調(diào)整,并且 pug 文件改變,HTML 格式又自動變回去了

在 Arguments 增加 -P 參數(shù)也同樣可以美化代碼

在線轉(zhuǎn)換

html2jade 這個網(wǎng)站可以在線將 HTML 代碼轉(zhuǎn)換為 jade 代碼

語法

基礎(chǔ)

pug 模板中省略了 HTML 中的標(biāo)簽<>,并且使用縮進代表包含關(guān)系,標(biāo)簽后空格內(nèi)容表示標(biāo)簽中內(nèi)容

doctype html headmeta(charset='utf-8')title Hello Pug bodydivp Hello Pug

編譯結(jié)果

<!DOCTYPE html> <head><meta charset="utf-8"><title>Hello Pug</title> </head> <body><div><p>Hello Pug</p></div> </body>

標(biāo)簽

Pug知道那個元素自閉合的,當(dāng)然如果想要手動添加,可以直接在標(biāo)簽后緊接一個 / 來聲明此標(biāo)簽是自閉合的

labelinput(type="text")/

: 是一種省略寫法,目的僅僅是節(jié)省空間

label: input(type="text")/

屬性

HTML 標(biāo)簽中的屬性用 () 包圍起來,屬性之間用 , 隔開,屬性值用 ‘’包裹

a(href='//www.baidu.com', title='百度一下') 百度一下

編譯后:

<a href="//www.baidu.com" title="百度一下">百度一下</a>

文本

上面提到了,利用空格分割表示文本,多行文本需要在標(biāo)簽后加 ., 文本內(nèi)容保持同樣縮進

如果文本中還包含標(biāo)簽,則需要直接添加標(biāo)簽

p.line1line2line3 <strong>strong</strong>

編譯后

<p>line1line2line3 <strong>strong</strong> </p>

這種情況一般適用于大段文字的例子,比如 <script> 中的內(nèi)容:

script.(function test() {alert(123)})()

編譯后

<script>(function test() {alert(123)})() </script>

也可以使用 | 來書寫,效果相同

p| line1| line2| line3 <strong>strong</strong>

如果一行的開頭是尖括號 <,那么正行都會當(dāng)做純文本,即便當(dāng)中的內(nèi)容包含 HTML 標(biāo)簽,也會原樣輸出:

<span>123</span>

注釋

單行注釋:

// 這個注釋會被編譯到HTML //- 這個注釋不會被編譯到HTML

塊注釋

//塊注釋塊注釋

IE注釋

<!--[if IE 8]><html class='ie8'><[endif]--> <!--[if IE 9]><html class='ie9'><[endif]--> <!--[if IE]><html class='ie8'><[endif]-->

變量

利用 - 開始一段不直接進行輸入的代碼

- for (var i = 0; i<3; i++) p #{i}

利用 = 開始一段帶有輸出的代碼(注意 = 前后不能有空格)

- for (var i = 0; i<3; i++)p=i

編譯后

<p>1</p> <p>2</p> <p>3</p>

聲明變量使用 -var varName = varValue, 使用變量 #{varName}

- var text='Pug' p Hello #{text}

編譯后

<p>Hello Pug</p>

默認(rèn)情況下,所有屬性都經(jīng)轉(zhuǎn)義,目的是為了防止跨站腳本攻擊等攻擊方式

- var unescaped = '<strong>Hello</strong>' p #{unescaped}

編譯后

<p>&lt;strong&gt;Hello&lt;/strong&gt;</p>

如果需要使用特殊字符,即未經(jīng)過轉(zhuǎn)義的字符, 在引用變量時使用 !{} 代替 #{}(在定義屬性時用 != 代替 =)

- var unescaped = '<strong>Hello</strong>' p !{unescaped}

編譯后

<p><strong>Hello</strong></p>

未經(jīng)定義的變量輸出結(jié)果是空值,而非 undefined

class 可以是一個字符串,也可以是一個包含多個類名的數(shù)組

p(class=['class1', 'class2']) class

編譯后

<p class="class1 class2">class</p>

也可以是一個對象

p(class={class3: false, class4: true}) class

編譯后

<p class="class4">class</p>

類和ID的字面量

類可以使用 .classname 語法來定義, ID 使用 #idname 來定義,在省略標(biāo)簽名是默認(rèn)是 div

// p.class5 class p#id1 id .class6 class

編譯后

<p class="class5">class</p> <p id="id1">id</p> <div class="class6">class</div>

&attributes

&attributes 語法可以將一個對象轉(zhuǎn)化為一個元素的屬性列表。

p#id2(class='class7')&attributes({'data-url': '//www.baidu.com'})

編譯后

<p class="class7" id="id2" data-url="//www.baidu.com"></p>

流程控制

條件控制

可以省略語句開頭的 -, 類似常規(guī)的 JavaScript 語法形式

- var number = function() {return 15};if(number() < 0)p number < 0 else if(number() > 5)p number > 5 elsep number between (0,5)

unless varA 等同于 if(!varA)

就按照字面意思理解,如果不,這樣便于記憶

循環(huán)

使用 each 實現(xiàn)循環(huán)是最常見的方式,第二個參數(shù)就是循環(huán)時的索引值

uleach val in [1,2,3,4,5]li #{val + 'index' + index} // 等同于 li=val + 'index' + index

編譯后

<ul><li>1index0</li><li>2index1</li><li>3index2</li><li>4index3</li><li>5index4</li> </ul>

也可以對對象進行循環(huán)

- var object = {name: 'chow', age:22};uleach value, key in objectli=key + ':' + value

編譯后

<ul><li>name:chow</li><li>age:22</li> </ul>

用于迭代的對象或數(shù)組僅僅是個 JavaScript 表達式,因此它可以是變量、函數(shù)調(diào)用的結(jié)果

each value, key in friends > 110 ? object : ''

可以為 each 添加一個 else 塊,用于當(dāng)被循環(huán)對象無法提供被循環(huán)內(nèi)容時調(diào)用

- var friends = 100 uleach value, key in friends > 110 ? object : ''li=key + ':' + valueelseli nothing

也可以使用 while 來創(chuàng)建循環(huán)

- var n = 0; ulwhile n < 4li= n++

分支條件

case 是 JavaScript 中 switch 中的縮寫

- var friends = 1case friendswhen 1p you only have 1 friendwhen 2p you have 2 friendsdefaultp you have a lot of friends

可以使用塊展開的語法:

- var friends = 11case friendswhen 1: p you only have 1 friendwhen 2: p you have 2 friendsdefault: p you have a lot of friends

包含

相當(dāng)于 JavaScript 中的 import 功能

// - index.pug doctype html htmlinclude includes/head.pugbodyh1 我的網(wǎng)站p 歡迎來到我這簡陋得不能再簡陋的網(wǎng)站。include includes/foot.pug// - includes/head.pug headtitle 我的網(wǎng)站

編譯后:

<!DOCTYPE html> <html><head><title>我的網(wǎng)站</title><script src="/javascripts/jquery.js"></script><script src="/javascripts/app.js"></script> </head><body><h1>我的網(wǎng)站</h1><p>歡迎來到我這簡陋得不能再簡陋的網(wǎng)站。</p><footer id="footer"><p>Copyright (c) foobar</p></footer> </body></html>

被包含的如果不是 Pug 文件,那么就只會當(dāng)作文本內(nèi)容來引入。

scriptinclude say.js// say.js alert('hello');

編譯后:

<script>alert('hello'); </script>

模板繼承

Pug 支持使用 block 和 extends 實現(xiàn)繼承,一個稱之為“塊”(block)的代碼塊,可以被子模板覆蓋、替換。這個過程是遞歸的。

簡單來說就是,b.pug 通過 extends a.pug 關(guān)鍵詞來繼承 a.pug 中的全部代碼,再通過聲明與 a.pug 中相同的 block 來替代原來模板中的內(nèi)容

Pug 允許您去替換(默認(rèn)的行為)、prepend(向頭部添加內(nèi)容),或者 append(向尾部添加內(nèi)容)一個塊。

Pug 模板繼承是一個非常強大的功能,您可以借助它將復(fù)雜的頁面模板拆分成若干個小而簡潔的文件。然而,如果您將大量的模板繼承、鏈接在一起,那么有可能會反而把事情弄得更加復(fù)雜。

Mixin

Mixin 實現(xiàn)了代碼的復(fù)用

mixin myMixinli This should be repeated

編譯后:

uleach n in [1,2,3]+myMixin<ul><li>This should be repeated</li><li>This should be repeated</li><li>This should be repeated</li> </ul>

可以向 myMixin中傳入?yún)?shù)

mixin myMixin(text)li This should be #{text}

編譯后:

uleach n in [1,2,3]+myMixin(n)<ul><li>This should be 1</li><li>This should be 2</li><li>This should be 3</li> </ul>

其實可以將 Mixin 理解為一個函數(shù),返回值是一段 HTML 代碼,每次調(diào)用都會返回相同值

function myMixin(text){return `<li>This should be ${text}</li>` }

也可以通過 block 關(guān)鍵字將外部內(nèi)容傳入到 Mixin 中

mixin article(name)if blockblockelsep 默認(rèn)內(nèi)容 +article p ------------------ +articlep 隨便寫點什么

編譯后:

<p>默認(rèn)內(nèi)容</p> <p>------------------</p> <p>隨便寫點什么</p>

可以向 Mixin 中引入 rest 參數(shù)

mixin rest(name, ...others)each other in othersp='剩余參數(shù)是' + other +rest('old_chow', 1,2,3,4,5) <p>剩余參數(shù)是1</p> <p>剩余參數(shù)是2</p> <p>剩余參數(shù)是3</p> <p>剩余參數(shù)是4</p> <p>剩余參數(shù)是5</p>

當(dāng)然是 arguments 對象在 Mixin 中也是可以使用的

arguments 是傳入函數(shù)的所有參數(shù),rest是對應(yīng)位置的參數(shù)

Vue 中使用 Pug

在 Vue 的單文件組件中的 <template> 中可以使用 Pug 進行模板的編寫(JADE步驟相同)

首先安裝 Pug 依賴

npm install pug pug-loader pug-filters -D

安裝成功后,在 webpack 的配置文件 webpack.base.conf.js 的 modules 中的 rules 節(jié)點下添加如下配置:

{test: /\.pug$/,loader: 'pug' }

這樣,.vue 單文件組件 就支持 Pug 并實時編譯了。

<template lang="pug">ul- var arr = [1,2,3]each value in arrli(id="test" + value) value + {{this.name}} </template> <script>exportdefault {data() {return {name: 'chow'}},computed: {},methods: {},components: {}} </script>

參考

  • https://segmentfault.com/a/1190000006198621
  • https://pug.bootcss.com/api/getting-started.html
  • http://blog.csdn.net/piglet1963/article/details/72723545
  • https://www.cnblogs.com/gudi/p/8080736.html

總結(jié)

以上是生活随笔為你收集整理的Pug的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。