Speed Up the Rendering Process of hexo 3

Hexo 3 自从放出更新到现在已经有很长一段时间了,相信很多人跟我一样都经历了一个非常曲折的升级过程。

第一个问题是我所编写的主题和插件全都阵亡了,这个问题在我决定升级 Hexo 之前已经被很多用户轰炸过,于是我花了两个晚上的时间对所有的主题和插件进行了大幅修改和升级。

另一个让我无比郁闷的问题是:官方虽然宣称 3.0 之后站点渲染速度更快了,但实际测试时我发现结果正好相反——全站 168 篇文章,在 Hexo 2.8.3 环境中渲染只需 3~4 秒时间,而更新到 Hexo 3.0 之后,网站的渲染居然花了一个多钟!

为了找出导致这个问题的 bottleneck ,我通过二分的手段很快定位出了问题文章 《ArchLinux安装配置OpenGL》,这篇文章乍一看没啥特别之处,但问题就出在文中这段长长的目录结构图:

oglsuperbible5-read-only/    # OpenGL SuperBible 5th Edition 代码包
|                                            
+--  freeglut-2.6.0/         # freeglut 安装包                   
|                                                               
+--  Linux/                  # Linux Makefile 工程文件
|     |                                               
|     +----  Chap01/                                  
|     |        |                                      
|     |        +---- Block/                           
|     |                |                              
|     |                +---- Makefile # Block 程序的Makefile
|     |                                                     
|     +----  ...                                            
|     |                                                     
|                                                           
+--  Src/                   # 源代码         
|     |                                                     
|     +----  Chap01/                                        
|     |        |                                            
|     |        +---- Block/                                 
|     |                |                                    
|     |                +---- Block.cpp # Block 程序源文件
|     |                                                  
|     +----  ...                                         
|     |                                                  
|     |                                                  
|     +----  GLTools/      # GLTools工具包               
|     |        |                                         
|     |        +---- include/  # 头文件                  
|     |        |      |                                  
|     |        |      +----  GL/                         
|     |        |      |                                  
|     |        |      +----  GLTools.h # GLTools头文件   
|     |        |      |                                  
|     |        |      +----  math3d.h  # 矩阵类头文件    
|     |        |      |                                  
|     |        |      +----  ...                         
|     |        |                                         
|     |        +---- src/     # 源文件                   
|     |               |                                  
|     |               +---- GLTools.cpp # GLTools头文件  
|     |               |                                
|     |               +---- math3d.cpp  # 矩阵类源文件
|     |               |                               
|     |               +---- ...                       
|     |                                               
|     +----  Models/                                  
|     |                                               
|     +----  OpenEXR/                                 
|                                                     
+--  VisualStudio2008/    # VisualStudio 2008 工程文件
|                                                     
+--  VisualStudio2010/    # VisualStudio 2010 工程文件
|                                                     
+--  XCode/               # XCode 工程文件

对于这类语言无关的文本,我通常的做法是使用一对 ''' 包含,并且不带任何语言的说明。这种做法在 Hexo 2.x 中并没有问题,因为 Hexo 2 自带的语法高亮插件 highlight.js 在遇到没有语言说明的代码时是统一当成纯文本(plain)来解析的。而到了 Hexo 3 ,这样的内容就会使得 Hexo 3 的渲染变得奇慢无比。这是因为 Hexo 3 中的 highlight.js 会试图分析这段内容可能属于那种语言,内容越长,分析时间就越长。

解决办法就是在第一个 ''' 之后加上 plain 说明符,向 highlight.js 显式表明这是一段纯文本,那么当 highlight.js 解析到这段文本时,就会直接放弃语言类型的分析,从而大幅减少渲染时间。

考虑到我的博客中有很多这样的代码,我写了个脚本 speedup.py ,帮我在没有语言说明符的代码段后面加上 plain说明符:

#!/usr/bin/python2
'''
SYNOPSIS:
$ python speedup.py -f FILE
or
$ python speedup.py -d DIR
'''
import sys, os, getopt
 
TARGET_TYPE = [".md", ".markdown"]
 
def process_file(path):
    ''' Process a file. '''
    line = ""
    quote_flag = False
    line_list = []
    with open(path) as f:       
        while True:
            line = f.readline()
            if line == "":
                break
            if line.startswith("```"):
                quote_flag = not quote_flag
            if line.strip()=="```" and quote_flag:
                line = "\`\`\` plain\r\n"
            line_list.append(line)
    with open(path, 'w+') as f:
        f.writelines(line_list)
 
 
def process_dir(path):
    ''' Process a directory. '''
    file_list = []
    files = os.listdir(path)
    for file in files:
        file = os.path.join(path, file)
        root, ext = os.path.splitext(os.path.basename(file))
        if os.path.isfile(file) and ext in TARGET_TYPE:
            process_file(file)
 
 
def main():
    if len(sys.argv) < 2:
        print "Arguments should be at least 2."
        print "python speedup.py -f [FILE]"
        print "python speedup.py -d [DIRECTORY]"
        exit(1)
 
    try:
        opts, args = getopt.getopt(sys.argv[1:], "f:d:", ["file=", "directory="])
        for arg, value in opts:
            if arg in ('-f', '--file'):
                root, ext = os.path.basename(value)
                if ext in 'TARGET_TYPE':
                    process_file(value)
            elif arg in ('-d', '--directory'):
                process_dir(value)
            else:
                print "Argument error. %s" % arg
                exit(1)
    except getopt.GetoptError as e:
        print e
        exit(1)
 
 
if __name__ == '__main__':
    main()

使用方法很简单:

$ python speedup.py -f FILE  # 优化单个 markdown 文件
$ python speedup.py -d DIR   # 优化一个目录下的所有 markdown 文件

原文发布于微信公众号 - HaHack(gh_12d2fe363c80)

原文发表时间:2015-06-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LEo的网络日志

python技巧分享(十三)

1383
来自专栏醉程序

怎么使用slim-jwt-auth对API进行身份验证

1552
来自专栏Golang语言社区

转--在学Go语言

开始学点儿Go语言,这语言据说在国内比在国外火,社区上褒贬不一,不过“小马过河”嘛,总要先自己试试再来下结论。 环境准备: 1.在Golang中国下载安装go语...

3367
来自专栏网络

如何用 Python 爬取网页制作电子书

关键时刻,第一时间送达! 作者简介:孙亖,软件工程师,长期从事企业信息化系统的研发工作,主要擅长后台业务功能的设计开发。 本文来自作者在 GitChat 上分享...

30010
来自专栏申龙斌的程序人生

零基础学编程036:快速编写一个GUI程序

在《零基础学编程035:群发邮件并不难》里,我们学会了发邮件,我用于向shenlongbin@sync.omnigroup.com发送一封邮件,就可以实现GTD...

3088
来自专栏自动化测试实战

RF第三讲--定义用户关键字

3475
来自专栏七夜安全博客

(原创)Scrapy爬取美女图片

1945
来自专栏大数据挖掘DT机器学习

使用Python编写网络爬虫抓取视频下载资源

Python因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些模块的存在,用Python来写爬虫就简直易于反掌了。...

3796
来自专栏逸鹏说道

TypeScript 1.6发布:完全支持React/JSX

2012年,微软推出了一个能够在Node.js上运行的开源语言——TypeScript。作为JavaScript的超集,TypeScript在兼容JavaScr...

2585
来自专栏一个会写诗的程序员的博客

《Kotlin极简教程》第2章 快速开始:HelloWorld

我们在本章将介绍使用Kotlin程序设计语言,分别使用命令行、应用程序、Web RESTFul、Android、Kotlin JavaScript等方式向世界问...

703

扫码关注云+社区