基於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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...