Hexo-theme-material Debug

  这个博客使用了Hexo框架,所用的主题是Hexo-theme-material。Hexo的文档很久没更新,而material主题的作者早在两年前就弃坑跑路。因此对于我这个前端小白而言,debug变得比较麻烦。这里简要记录我遇到的两个坑以及解决方案。

Hexo generate报错

问题描述

  Fresh install Node.js and Hexo,安装material 1.5.6,修改配置后执行

hexo clean && hexo g 

  报错

Cannot read property 'startsWith' of null

解决方案

  修改layout/_widget/dnsprefetch.ejs文件[1]。修改内容如下:

<% } else if(theme.comment.use.startsWith("disqus")) { %>
// to
<% } else if(theme.comment.use && theme.comment.use.startsWith("disqus")) { %>

  原因在于该主题没有对配置进行基本检查。许多配置没有添加默认选项,因此_config.yaml文件中缺少一些配置项就可能导致编译报错。不同版本的文件位置可能发生变化,用户可以全局搜索关键字再进行修改。

翻页按钮无法正常显示

问题描述

  首页翻页按钮无法显示,输出html代码。

1
<button aria-label="Next page" class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon"><i class="material-icons" role="presentation">arrow_forward</i></button>

  系统配置如下:

Node.js = 13.0.1
Hexo = 4.2.1
Hexo-cli = 3.1.0
Hexo-theme-material = 1.5.6

解决方案

  2020/08/02 Update:

  在 themes/material/layout/index.ejs 中添加 escape:false即可 [2]。添加位置如下。

<% if (page.total > 1) { %>
    <!-- Index nav -->
        <nav class="material-nav mdl-cell mdl-cell--12-col">
            <%- paginator({
                prev_text: __('<button aria-label="Last page" class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon"><i class="material-icons" role="presentation">arrow_back</i></button>'),
                next_text: __('<button aria-label="Next page" class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--icon"><i class="material-icons" role="presentation">arrow_forward</i></button>'),
                // Add a comma
                space: '',
                // Add the new property
                escape:false,
            }) %>
        </nav>
    <% } %>

—以下是旧方案—

  该问题在于material主题与新版本的Hexo编译器不兼容。卸载旧版本的Node.js和Hexo,安装以下版本即可解决。

Node.js = 8.17.0
Hexo = 3.8.0
Hexo-cli = 1.0.4
Hexo-theme-material = 1.5.6

  具体操作:

  1. 从控制面板卸载Node.js,然后到官网安装指定版本。过程可参考Node.js安装配置

  2. 卸载并重装Hexo

    npm uninstall hexo -g
    npm uninstall hexo-cli
    
    #更换淘宝npm源
    npm config set registry https://registry.npm.taobao.org
    
    #测试是否更换成功
    npm config get registry 
    
    npm install -g hexo@3.8.0
    npm install hexo-cli@1.0.4
  3. 重新编译。

    hexo clean && hexo g && hexo s

提示:Hexo降级至3.x之后,如果需要启用RSS服务,hexo-generator-feed也需要进行降级。

#hexo-generator-feed = 1.2.2
npm install hexo-generator-feed@1.2.2 --save

另注:Hexo 3.8.0版本有时会出现”localhost:4000“无响应bug。对此只需修改端口号即可。

hexo clean && hexo g && hexo s -p 5000

这里顺便记录一个需要注意的点:

  新建侧边栏独立页面时,注意区分TAB和空格。例如:

        友情链接:
        #前面是8个空格
        #如果使用两个TAB,编译器会略过此部分内容
            link: "/links"
            #前面是12个空格
            icon: insert_link
            divider: false

  其实这也不算什么bug,毕竟Python也是这种死扣空格和TAB的类型。关键在于,绝大部分用户是没机会手动编辑底层yml文件的,所以容易忽略这一问题。

Reference

[1] Hexo-theme-material Issue #686

[2] Hexo-theme-material Issue #752