我的基於 JamStack 的新部落格

東風微鳴發表於2023-01-09

概述

今天心血來潮,介紹一下我的新部落格站點 —— https://EWhisper.cn

我是做基礎平臺 PaaS 運維和架構的,挺喜歡把工作中學到的新知識寫下來、記筆記,突然有一天就抱著「資源共享、天下為公」的理念,分享我的學習心得,也能讓我的文章更規範刻度。

我是從 2019 年開始折騰部落格的,然後在 2021 年對部落格進行了一下全新的改版,在最新版的部落格中,無論是使用還是部署,都採用採用了 JamStack 的技術架構和工具。目前來看效果也不錯。

{% note light %}
?問題:

《「譯文」目前大火的 Jamstack 到底是什麼?》
{% endnote %}

我的第一代部落格

第一代網站,目前還在這裡留了個底 —— https://www.EWhisper.cnPelican 靜態站點生成器,NGINX Web Server,Docker騰訊雲 雲主機提供支援。主題目前來自Smashing Magazine

效果如下圖所示:

my-pelican-blog-screenshot

{% note info %}
?參考資料:

Pelican 是一個用 Python 編寫的靜態站點生成器。亮點包括:

  • 直接用 reStructuredText 或 Markdown 格式的編輯器編寫內容
  • 包含一個簡單的 CLI 工具來(重新)生成您的站點
  • 易於與分散式版本控制系統和 web hooks 對接
  • 完全靜態的輸出很容易託管在任何地方
    {% endnote %}

第二代 - 基於 JamStack 的部落格

第二代網站 —— https://EWhisper.cnHexo 靜態站點生成器,七牛雲-物件儲存和CDN 提供圖片儲存和URL,騰訊雲 CloudBase-靜態網站託管 提供靜態網站託管支援,valineTwikoo 提供評論系統技術支援,部落格訪問量和評論資訊儲存在 LeanCloud騰訊雲 CloudBase-使用者管理上,統計分析透過百度統計LeanCloud 來實現,部落格首頁動態詩詞展示由一言開發者中心介面提供。主題目前來自 hexo-theme-fluid

效果如下圖所示:

my-fluid-show

下面一一介紹。

JAM

什麼是 JamStack?

{% note info %}
?參考資料:

Jamstack 架構中的 JAM 是指客戶端 JavaScript、可重用的後端 API,和使用者介面的 Markup,比如 HTML 與 CSS。
Jamstack 的關鍵特徵是前端 Web UI 與基於 API 的後端服務之間的清晰區分。與垂直整合的傳統 Web 應用程式不同的是, Jamstack 應用程式是模組化和分散式的:UI 可以透過靜態網頁伺服器、CDN、甚至基於區塊鏈的儲存進行分發;後端 API 服務可以部署在雲上,也可以由邊緣節點就近提供服務。
{% endnote %}

我們先說 JAM 架構

JAM - 我的部落格技術架構

J - JavaScript

J 是指 客戶端 JavaScript,那麼我的部落格中涉及到的 JavaScript 主要有以下:

  • JS 靜態站點生成器框架:Hexo,我在自己電腦上用 Markdown 格式寫文章,透過 hexo g 生成網站靜態頁面,並透過 hexo deploy 進行部署。

  • 部署託管騰訊雲 CloudBase,這裡是使用了它的:

    • CloudBase CLI:用於和 hexo deploy 一起工作,將網站檔案釋出到騰訊雲上(靜態部分具體使用了:DNSPod、COS 和 CDN)
    • 除了 JavaScript 部分,還有涉及 API 的部分有(後面詳細介紹):
      • 使用者管理
      • 資料庫
      • 雲函式
  • 靜態網站評論系統Twikoo,這裡使用了它的 JS 前端和基於騰訊雲 CloudBase 的雲函式後臺。

  • 網頁訪問統計

    • 百度統計: 用來做站長網頁訪問統計和分析。
    • LeanCloud: 用於 PV UV 展示。這裡主要用到了它的「資料儲存」服務。

百度統計效果如下:

百度統計

LeanCloud 展示效果如下:

首頁 PV UV 展示

文章瀏覽量展示

後端儲存資料如下所示:

LeanCloud 後臺資料儲存

{% note info %}
?參考資料:

  • Hexo 是一個快速、簡潔且高效的部落格框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在幾秒內,即可利用靚麗的主題生成靜態網頁。Hexo 基於 JavaScript 和 Node.js。

  • 騰訊雲 CloudBase:雲開發(Tencent CloudBase,TCB)是騰訊雲提供的雲原生一體化開發環境和工具平臺,為開發者提供高可用、自動彈性擴縮的後端雲服務,包含計算、儲存、託管等 serverless 化能力,可用於雲端一體化開發多種端應用(小程式,公眾號,Web 應用,Flutter 客戶端等),幫助開發者統一構建和管理後端服務和雲資源,避免了應用開發過程中繁瑣的伺服器搭建及運維,開發者可以專注於業務邏輯的實現,開發門檻更低,效率更高。

    • CloudBase CLI 是雲開發(Tencent CloudBase,TCB)開源的命令列介面互動工具,基於 JavaScript 和 Node.js,用於幫助使用者快速、方便的部署專案,管理雲開發資源。
  • Twikoo:一個簡潔、安全、免費的靜態網站評論系統,基於騰訊雲開發。部分特色如下:

    • 支援回覆、點贊
    • 無需額外適配,支援搭配淺色主題與深色主題使用
    • 支援 API 呼叫,批次獲取文章評論數、最新評論
    • 訪客在暱稱欄輸入 QQ 號,會自動補全 QQ 暱稱和 QQ 郵箱
    • 訪客填寫數字 QQ 郵箱,會使用 QQ 頭像作為評論頭像
    • 支援評論框貼上圖片(可禁用)
    • 支援插入圖片(可禁用)
    • 支援插入表情(可禁用)
    • 支援 Ctrl + Enter 快捷回覆
    • 評論框內容實時儲存草稿,重新整理不會丟失
    • 支援按語言的程式碼高亮
    • 隱私資訊保安(透過雲函式控制敏感欄位(郵箱、IP、環境配置等)不會洩露)
    • 支援人工稽核模式
    • 防 XSS 注入
    • 支援限制每個 IP 每 10 分鐘最多發表多少條評論
    • 支援自定義表情列表
    • 內嵌式管理皮膚,透過密碼登入,可方便地檢視評論、隱藏評論、刪除評論、修改配置
    • 支援從 Valine、Artalk、Disqus 匯入評論

    效果如下:

    Twikoo 夜間模式

  • LeanCloud:LeanCloud 本質上提供的服務和騰訊雲的 CloudBase 是一致的。LeanCloud 領先的 Serverless 雲服務,為產品開發提供強有力的後端支援。提供一站式後端服務,如資料儲存、雲引擎、即時通訊等。

{% endnote %}

A - API

A 指可重用的後端 API。其實 J 和 A 是緊密配合的,我們在上一段也能看到很多 JavaScript 最終都是呼叫 API 來對資料進行增刪改查。我的部落格中涉及到的 API 主要有:

靜態網站評論 API

如果大家訪問我的網站——容器化應用系統上生產的最佳實踐 - 東風微鳴技術部落格 (ewhisper.cn),看評論,開啟瀏覽器的 F12,就可以看到實際 Twikoo POST 的 API 是:

curl 'https://ewhisper-5g565139594f9b52.ap-shanghai.tcb-api.tencentcloudapi.com/web?env=ewhisper-5g565139594f9b52' \
  -H 'authority: ewhisper-5g565139594f9b52.ap-shanghai.tcb-api.tencentcloudapi.com' \
  -H 'sec-ch-ua: "Microsoft Edge";v="95", "Chromium";v="95", ";Not A Brand";v="99"' \
  -H 'x-tcb-region: ap-shanghai' \
  -H 'x-sdk-version: @cloudbase/js-sdk/1.7.0' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.38' \
  -H 'content-type: application/json;charset=UTF-8' \
  -H 'x-seqid: 04c3430d22965' \
  -H 'x-tcb-trace: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiZWQ1OWE2MmFiYmIyNDZkY2JiNTRiODVjMzU5MGMxNTEiLCJsYXN0UmVwb3J0VGltZSI6MTYzNTY0NzI4MTI2OSwiaWF0IjoxNjM1NjQ3MjgxfQ.GiVnirzhrEf7AnNxV_QejyH9Tk7shmmVG6Xh5yiUPn0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'accept: */*' \
  -H 'origin: https://ewhisper.cn' \
  -H 'sec-fetch-site: cross-site' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: https://ewhisper.cn/' \
  -H 'accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' \
  --data-raw '{"action":"functions.invokeFunction","dataVersion":"2020-01-10","env":"ewhisper-5g565139594f9b52","function_name":"twikoo","request_data":"{\"event\":\"COMMENT_GET\",\"url\":\"/posts/14417/\"}","access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoie1wibG9naW5UeXBlXCI6XCJBTk9OWU1PVVNcIixcImVudk5hbWVcIjpcImV3aGlzcGVyLTVnNTY1MTM5NTk0ZjliNTJcIixcInV1aWRcIjpcImVkNTlhNjJhYmJiMjQ2ZGNiYjU0Yjg1YzM1OTBjMTUxXCJ9IiwiaWF0IjoxNjM1NjUwOTU4LCJleHAiOjE2MzU2NTQ1NTh9.8hDap2wwrTII2Ine8F9jjDzCGUKW_e80pb4KvpGM64U;1635566422","seqId":"04c3430d22965"}' \
  --compressed

API 返回的響應是:

{
    "requestId": "91765a8a-39fc-11ec-9ab1-b2a89f885dbc",
    "data": {
        "response_data": "{\"data\":[{\"id\":\"cd045e75610b657002fe22fb26922cc4\",\"nick\":\"凱西Casey\",\"avatar\":\"https://thirdqq.qlogo.cn/g?b=sdk&k=JtvoGTkW8mBlnXNSFnxcxg&s=140&t=1557419902\",\"mailMd5\":\"097b6659c25b25c1ad2d792c6d5a953e\",\"link\":\"\",\"comment\":\"<p>自動關聯qq頭像<img alt=\\\":bilibiliHotKey-20:\\\" src=\\\"https://twikoo-magic.oss-cn-hangzhou.aliyuncs.com/bilibiliHotKey/20.jpg\\\" class=\\\"tk-owo-emotion\\\"> </p>\\n\",\"os\":\"Android 11\",\"browser\":\"Miui 15.1.12\",\"master\":false,\"like\":0,\"liked\":false,\"replies\":[],\"ruser\":null,\"isSpam\":false,\"created\":1628136816139,\"updated\":1628136816139},{\"id\":\"cd045e75610b634002fc99751dbc207c\",\"nick\":\"小囧\",\"mailMd5\":\"27add2425f31777763528269b4060ec1\",\"link\":\"\",\"comment\":\"<p><img alt=\\\":bilibiliHotKey-24:\\\" src=\\\"https://twikoo-magic.oss-cn-hangzhou.aliyuncs.com/bilibiliHotKey/24.jpg\\\" class=\\\"tk-owo-emotion\\\"> </p>\\n\",\"os\":\"Android 11\",\"browser\":\"Miui 15.1.12\",\"master\":false,\"like\":1,\"liked\":false,\"replies\":[],\"ruser\":null,\"isSpam\":false,\"created\":1628136256345,\"updated\":1628136256345},{\"id\":\"610b366fcb9d18021c807485\",\"nick\":\"東風微鳴\",\"mailMd5\":\"7c743bc6ac83171e35a5aa8bd66cc1ea\",\"link\":\"https://EWhisper.cn\",\"comment\":\"<p>&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/alus/alus_blush.png&quot; alt=&quot;alus_blush&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/bilibili/bb_sunglasses.png&quot; alt=&quot;bb_sunglasses&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/qq/qq_confounded.gif&quot; alt=&quot;qq_confounded&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tieba/tieba_antic.png&quot; alt=&quot;tieba_antic&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/tw-emoji/1f47d.png&quot; alt=&quot;1f47d&quot;&gt;&lt;img class=&quot;vemoji&quot; src=&quot;https://cdn.jsdelivr.net/gh/walinejs/emojis@1.0.0/weibo/weibo_cat_cry.png&quot; alt=&quot;weibo_cat_cry&quot;&gt;</p>\\n\",\"os\":\"Windows 10\",\"browser\":\"Microsoft Edge 92.0.902.62\",\"master\":false,\"like\":0,\"liked\":false,\"replies\":[],\"ruser\":null,\"created\":1628124783184,\"updated\":1628124783184}],\"more\":false,\"count\":3}"
    }
}

實際內容就是:

comment

網頁訪問統計 API

百度統計太複雜,我也不太懂,URL 是:https://hm.baidu.com/hm.js 讀者可以自行檢視。

LeanCloud 統計 PV、UV 和具體文章閱讀量的 API 分別為:

PV:

https://lrbbjugq.lc-cn-e1-shared.com/1.1/classes/Counter?where={"target"%3A"site-pv"}

響應內容為:

{
    "results": [
        {
            "target": "site-pv",
            "time": 1395,
            "createdAt": "2021-07-10T07:40:59.569Z",
            "updatedAt": "2021-10-31T03:30:15.933Z",
            "objectId": "60e94f0b55ba67136bafb203"
        }
    ]
}

UV:

https://lrbbjugq.lc-cn-e1-shared.com/1.1/classes/Counter?where={"target"%3A"site-uv"}

響應內容為:

{
    "results": [
        {
            "target": "site-uv",
            "time": 397,
            "createdAt": "2021-07-10T07:40:54.146Z",
            "updatedAt": "2021-10-31T02:15:31.349Z",
            "objectId": "60e94f06d3c62b4544b9ff5d"
        }
    ]
}

具體文章閱讀數:以容器化應用系統上生產的最佳實踐 - 東風微鳴技術部落格 (ewhisper.cn)為例

https://lrbbjugq.lc-cn-e1-shared.com/1.1/classes/Counter?where={"target"%3A"%2Fposts%2F14417%2F"}

響應內容為:

{
    "results": [
        {
            "target": "/posts/14417/",
            "time": 28,
            "createdAt": "2021-07-31T08:39:50.194Z",
            "updatedAt": "2021-10-31T03:30:15.926Z",
            "objectId": "61050c5697a09641df17407d"
        }
    ]
}
首頁 Slogan

大家如果進入我的首頁,多重新整理幾次,會發現首頁的 Slogan 會出現不同的古詩句。如下:

部落格首頁古詩句 Slogan

這個其實也是呼叫的 API,部落格首頁動態詩詞展示由一言開發者中心介面提供。

{% note info %}
?參考資料:

一言是建立於 2016 年的專案,起初是用於個人目的。目前已經轉為公益專案,由萌創團隊運營,為大家提供服務。 所謂一言(ヒトコト),即一句話。這句話可以是傳達了感動,可以是博人一笑,可以是發人深思。總之,一言,代表著言語的觸動,靈魂的交流。
{% endnote %}

具體的呼叫 URL 為:https://v1.hitokoto.cn/?c=ic=i 表示句子型別(c)為詩詞(i)。

返回的響應為:

{
    "id": 5545,
    "uuid": "5d9def79-c283-4c4c-a9cb-f44ac8da26da",
    "hitokoto": "採得百花成蜜後,為誰辛苦為誰甜。",
    "type": "i",
    "from": "蜂",
    "from_who": "羅隱",
    "creator": "a632079",
    "creator_uid": 1044,
    "reviewer": 1044,
    "commit_from": "api",
    "created_at": "1586266392",
    "length": 16
}

M - Markup

M 指的是使用者介面的 Markup,比如 HTML 與 CSS。

我的部落格對比了多個 Hexo 受歡迎的主題,最終選擇了 fluid 。以下是我使用過的主題和我的簡單評價。

  • NexT: 用的人最多,更新頻繁,中文,無中文文件
  • icarus:主題對我口味,更新頻繁,無中文文件
  • matery: 花哨,中文全支援
  • fluid: 簡潔,全中文
  • butterfly: 繁體中文

{% note info %}
?參考資料:

Fluid 是基於 Hexo 的一款 Material Design 風格的主題,以簡約的設計幫助你專注於寫作,由 Fluid-dev負責開發與維護。
主題 GitHub: https://github.com/fluid-dev/hexo-theme-fluid
預覽網站:Fluid's blogzkqiang's blog
大家可以瀏覽 Hello Fluid - Hexo Theme Fluid (fluid-dev.com) 來體驗該主題的風格
{% endnote %}

JAM - 我的部落格寫作釋出流程

首先,文章全部託管在 Git 上。在我的電腦上安裝好相關依賴:Git、Node.js 、 VSCode(用作 Markdown 格式文章寫作、終端 Terminal 和 Git 版本管理)、hexo-cli(Hexo 的命令列)、hexo-theme-fluid(fluid 主題)和 @cloudbase/cli(騰訊雲 CloudBase CLI)。

其次,在終端執行 hexo new "新文章" 建立新的 markdown 檔案,並用 VSCode 對其進行寫作和編輯。

文章完成後,透過終端執行 hexo s 生成新的文章網頁,並本地預覽。

最後,透過 cloudbase framework deploy ... 釋出到騰訊雲上。

這裡也詳細說一下 cloudbase framework deploy ... 都做了些什麼,具體如下:

CloudBase CLI 1.9.2
CloudBase Framework 1.8.16
   ______ __                   __ ____                             
  / ____// /____   __  __ ____/ // __ ) ____ _ _____ ___           
 / /    / // __ \ / / / // __  // __  |/ __ `// ___// _ \          
/ /___ / // /_/ // /_/ // /_/ // /_/ // /_/ /(__  )/  __/          
\____//_/_\____/ \__,_/ \__,_//_____/ \__,_//____/ \___/       __  
   / ____/_____ ____ _ ____ ___   ___  _      __ ____   _____ / /__
  / /_   / ___// __ `// __ `__ \ / _ \| | /| / // __ \ / ___// //_/
 / __/  / /   / /_/ // / / / / //  __/| |/ |/ // /_/ // /   / ,<   
/_/    /_/    \__,_//_/ /_/ /_/ \___/ |__/|__/ \____//_/   /_/|_|  
                                                                   
 CloudBase Framework  info     EnvId ewhisper-xxxxx	# 作者備註:CloudBase 的環境 ID
 CloudBase Framework  info     Region ap-shanghai	# 作者備註:騰訊雲區域
 CloudBase Framework  info     Validate config file success.
 CloudBase Framework  info     AppName ewhisper
 CloudBase Framework  info     ? install plugins
 CloudBase Framework  info     callHooks 'preDeploy' 	# 作者備註:部署前操作
 CloudBase Framework  info     ? init: hexo...		# 作者備註:init
 CloudBase Framework  info     Website 外掛會自動開啟靜態網頁託管能力,需要當前環境為 [按量計費] 模式	# 作者備註:環境是按量計費的。
 CloudBase Framework  info     Website 外掛會部署應用資源到當前靜態託管的 / 目錄下
 CloudBase Framework  info     ? build: hexo...	# 作者備註:build,就是呼叫 `npx hexo generate`
 CloudBase Framework  info     running 'npm install --prefer-offline --no-audit --progress=false' 
...
 CloudBase Framework  info     running 'npx hexo generate' 
# 作者備註:以下是 Hexo Generate 日誌
INFO  Validating config
INFO  Start processing
INFO  [Fluid] 讀取 _config.yml 中 theme_config 配置項覆蓋配置
INFO  Generate link [41870] for post [source/_posts/我的基於JamStack的新部落格.md][ 我的基於JamStack的新部落格 ]
INFO  Generated: categories [[ '雲端計算' ]] for post [source/_posts/我的基於JamStack的新部落格.md][ 我的基於JamStack的新部落格 ]
...
INFO  292 files generated in 1.8 s
# 作者備註:以上是 Hexo Generate 日誌
 CloudBase Framework  info     ? compile: hexo...		# 作者備註:靜態網站沒有編譯過程
 CloudBase Framework  info     callHooks 'postCompile'	 
正在部署[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 100% 40.0 s
正在部署[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 100% 45.1 s
 CloudBase Framework  info     ? deploy: hexo...		# 作者備註:部署到騰訊雲,其實呼叫的就是騰訊雲 COS 的上傳 API
 CloudBase Framework  info     ? 網站部署成功
 CloudBase Framework  info     callHooks 'postDeploy' 	 # 作者備註:部署後展示應用資訊
 CloudBase Framework  info     ? 應用入口資訊:
? 網站入口: https://ewhisper-xxx.tcloudbaseapp.com/
 CloudBase Framework  info     ✨ done

其間,也會透過 Git 進行文章的版本管理和同步。

JAM - 我的部落格的部署架構

JAM 通用的使用者訪問路線如下所示:

JAM

靜態站點部分

Hexo 生產的站點,是完全的靜態站點,全部都是靜態檔案,包括:HTML、CSS、JavaScript 和圖片。這些靜態檔案,透過 cloudbase framework deploy ... 後,釋出到騰訊雲 CloudBase-靜態網站託管。這裡其實將靜態檔案釋出到了 2 個騰訊雲的產品中:

  1. 騰訊雲物件儲存 COS:靜態檔案是以物件的形式存放在 COS 中。
  2. 騰訊雲 CDN:同時 COS 中的靜態檔案,會快取到騰訊雲的 CDN 中。

使用者瀏覽網站時,過程如下:

  1. 訪問:https://EWhisper.cn;
  2. <EWhisper.cn> 域名在 DNS 中解析為 CName:<ewhisper.cn.cdn.dnsv1.com>;轉到騰訊雲 CDN
  3. 如果 CDN 命中,直接返回;如果 CDN 沒有命中,會回源到 騰訊雲 COS 的地址去訪問原始檔。

API 部分

對於 API 部分,需要開通、安裝部署的主要有以下元件:

  • 靜態網站評論系統:Twikoo,部署方式見 Twikoo 快速上手
  • 網頁訪問統計 API:LeanCloud。LeanCloud 只要申請個賬號,獲得對應的域名、AKSK 即可。

總結

以上就是我的基於 JamStack 的部落格 —— https://EWhisper.cn。主要是基於:Hexo、Fluid 主題、Twikoo 評論系統、LeanCloud 和 騰訊雲 CloudBase 來實現的。

從我的角度來看,JamStack 相比傳統 LNMP 開發,一些主要的區別包括:

  • Jamstack 不需要安裝或管理作業系統 (如 Linux)
  • Jamstack 不需要管理安全策略 (伺服器防火牆)
  • Jamstack 不需要安裝或管理應用程式資料庫 (如 MySQL)
  • Jamstack 可以在不使用 HTTP (Web) 伺服器 (如 Apache) 的情況下部署 Web 站點或 Web 應用

總體而言,選擇使用 Jamstack 建立網站有 4 個主要好處: 成本效益、效能改進、更好的安全性和更好的使用者 / 開發者體驗

歡迎體驗!✨✨✨

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章