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