基於express+mongodb+pug的博客系統——pug篇

来源:http://www.cnblogs.com/mcbai/archive/2017/05/14/6849003.html
-Advertisement-
Play Games

很久之前就想自己搭一個博客了,最開始用hexo+github,但是換電腦後總是有些麻煩。後來使用WordPress,但是用WordPress總覺得沒什麼技術含量,前後端都是人家寫好的,而且買的垃圾虛擬機老是出問題,動不動就要提交工單解決,所以最後乾脆就直接在博客園上寫了。 最近比較閑,所以正好抽時間 ...


很久之前就想自己搭一個博客了,最開始用hexo+github,但是換電腦後總是有些麻煩。後來使用WordPress,但是用WordPress總覺得沒什麼技術含量,前後端都是人家寫好的,而且買的垃圾虛擬機老是出問題,動不動就要提交工單解決,所以最後乾脆就直接在博客園上寫了。

最近比較閑,所以正好抽時間簡單看了下node.js,然後看了看express,順便搭了個博客出來練手。當然也不僅是單純的練手,更多的算是一種探路或者摸索吧,因為公司雖然有大牛,但更多的是忙於應付業務,基本上是沒時間去學學新的東西來嘗試解決我們在開發中遇到的各種問題,這其中就包括比如重覆書寫大量相同代碼,後期維護困難等。

在此之前,我也沒有真正寫過後臺項目,雖然在學校用PHP+MySQL寫過幾個簡單的頁面,但是畢業快一年了,以前的東西都太久沒用,基本都快忘記了。所以現在使用node.js+mongoDB也算是從零開始吧,在寫的過程中,有簡單的去對項目結構等作出一些優化調整,但越往後,理解也就越深,所以更多的乾脆就留著下一版來更改吧。

這一個版本算是初級版本吧,基本功能是全的。不過經過這三個多星期的實際操作和閱讀一些別人的博客,從代碼結構和工程結構方面,都有更深的理解,所以還有很多能夠優化的地方。不過並不打算等到都做好了再寫,而是先把這段時間遇到的坑記錄下來,要不時間越久,忘的也就越多,早點記錄,多少還能留下點什麼,也能幫助其他新手朋友更容易入門。 

這一個版本所用到的庫,包括node框架express4.4X、資料庫mongoDB、模板引擎pug(原jade)。

廢話不多說,進入正題。

我在項目中使用的pug.js是最新2.0版本的。

1.基礎文檔

在pug中沒有結束標簽,需要嚴格使用縮進來表示父子元素之間的關係。

編譯前:

doctype html
html
    head
        title pug基礎

    body
        p.text 必須嚴格使用縮進,來表明父子和兄弟元素間的關係

編譯後:

<!DOCTYPE html>
<html>
    <head>
        <title>pug基礎 </title>
    </head>

    <body>
        <p class="text">必須嚴格使用縮進,來表明父子和兄弟元素間的關係</p>
    </body>
</html>

2.內容渲染(插值)

各個模板引擎渲染方法都差不多,這裡主要是給大家展示在pug模板里插值的寫法。

方法一:

插入固定字元串,直接在標簽後面敲空格輸入字元串就行

插入變數時,輸出字元使用#{};輸出html代碼使用!{}

在使用大括弧插值時,還支持JavaScript表達式

編譯前:

- var string = "string";
- var html = "<span>htmlString</span>";

p 直接寫插入字元串,只需在標簽後面敲一個空格
p 需要渲染為字元串的變數#{string}
p 大括弧插值也支持JavaScript表達式#{string.toUpperCase()}
p 需要渲染為html代碼的變數!{html}

編譯後:

<p>直接寫插入字元串,只需在標簽後面敲一個空格</p>
<p>需要渲染為字元串的變數string</p>
<p>需要渲染為字元串的變數STRING</p>
<p>需要渲染為html代碼的變數<span>htmlString</span></p>

方法二:

1.使用=插入text

2.使用!=插入html

3.同樣也支持JavaScript表達式

編譯前:

- var string = "string";
- var html = "<span>htmlString</span>"
p 直接寫插入字元串,只需在標簽後面敲一個空格
p= '需要渲染為字元串的變數'+string.toUpperCase()
p!=  '需要渲染為html代碼的變數'+html

編譯後:

<p>直接寫插入字元串,只需在標簽後面敲一個空格</p>
<p>需要渲染為字元串的變數STRING</p>
<p>需要渲染為html代碼的變數<span>htmlString</span></p>

3.屬性

pug模板中給元素添加屬性

簡單添加

編譯前:

a(class='link' href='www.baidu.com') 百度

編譯後:

<a class="link" href="www.baidu.com">百度</a>

一元二次運算

編譯前:

- var active= true
a(class=active? 'link-active' : '' href="www.baidu.com") 百度

編譯後:

<a class="link-active" href="www.baidu.com">百度</a>

class條件

編譯前:

- var currentUrl = '/about'
a(class={active: currentUrl === '/'} href='/') Home
a(class={active: currentUrl === '/about'} href='/about') About

編譯後:

<a href="/">Home</a>
<a class="active" href="/about">About</a>

屬性插值

編譯前:

- var btnType = 'info'
- var btnSize = 'lg'
button(type='button' class='btn btn-' + btnType + ' btn-' + btnSize)

//- 支持ES6的環境中
button(type='button' class=`btn btn-${btnType} btn-${btnSize}`)

編譯後:

<button class="btn btn-info btn-lg" type="button"></button>
<button class="btn btn-info btn-lg" type="button"></button>

4.語句

語句包括編程語言中的for、if、switch這些,只是在pug中,稍微有些不同。

case

case語句和JavaScript中的switch語句類似。

編譯前:

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

if

編譯前:

- var user = { name: 'tom' }
- var age = false
#user
  if user.description
    h2.green 如果user.name為true
    p.description= user.name
else if age h2.blue 如果age為true p.description= age else h2.red Description p.description User has no description

編譯後:

 <h2 class="green">如果user.name為true</h2>
<p class="description">foo bar baz</p>

each

編譯前:

- var arr = ['zero', 'one', 'two'];
- var obj = {name:'tom',age:21,country:'china'};

ul.array
  each val, index in arr
    li= index + ': ' + val

ul.object
   each val, key in obj
     li= key + ': ' + val

編譯後:

<ul class="array">
  <li>0: zero</li>
  <li>1: one</li>
  <li>2: two</li>
</ul>

<ul class="object">
  <li>name: tom</li>
  <li>age: 21</li>
  <li>country: china</li>
</ul>

5.include

通過include,你可以在一個pug模板里,引入另外一個pug組件。

編譯前:

//- index.pug
doctype html
html
  title include用法

  body
    include components/head.pug

    p 在index.pug文件中引入了head.pug和footer.pug兩個組件

    include components/footer.pug
//- components/head.pug
h1 這是head.pug組件
//- components/footer.pug
footer 這是footer.pug組件

編譯後:

<!DOCTYPE html>
<html>

<head>
  <title>include用法</title>
</head>

<body>
  <h1>這是head.pug組件</h1>

  <p>在index.pug文件中引入了head.pug和footer.pug兩個組件</p> 

<
footer>這是footer.pug組件</footer>
</body>
</html>

6.模板繼承

include可以幫我們少寫很多重覆代碼,同時更容易去維護每個組件。而繼承則能夠使模板更加靈活,進一步減少我們的工作量。

在pug里,我們可以使用extends來繼承模板,使用block來定義可能會變化或者可擴展的內容。

編譯前:

//- layout.pug
doctype html
html
  head
    title Template Inheritance用法
  
//- 這裡是可以擴展的link區域 block links link(rel="stylesheet" href='/main.css') script(src="/jquery.js") body
head 所有頁面的公共頭部

  //- 這裡是可以擴展的內容區域 block content
//- 這裡是可以擴展的script區域 block scripts
script(src="/bootstrap.js")
//- index.pug
extends layout.pug

block links
  link(rel="stylesheet" href='/bootstrap.css')
  link(rel="stylesheet" href="/index.css")

block content
  h1 模板繼承的用法
  p 使用extends來繼承模板
  p 使用block來自定義模板里的內容

block append scripts
  script(src="index.js")

編譯後:

<doctype html>
<html>
<head>
    <title>Template Inheritance用法</title>
    <link rel="stylesheet" href="bootstrap.css">
    <link rel="stylesheet" href="index.css">
</head>

<body>
    <header> 所有頁面的公共頭部</header>

    <h1>模板繼承的用法</h1>
    <p>使用extends來繼承模板</p>
    <p>使用block來自定義模板里的內容</p>

    <script src="/index.js"></script>
    <script src="/bootstrap.js"></script>
</body>
</html>    

7.內聯script

我們有時也會在html頁面內嵌一些JavaScript代碼,在pug中也很簡單

編譯前:

doctype html
html
    head
        title 內聯script
    body
        h1 需要在此頁面中內聯一些腳本
  
    script.
        console.log('只需要在script後面加上一個.符號')

編譯後:

<doctype html>
<html>
    <head>
        <title>內聯script</title>
    </head>

    <body>
        <h1>需要在此頁面中內聯一些腳本</h1>
    
    <script>
        console.log('只需要在script後面加上一個.符號')
    </script>
    </body>
</html>

 

 

結語:

以上基本涵蓋了pug的95%內容,還剩下一點少用的沒有一一贅述,比如過濾器(filters)和註釋(comments)等,markdown過濾器是個好東西,不過我覺得一般就個人項目,比如博客這樣的會用上。

這些東西也足夠你在項目中使用了,對於剩下的那5%,大家可以自己去看看官網,瞭解一下,都挺簡單pug.js

另外在我使用的時候,發現pug的寫法除了縮進以外,也可以按照標準的html書寫格式來創建模板,插值什麼的,通過#{}方式同樣好使

不過在官網上沒看見可以使用這種方式創建模板的說明,這是第一次使用pug(jade),所以不知道會不會是相容以前的版本,有知道的朋友麻煩告訴我一聲,謝謝哈!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、安裝node.js 方式很多npm,git等,新手建議從官網上直接去下載node的安裝包。一鍵安裝. 二、創建一個web伺服器。 三、讀取文件的方式(同步,非同步) 1.同步 2.非同步 三、事件迴圈 四、數據緩衝區 1.向緩存區寫入數據 2.讀取緩衝區的內容 3.Buffer 轉為JSON對象 4 ...
  • 3.下拉列表:<select name="" id=""> <option value=""></option> </select> 屬性:name="" 指定獲取輸入的名字。 value="" 不知道有什麼用。但我知道它有用。 在option標簽中預設選中屬性為 selected 在input標簽 ...
  • 【JavaScriptOPP基礎】【成員屬性與成員方法】【原型與原型鏈】【原型屬性與原型方法】【for-in迴圈】【JS OOP 中的繼承】【JS模式實現繼承的三種方式】【閉包】 ...
  • Position 屬性:規定元素的定位類型。即元素脫離文檔流的佈局,在頁面的任意位置顯示。 ①absolute :絕對定位;脫離文檔流的佈局,遺留下來的空間由後面的元素填充。定位的起始位置為最近的父元素(postion不為static),否則為Body文檔本身。 ②relative :相對定位;不脫 ...
  • interceptors click me ...
  • 1.函數的caller屬性 (1)、區分函數是在函數體調用還是頂層代碼中調用:頂層中調用函數,該函數的caller屬性返回null,在函數中調用,會返回調用發i函數的函數; 2.Arguments的callee屬性 (1)、使用Arguments的callee屬性來匿名遞歸調用函數 3.函數的app ...
  • jQuery操作css樣式 css操作的分類: 1. css操作 2. 位置操作 3. 尺寸操作 css操作之css css代碼: html代碼: jQuery代碼: 效果如下: css操作之位置操作 css代碼: html代碼 jQuery代碼 效果如下: css操作之尺寸操作 css代碼 htm ...
  • 1 2 3 4 5 Title 6 66 67 68 69 ———中華瑰寶,絕美唐詩。 70 71 72 73 向晚意不適, 74 驅車登古原。 75 夕陽無限好, 76 ... ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...