1. 程式人生 > >Hexo + GitHub搭建靜態部落格(二)

Hexo + GitHub搭建靜態部落格(二)

快速介紹

本文是 Hexo + GitHub 搭建靜態部落格(一) 內容上的延展,Hexo 環境的搭建、依賴的下載請根據上文自行配置。

本文主要介紹 Hexo 的 歸檔、標籤、分類,以及依靠外掛支援的 評論、站內搜尋、字數統計 等功能。

歸檔、分類、標籤

三者是眾多部落格模板的必要元素,而在很多文件中卻沒有詳細的解釋,一筆帶過。筆者結合自己的理解,強行解釋一波,通過對比將意思表達的更清楚。

歸檔(archives)是按照一定的週期對部落格進行分類,大多數是按年,月等。

分類(categories)和 標籤(tags)都是用來描述部落格的內容,但卻又不盡相同。分類定義部落格的常規主題,而標籤會深入反應內容。分類會構成部落格的大綱,反應部落格的基本結構,而標籤會更具體一些。下面我希望通過一個小案例來解釋“分類”和“標籤”的區別。

假如我們運營著一個關於電子產品(3C)的部落格,上面釋出了眾多的博文,可能會有以下的分類:

  • 筆記本
  • 手機
  • 儲存裝置
  • 數碼相機

當有新的 iphone 上市的時候,我們可能會寫一個新產品開箱的部落格,它的分類肯定是”手機“,而標籤會是”iphone“。

建立對應的頁面也很簡單,只需幾行命令。

hexo new page "archives"
hexo new page "tags"
hexo new page "categories"

站內搜尋

方式有以下三種:Insight、Swiftype、Baidu。

Insight:只需安裝 hexo-generator-json-content 元件即可。
Swiftype:需要去其官網註冊 key。
Baidu:搜尋的話需要禁用其他兩種。

三種都很簡單,這裡展示第一種的效果圖。
在這裡插入圖片描述

評論

評論是部落格必不可少的一項功能。而 Hexo 作為一個靜態部落格,沒有 WordPress 那樣的 Server 和資料庫,評論的功能可想而知肯定是用的第三方的評論系統。大浪淘沙,對比各色的需求,我們來看一下:

  • 來必力 : 504 報錯,跨域
  • Hypercomments: 付費
  • 暢言 : 暢言
  • Valine : sound good
  • 多說 : 關閉
  • 網易雲跟帖 : 關閉
  • disqus : 科學上網
  • Gitalk : 需要 GitHub 賬號
  • 搜狐暢言 : 備案

這個 topic 展開的話會很冗長,搜尋引擎上也有很多這類的文章。我最後選擇了 GitTalk,簡單大方,技術類的文章 GitHub 不是門檻。

字數統計,閱讀時間統計

這一部分比較簡單,只需要安裝 hexo-wordcount 外掛,傳入部落格的內容即可計算得出。

如何在部落格展示自己 GitHub 託管的專案

作為一個程式設計師,GitHub 開源專案是程式設計師展示程式設計技術和工作閱歷、釋放程式設計師個人魅力的寬廣舞臺。

所以,很有必要在部落格的核心頁面展示自己 GitHub 的 repository。Hexo 可以在主題內通過 ejs 或 swig 模板引擎來構建頁面,GitHub 提供開源 api 支援獲取 repo 列表。

所以我們可以通過呼叫引入 JavaScript 請求 api。展示效果如下:
在這裡插入圖片描述

問題出在 GitHub 的未授權狀態的 api 每小時只可以請求 60 次,而超出次數就會 403。而授權的 api 每小時可以訪問 50000 次。所以需要去https://developer.github.com/v3/auth/#basic-authentication 申請授權。

我們搭建的 Hexo 靜態部落格,沒有 Server,所以 oauth2 的方式不可取,這裡我用的 access_token 來對 api 授權,GitHub 出於安全的考慮,不允許我們把 access_token 上傳到 GitHub 倉庫,所以我們需要藉助你擅長的加密方式,對 access_token 加密,執行時解密。虛擬碼如下:

var key = 'U2FsdGVkX1+VWdiIkoA3PCbz9KKGlKilMs6UztGd2VQuYuSAoZLyCi8fM2qxUbviYt35kf/tpFvEqNmtY3WppQ='
var access_token = CryptoJS.AES.decrypt(key, 'guguji5').toString(CryptoJS.enc.Utf8);
$.get("https://api.github.com/users/<%=theme.github.username%>/repos?access_token="+access_token, function(result) {
})

參考連結

https://developer.github.com/v3/auth/#basic-authentication

https://developer.github.com/v3/#rate-limiting

https://amylynnandrews.com/categories-vs-tags/