在 Windows 上利用 Github Page 快速搭建 Hexo 博客

Hexo 是一个快速、简单且功能强大的 Node.js 静态博客框架,可以方便地生成静态网页并托管在 Github 等平台上

准备工作

  • 安装 Node.js:到 Node.js 的官网下载最新版本并安装
  • 安装 Git:到 Git 官网下载最新版本安装,然后配置本地 Github 的账户密码并生成密钥
  • 安装 Hexo:在命令行使用 npm install -g hexo 命令安装 Hexo,然后运行 hexo -v,如果输出版本号即为安装成功
  • 在 Github 上创建用于托管博客的仓库:JasonLian.github.io

初始化并生成静态页面

  • 初始化:在本地新建一个项目文件夹(比如 Blog),进入 Blog 目录,运行 hexo init 进行初始化
  • 生成静态页面:运行 hexo generate 将文章编译为静态页面
  • 本地启动:运行 hexo server,然后在浏览器中输入 http://localhost:4000/ 查看生成的页面效果

部署到 Github

  • 部署之前先修改配置文件

    1
    2
    3
    4
    deploy:
    type: git
    repository:git@github.com:JasonLian/JasonLian.github.io.git
    branch: master
  • 然后,通过 npm install hexo-deployer-git --save 安装部署插件,并进行部署 hexo deploy

  • 部署成功之后,稍等片刻就能通过 jasonlian.github.io 查看博客了,效果和本地预览相同

多终端同步管理

  • 在一台新终端上建立 Blog 文件夹并初始化 Hexo (init & generate)
  • 在 Blog 下新建 .deploy_git 文件夹,进入并运行

    1
    2
    3
    4
    git init
    git remote add origin git@github.com:JasonLian/JasonLian.github.io.git
    git fetch --all
    git reset --hard origin/master
  • 一种更简单的方式是:直接使用 Resilio Sync 等同步工具将整个 Blog 文件夹在不同终端之间备份即可


发表文章并添加分类和标签

  • 新建一篇文章:运行 hexo new "title",然后就可以在 source/_post 文件夹下看到新建的 markdown 文件
  • 发布一篇文章:编辑新建的 md 文件后,generate + deploy 即可
  • 添加标签页面hexo new page tags 新建标签页面,在标签 md 文件中添加 type: "tags",然后在主题配置文件的 menu 下添加 tags: /tags
  • 添加分类页面hexo new page categories 新建标签页面,在标签 md 文件中添加 type: "categories",然后在主题配置文件的 menu 下添加 categories: /categories
  • 为文章添加分类和标签:在文章的 front-matter 中添加如下代码,注意 Hexo 中每篇文章可以指定多个标签,但是只能指定一个分类,如果需要关闭评论功能,可以将 comments 设置为 false
    1
    2
    3
    4
    categories: Diary
    tags:
    - PS3
    - Games

将 Hexo 同时托管到 Github 和 Coding

  • Github 在国内的访问速度有时会很慢,甚至出现打不开的情况,而且受 Github 屏蔽百度爬虫所限,托管在 Github Page 的博客在百度上是搜索不到的,除非想百度手动推送你的链接,很是麻烦
  • 因此,可以考虑将 Hexo 托管到 Coding Page 上,步骤和 Github 大致相同,在 Coding 上部署公钥,然后在 Git Bash 中输入命令 ssh -T git@git.coding.net 即可
  • 更进一步,如果想同时托管到 Github Page 和 Coding Page,只需要在万网买一个域名,同时绑定两个网址,并设置国内 ip 指向 Coding,国际 ip 指向 Github 即可,详细步骤参见 Reference

实现简单的文章加密访问

  • 如果使用 next 主题,则找到 themes->next->layout->_partials->head.swig 文件,在文件末尾加入以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <script>
    (function(){
    if('{{ page.password }}'){
    if (prompt('请输入文章密码','') !== '{{ page.password }}'){
    alert('密码错误!');
    history.back();
    }
    }
    })();
    </script>
  • 加入上述代码后,只需在需要加密的文章头部添加 password 变量即可,变量值设置为自己设定的密码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    title: Hexo文章简单加密访问
    date: 2016-12-01 10:45:29
    tags: hexo
    categories: 博客
    keywords:
    - Hexo
    - 加密
    description: 阅读本文,请输入密码
    password: youpassword
  • 如果你开启了 RSS 订阅功能,或者本地搜索功能,那么在执行 Hexo generate 之后,加密文章的内容也会自动写入 public 文件夹下的 search.xml 文件和 atom.xml 文件中

  • 为了去除这些文件中的敏感内容,在博客根目录新建一个 rm_secret.py 文件,添加如下代码,在每次 generate 和 deploy 之间,将加密文章名添加到 delete_article_names 数组中,然后执行即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # coding:utf8
    import re
    # 设置需要去除的文章名
    delete_article_names = ["article1", "article2"]
    delete_files = ['./public/atom.xml', './public/search.xml']
    for delete_file in delete_files:
    fr = open(delete_file)
    content = fr.read()
    # print content
    fr.close()
    checks = re.findall(r'<entry>(.*?)</entry>', content, re.S)
    for check in checks:
    delete = 0
    for delete_article_name in delete_article_names:
    if delete_article_name in check:
    delete = 1
    if delete==1:
    content = content.replace('<entry>' + check + '</entry>', '')
    fw = open(delete_file, 'w')
    fw.write(content)
    fw.close()

常见错误及解决方案

hexo deploy 部署失败

  • 部署时提示如下错误,解决方法为删除 .deploy_git 文件夹后重新部署
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    error: bad signature
    fatal: index file corrupt
    FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
    Error: error: bad signature
    fatal: index file corrupt
    at ChildProcess.<anonymous> (C:\Users\Lian\Blog\node_modules\hexo-util\lib\spawn.js:37:17)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at ChildProcess.cp.emit (C:\Users\Lian\Blog\node_modules\cross-spawn\lib\enoent.js:40:29)
    at maybeClose (internal/child_process.js:877:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)

Reference