hexo 设置相册、主页并使用七牛云加速图片加载

据换完博客主题之后也有一段时间了,但总觉得哪里不对的样子,别人家都是主页和博客分开的,或者把博客放在主页的子目录下,而自己的却只有一个博客,反正自己也有域名,为什么不整个单独的主页出来呢。

这篇文章记录了海痴是如何在 google 上扒模版,如何利用 travis 来将博客的内容同步到主页上,又如何与某涛互相比较,解决图片加载慢的问题。

我们可以看看最终的效果:https://www.liebes.top

在一切开始之前,海痴已经准备好了用 hexo 搭建起来的博客,一个自己的域名,以及使用 travis 将博客部署到自己的服务器的脚本。可以参见上一篇博客:Hexo 更换 materail 主题,使用 Travis 持续集成

一份靠谱的主页模板

关于如何找到一份高端上档次的主题模板,大家可以各显神通,当然,最快的还是 google 上搜一下:“主页 模板 bootstrap”,请一定加上 bootstrap 这个关键字,因为经过实践,这样搜出的结果最靠谱。

准备好之后,就可以将模板文件放在博客的根目录下,随便起个名字,就像这样:

├── _config.yml
├── db.json
├── liebes.top <- 这个是模板文件
├── liebes.top.py <- 这个是之后会用到的脚本文件
├── node_modules
├── package-lock.json
├── package.json
├── public
├── pyyaml
├── scaffolds
├── source
├── themes
└── travis.enc

根据你的需要来修改你的主页模板。

动态获取博客内容,嵌入主页中

如果你希望你的主页上显示一些你的个人动态,你就要动一番手脚了。

一个简单的办法,就是使用 php 做个后台支持,这并不难。

海痴希望将自己最近写的博客显示在主页上,同时显示一些相册里面的照片。一个简单的思路,就是读取博客目录中的静态文件,提取内容,找出时间相近的部分,使用脚本文件对 html 进行替换。

于是我的 index.html 文件就变成了这个样子:

<section class="swag text-center">
  <div class="container">
    <div class="row">
      <div class="col-md-8 col-md-offset-2">
        <h1>我共写了 {count} 篇博客<span>记录生活,记录点滴</span></h1>
        <a href="#portfolio" class="down-arrow-btn"><i class="fa fa-chevron-down"></i></a>
      </div>
    </div>
  </div>
</section>
<section class="portfolio text-center section-padding" id="portfolio">
  <div class="container">
    <div class="row">
      <div id="servicesSlider" class="hidden-sm hidden-xs">
        <ul class="slides">
          {articles}
        </ul>
      </div>
        <div id="servicesSlider2" class="hidden-md hidden-lg">
            <ul class="slides">
                {articles2} <- 这个是适配小屏幕的
            </ul>
        </div>
    </div>
  </div>
</section>

我将需要替换的部分用 {var} 来标记,为之后的脚本文件作准备。

由于最近在弄机器学习相关的东西,python 使用的比较多,就顺手用 python 写的脚本。

import os
import re
import yaml

imgCdnPath = "http://p3q6bdexg.bkt.clouddn.com"
imgRule_ori = "?imageMogr2/thumbnail/600x/blur/1x0/quality/75"
imgRule_webp = "?imageMogr2/thumbnail/600x/format/webp/blur/1x0/quality/75|imageslim"
imgPath = "https://blog.liebes.top"
useCdn = True

def convert_md(filePath):
    file = open(filePath, 'r')
    content = file.read()
    pattern = re.compile(r'---([\s\S]*)---\n([\s\S]*)')
    content = re.search(pattern, content)
    prefix = content.group(1)
    main = content.group(2)
    pattern = re.compile(r'[-`#\s]')
    # print(prefix)
    main = re.sub(pattern, "", main)
    mLen = min(len(main), 250)
    main = main.decode('utf-8')[0:mLen].encode('utf-8')

    pattern = re.compile(r'title:( *)(.*?)( *)\n')
    title = re.search(pattern, prefix).group(2)
    pattern = re.compile(r'date:( *)(.*?)( *)\n')
    date = re.search(pattern, prefix).group(2)
    pattern = re.compile(r'img:( *)(.*?)( *)\n')
    img = ""
    try: 
        img = (imgPath, imgCdnPath)[useCdn] + re.search(pattern, prefix).group(2) + ("", imgRule_ori)[useCdn]
    except:
        img = "img/portfolio-01.jpg"
    webSite = "https://blog.liebes.top"
    url = date[0:10]
    url = url.replace("-", "/")
    basename = os.path.basename(filePath)
    basename = os.path.splitext(basename)[0]

    return {
        'title': title,
        'date' : date,
        'main' : main,
        'url'  : webSite + "/" + url + "/" + basename,
        'src'  : img
    }

def change_html(html_path, mdList, totalCount):

    html = ""
    html2 = ""
    s = ""
    template = ""

    with open(os.getcwd() + "/source/_data/li-article.html", "r") as file:
        template = file.read()

    for idx, item in enumerate(mdList):
        tem = template
        tem = tem.replace("{title}", item['title'])
        tem = tem.replace("{url}", item['url'])
        tem = tem.replace("{content}", item['main'])
        tem = tem.replace("{src}", item['src'])
        s = s + tem
        html2 = html2 + "<li>" + tem + "</li>"
        if idx % 3 == 2:
            s = "<li>" + s + "</li>"
            html = html + s
            s = ""
    content = ""
    with open(html_path, 'r') as file:
        content = file.read()
    content = content.replace("{articles}", html)
    content = content.replace("{count}", str(totalCount))
    content = content.replace("{articles2}", html2)
    with open(html_path, 'w') as file:
        file.write(content)

def convert_links(filePath):
    links = {}
    template = ""
    html = ""
    html2 = ""
    with open(filePath + "/links.yaml", 'r') as file:
        links = yaml.load(file)

    with open(filePath + "/li-links.html", "r") as file:
        template = file.read()

    s = ""
    for idx, k in enumerate(links):
        tem = template
        tem = tem.replace("{link}", links[k]["link"])
        tem = tem.replace("{pic}", links[k]["avatar"])
        tem = tem.replace("{desc}", links[k]["descr"])
        tem = tem.replace("{name}", k)
        html2 = html2 + "<li>" + tem + "</li>"
        s = s + tem
        if idx % 3 == 2:
            s = "<li>" + s + "</li>"
            html = html + s
            s = ""
    if s != "":
        s = "<li>" + s + "</li>"
        html = html + s
        s = ""

    content = ""
    with open(os.getcwd() + "/liebes.top/index.html", "r") as file:
        content = file.read()

    content = content.replace("{links}", html.encode("utf-8"))
    content = content.replace("{links2}", html2.encode("utf-8"))

    with open(os.getcwd() + "/liebes.top/index.html", "w") as file:
        file.write(content)

def convert_gallery(filePath):
    links = {}
    template = ""
    html = ""
    html2 = ""
    with open(filePath + "/gallery.yaml", 'r') as file:
        links = yaml.load(file)

    with open(filePath + "/li-gallery.html", "r") as file:
        template = file.read()

    s = ""
    for idx, k in enumerate(links):
        tem = template
        tem = tem.replace("{src}", "%s"%(links[k]["full_link"]))
        #tem = tem.replace("{src}", "%s%s%s"%((imgPath, imgCdnPath)[useCdn], links[k]["full_link"], ("", imgRule_ori)[useCdn]))
        s = s + tem
        html2 = html2 + "<li>" + tem + "</li>"
        if idx % 2 == 1:
            s = "<div class=\"col-md-4 wp4\">" + s + "</div>"
            html = html + s
            s = ""
        if idx == 5:
            break
    if s != "":
        s = "<div class=\"col-md-4 wp4\">" + s + "</div>"
        html = html + s
        s = ""
    html = "<li>" + html + "</li>"
    content = ""
    with open(os.getcwd() + "/liebes.top/index.html", "r") as file:
        content = file.read()

    content = content.replace("{gallery}", html.encode("utf-8"))
    content = content.replace("{gallery2}", html2.encode("utf-8"))
    with open(os.getcwd() + "/liebes.top/index.html", "w") as file:
        file.write(content)

baseDir = os.getcwd()
mds = os.listdir(baseDir + "/source/_posts")
totalCount = len(mds)

mdList = []
for md in mds:
    md = baseDir + "/source/_posts" + "/" + md
    turple = convert_md(md)
    mdList.append(turple)

mdList = sorted(mdList, key = lambda item: item['date'], reverse=True)
mdList = mdList[0:6]

change_html(baseDir + "/liebes.top/index.html", mdList, totalCount)
convert_links(baseDir + "/source/_data")
convert_gallery(baseDir + "/source/_data")

这份 python 文件引用了 pyyaml 这个依赖包,所以需要先安装一下。

 - git clone https://github.com/yaml/pyyaml.git
 - cd pyyaml
 - sudo python setup.py install

具体的做法就是使用正则读取出文章最开始的数据信息,比如时间、标题等等,然后去对 html 做替换。不详说,有问题可以在评论区提问。

Travis 脚本修改

本着程序员一切从简的心态,当把项目提交到 github 上之后,就应该完成一切的部署操作,于是适当修改Travis 脚本

before_install:
  - git clone https://github.com/yaml/pyyaml.git
  - cd pyyaml
  - sudo python setup.py install
  - cd ..
  ...
script:
  - python liebes.top.py
  - rsync -az -vv --delete -e 'ssh' liebes.top/ root@www.liebes.top:/var/www/www
  ...

当然,这需要你在服务器上提前配置好 nginx

图片加载加速

在我美滋滋的弄完所有的工作之后,下一个问题困扰了我:网站加载慢。如果你也是使用的阿里云最低配的服务器,你也一定会遇到这个问题。图片加载慢带来的连锁反应就是 js 的执行会等待 DOM 加载完毕,于是刚打开网站的时候就会有一种网站烂掉的错觉。

七牛云可以提供免费的对象存储服务,有免费的 10G 可以使用。

https://portal.qiniu.com 七牛云网址

实名认证后可以创建对象存储资源,创建好之后在 内容管理 -> 上传文件 上传你的文件,之后就可以使用外链进行访问了。

请一定继续将图片传到你的 git 仓库中,因为如果某一天加速服务取消了,你的图片就不见了。

这样折腾完,基本上页面加载速度会在 5s 内搞定

最后吐槽一句,写完 python 写其他语言,出现的错误基本都是没写分号 :)