使用 Hexo 搭建属于自己的博客

原文地址:https://blog.mariozzj.cn/posts/569080df/

前言

为什么要建博客

其实我很早就有了建博客的想法,当时刚学会开发简单的 Web 应用,在网上浏览时发现很多人建议建一个博客练手,便想着要去跟风去写。后来,随着个人知识面的拓展和深入,发现有太多的知识和经验值得沉淀和交流,且很多复杂性的知识是“一言难尽”的,可能需要成百上千字的描述,辅之以图片视频等媒体

另外,根据“学习金字塔”理论(Edgar Dale,1946),对知识进行演示、实践和传授能够显著提升学习保持率,而沉淀为博客或视频正是这样一种形式,我认为一方面可以让无形的知识转为有形的博客,便于之后复习和追溯,另一方面通过沉淀转化可以提高我对知识的记忆和掌握水平。

建设原理

既然是内容平台,博客自然是重内容,轻形式,主要重心点放在内容上,仅保留少量的交流功能即可。

这里我使用 Hexo 框架搭建博客,该框架基于 Node.js ,使用者不需要掌握 node 原理,Hexo 会根据配置项中预设好的模板自动将内容转换为静态页面。

Hexo 提供了多种形式的主题:Themes | Hexo,这里我选用的是 Butterfly。该主题较为贴近我对博客美观性的要求,且原生支持一系列配置项和插件,能满足我的需要。

虽然我有自己的服务器,但是为了提高其可用性,我还是使用了可以白嫖的 GitHub Pages 服务,将 Hexo 生成的静态页面部署上去,从而可以让大家访问。对于评论、说说等功能插件还用到了 ArtitalkWalineVercelLeanCloud 国际版,有兴趣可自行了解,本文不赘述。

本地建设

基础环境安装

安装 Node.js

使用我的方法建设博客,最核心的框架是 Hexo,其基于 Node.js 环境。如果没有 Node 环境需要自行安装,在 Node.js 官方下载页面 根据操作系统下载即可,具体操作可以参考 windows安装npm教程--nodejs - 遥望那月 - 博客园 (cnblogs.com)

这里为和我使用的一些插件兼容,我使用的是 12.18.0 版本。该版本自带 npm。安装完成后在终端运行如下命令:

$ node -v
$ npm  -v

如果正常响应对应版本号,则说明安装及环境变量配置成功。

安装 Hexo

使用 npm(node 的包管理器,可以类比 python 的 pip)可以直接安装 Hexo。在终端输入如下命令:

$ npm install hexo

即可安装。终端运行 hexo -v 检查是否安装正常。

安装后就可以开始配置了,首先,选择一个本地文件夹作为博客的目录,终端切换到该目录下,运行如下命令初始化该目录:

$ hexo init .
$ npm install

成功运行后,即可使用 hexo 的命令对该目录进行操作了。默认情况下,hexo 使用 landscape 主题,运行

$ hexo server

即可从本地运行博客服务器。浏览器打开终端提示的页面(默认为 https://localhost:4000/),即可查看。

默认页面为内置的 hello-world.md 文档。至此我们已经完成了 Hexo 的安装,如要了解更多配置项可参考Configuration | Hexo,要了解更多 Hexo 命令可参考 Commands | Hexo

主题配置:以 Butterfly 为例

大部分人可能都会嫌默认主题 landscape 丑,所以可以进入 Hexo 的主题页面:Themes | Hexo 挑选符合自己需求的主题进行进一步配置。这里我选用了 Butterfly。作者 jerryc127 (Jerry Wong) 在主题页面给出了详尽的文档,参见: Butterfly - A Simple and Card UI Design theme for Hexo

实际上,大部分的操作都只需要理解 _config.yml 里面的配置项,不需要掌握任何的代码原理。按照作者文档给出的步骤一步步按需进行修改即可,对于非必要参数也可以选择不配置。

作者建议大多数更改都在主题配置文档 _config_butterfly.yml 中进行,但是有一些插件只会识别 _config.yml 中的配置,建议自行做好备份。

完成这几篇文档里面的配置之后,就可以正常使用博客了!建议牢记以下 hexo 命令:

  • hexo clean —— 清空之前已生成的全部静态文件
  • hexo generate —— 根据配置生成新的静态文件,.md 文档会在这一步自动解析生成静态页面。
  • hexo server —— 在本地服务器启动 hexo 服务。

关于 Butterfly 的进阶教程查看:Butterfly 安裝文檔(六) 進階教程 | Butterfly

如在 Butterfly 配置项中存在疑问,可查看:Butterfly 安裝文檔(五) 主題問答 | Butterfly

推荐插件

评论系统:Waline

在 Butterfly 文档 Butterfly 安裝文檔(四) 主題配置-2 | Butterfly 中作者介绍了很多评论系统,这里我使用过一部分,最后决定使用的是 Waline。我这里也为使用过的系统写一些评价:

  • Disquejs:要翻墙
  • livere(来必力):韩国的,这个一开始吸引到我是因为他可以用国内常见社交平台登录,这样有人评论我也可以推理一下是谁,但是后面发现他会往我的页面里面插乱七八糟的广告(是的也有你们想象的那种),有时登录体验也很差,就放弃了。
  • Gitalk:这个用的人蛮多,原理是基于 Github 的 Issue,但是考虑到我的读者不一定都有 Github 账号,且有时候 Github 会被墙,就放弃了。
  • Valine:衍生为 Waline 了
  • Waline:虽然不支持第三方登录,但是注册只要随便填信息就行,还不用验证,也可以不留信息评论,这样也很方便交流。另外,结合 Leancloud 我可以对评论设置邮箱推送,这样有了新评论我也能第一时间看到,很方便,在 Leancloud 也可以维护掉不友好的评论,完全满足我的需求。

这里 Butterfly 作者文档写的不是很详细,我补充说明一些。简单来说,首先,在主题配置文件中寻找 comments 配置项,修改为:

comments:
  # Up to two comments system, the first will be shown as default
  # Choose: Disqus/Disqusjs/Livere/Gitalk/Valine/Waline/Utterances/Facebook Comments/Twikoo
  use:
    - Waline # 这里启用 Waline,注意大小写
  text: true # 双评论系统展示评论系统名
  # lazyload: The comment system will be load when comment element enters the browser's viewport.
  # If you set it to true, the comment count will be invalid
  lazyload: true # 懒加载,用户滚动到评论处时才加载评论
  count: true # Display comment count in top_img
  card_post_count: false # Display comment count in Home Page

然后按照 Waline 的说明文档:快速上手 | Waline,完成 LeanCloud 设置 和 Vercel 部署两步,复制下来 Vercel 提供的 URL。最后在主题配置文件末尾增加以下配置项:

waline:
  serverURL:  # 这里填写 Vercel 提供的 URL
  avatar: monsterid # gravatar style https://zh-tw.gravatar.com/site/implement/images/#default-image
  avatarCDN: # Gravatar CDN baseURL
  bg: # waline background
  visitor: false
  option:

即可启用。另外特别推荐 Waline 的评论通知功能,参照 评论通知 | Waline ,在 Vercel 完成参数(SMTP_SERVICESMTP_USERSMTP_PASSSMTP_NAMESMTP_URLAUTHOR_EMAIL)的配置就可以了。这里我使用 Outlook365 的邮箱配置成功。这个页面还提供了微信通知和 QQ 通知,但是我测试了下提供服务的三方不是很稳定,且会影响到邮件的正常发送,所以我没有启用。

说说系统:Artitalk

这个插件在 Butterfly 进阶教程文档:Butterfly 安裝文檔(六) 進階教程 | Butterfly 有提及。

说说系统更像是一个只属于自己的留言板,我可以在上面发表一些想法,但是设置好权限之后只有自己能发,别人不能回复。

豆瓣爬虫:hexo-douban

这个插件在 Butterfly 进阶教程文档中有提及:Butterfly 安裝文檔(六) 進階教程 | Butterfly

这个插件可以在每次生成静态页面之前,运行一个豆瓣爬虫,爬取你指定的豆瓣账户的电影、书籍、游戏记录,并生成静态页面。这个插件已经很久没有维护,所以需要降级到 node v12.18.0 版本才可以正常使用。

每次运行 hexo douban 即可运行爬虫并生成静态页面。

在线发布

配置 Github 仓库

在 Github 上创建好仓库,并在本地设置好博客目录,准备发布。

在 Github 仓库的设置页面选择 Pages 选项卡即可对页面进行配置。一般来说,如果仓库名称为 {用户名}.github.io 会自动完成配置,对应的页面部署域名为 https://{用户名}.github.io。这里我用了自己的域名,我在服务商那边将域名解析到我的 Github 页面(https://mariozzj.github.io),再在这里设置,系统就会自动在目录处生成一个 CNAME 文件,之后可以使用原域名直接访问。

方法一:使用 Hexo 部署

Hexo 官方文档给出了一种一步部署的方法:One-Command Deployment | Hexo

首先需要安装 hexo-deployer-git ,在终端运行如下命令:

$ npm install hexo-deployer-git --save

再在 _config.yml 中配置好自己的 git 仓库相关设置:

deploy:
  type: git
  repo: <repository url> # Git 仓库链接
  branch: [branch] # 分支
  message: [message] # git commit 信息。如  Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}

随后,每次完成页面时,运行 hexo clean 之后直接运行

$ hexo deploy

即可完成一系列上传操作。

方法二:使用 Github Action 部署(推荐)

我更推荐这一种,因为我对博客的修改实际上是对原文档和配置文件的修改。如果使用 hexo deploy,那么在 Github 上看到的 commit 记录都是对静态页面 HTML 的修改,实际没有参考价值(当然,也可以对源单独设一个分支,但是感觉比较麻烦)

Github Action 配置后,可以根据行动(如push)自动执行持续集成、持续部署操作(CI/CD),Github 会在云端服务器执行配置好的脚本。这里就是 Github Action 替我们执行 hexo cleanhexo generategit commitgit push等操作,我们只需把代码推送到源文件分支即可。

配置 Github Secrets

不是任何一台云服务器都可以直接向我们的仓库推送代码,需要“登录验证”。这里我们需要生成 Access Token,让 Github Action “登录”并推送到仓库以部署网页。

登录 Github,进入个人账户的 Settings - Developer Settings - Personal Access Tokens,点击 Generate new token 生成新的 token,注意权限配置添加读写相关权限,将生成的 token 复制下来。

随后,进入项目仓库的 Settings - Secrets - Actions,点击 new repository secret 添加以下两个参数:

  • GH_TOKEN:填写上一步生成的 token
  • GIT_EMAIL:填写你的用户对应 git 使用的电子邮箱

配置工作流(workflow)

工作流是一次持续集成的过程,由多个构建任务(job)组成,一个构建任务由多个步骤(step)组成,每个步骤包含多个 action。

在博客所在目录下新建 .github 文件夹,在该文件夹下新建 workflow 文件夹,并在其中创建 deployment.yml,内容如下:

name: Deployment ### workflow

on:
  push:
    branches: [hexo] # 当推送到 hexo 分支时触发 workflow

jobs:
  hexo-deployment: ### jobs
    runs-on: ubuntu-latest
    env:
      TZ: Asia/Shanghai

    steps: 
    - name: Checkout source  
      uses: actions/checkout@v2
      with:
        submodules: true

    - name: Setup Node.js 
      uses: actions/setup-node@v1
      with:
        node-version: '12.x'

    - name: Install dependencies & Generate static files ### steps
      run: | ### actions,这里是安装了 hexo 和主题、插件
        node -v
        npm un hexo-renderer-marked --save
        npm un hexo-renderer-kramed --sav
        npm i -g hexo-cli
        npm i hexo-renderer-markdown-it --save
        npm i hexo-theme-butterfly
        npm install @neilsustc/markdown-it-katex hexo-wordcount hexo-butterfly-douban hexo-renderer-pug hexo-renderer-stylus hexo-generator-search hexo-butterfly-artitalk hexo-abbrlink --save
        npm i
        hexo clean
        hexo douban
        hexo g
    - name: Deploy to Github Pages ### 这一步是部署,填写相关信息
      env:
        GIT_NAME: MarioZZJ 
        GIT_EMAIL: ${{ secrets.GIT_EMAIL }}
        REPO: github.com/MarioZZJ/blog-MarioZZJ
        GH_TOKEN: ${{ secrets.GH_TOKEN }}
      run: |
        cd ./public && git init && git add .
        git config --global user.name $GIT_NAME
        git config --global user.email $GIT_EMAIL
        git commit -m "Site deployed by GitHub Actions"
        git config --global init.defaultBranch master
        git push --force --quiet "https://$GH_TOKEN@$REPO" master:master

将包含该配置文件的项目推送到远程分支,就完成了 action 的配置。这样,每次 push 到指定分支时触发该工作流,可以在 Github 项目仓库的 Action 选项卡查看具体的配置过程。

想要白嫖

无需代码开发,这可能是建一个自定义博客较为简单的方法了,其中最为关键的一步 【主题配置】 ,我没有写下来详细过程,而是直接引用了原作者的教程文档,这一步其实会耗费最多的时间。如果连这一步都懒得去配置,那可真是无药可救了我可以给你一个配置好的模板仓库 !只要你觉得我这个 博客 看着还可以的话,可以把我配置好的参数直接拿去用!这里只需要修改部分插件的密钥即可,Action 也配置好了只需自行更改 Github Secrets。当然, 本地别忘了安装 node 、hexo 和我用到的插件 (在 package.json 中)

仓库地址:MarioStudio/blog-MarioZZJ: Personal blog of MarioZZJ. Source in hexo branch, pages in master branch. Deployed by Github Actions.

点击 use this template 即可在你的账号里面创建一个一样的仓库。

如果觉得喜欢的话,不妨给我的仓库点个 Star!感谢支持

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容