Hexo升级过程中踩过的坑

标签: 无 分类: 未分类 创建时间:2021-01-03 03:27:03 更新时间:2025-01-17 10:39:22

1.Local hexo not found in

从hexo3.x升级到hexo4.x,使用npm-check-updates的npm插件,但是允许hexo clean命令时出现了:Local hexo not found in

但是我明明已经安装了hexo,并且全局重新安装了。就像下面的参考文章1一样。

最后直接将博客目录下的node_modules文件夹删除了,然后重新执行了cnpm install,解决了问题。

2.Deprecated config detected: “external_link” with a Boolean value is deprecated

这是hexo从4.2.1升级到5.3.0遇到到一个警告。

1
2
3
4
5
## 将external_link
external_link: true

## 换成下面到
external_link.enable: true

3.TypeError [ERR_INVALID_URL]

hexo从3.x升级到4.2.1之后,执行 hexo g 命令会出现一个问题,就是:TypeError ERR_INVALID_URL: Invalid URL: http://www.google.com

当我去搜索url的时候,发现是在文章内有一个url,在3.x的时候是没有问题的。

主要是因为在有一段文字中加入了一个网址,hexo4.x使用了new URL()处理url,所以会出现问题。

可以使用两个点包裹url进行处理即可,其他的问题也这样处理就好了。

4.Accessing non-existent property ‘lineno’ of module exports inside circular dependency

在我安装了node的15.0.0之后,使用原有的hexo工程,运行hexo s之后,出现了下面的问题,可能就是循环引用的问题吧。

5.swig模版不再支持

当我使用npm-update升级老hexo到最新到5.3.0版本之后,支持hexo g,发现页面无法被渲染,只输出了一段文字:

1
{{ partial('_partials/page-home.swig', {per_page: config.index_generator.per_page, index: true}) }}

使用了hexo g之后,报模版不存在:Template render error: (/Users/bibichuan/bibichuan/blog/themes/btheme/layout/index.njk) Error: Partial _partials/page-home.swig does not exist

查了资料才发现,升级之后的hexo,不再支持.swig模版,改用了Nunjucks 引擎。
关于上面的partial的用法是什么,我已经忘记了,是在借鉴了Next主题之后,才用的这个方法。按照字面量来说,应该是一个局部模版的意思,是hexo提供的一个局部模板函数,在ejs模板中可以使用,官方有说明局部模版的用法。swig语法和ejs有些不一样,但是使用 { { partial() } },也是可以替换 < %- partial() % > 语法的,现在的问题,就是如何在nunjucks模板中使用这个partial()函数。

当我把全部的文章删除之后,然后重新运行,发现其实在.njk中使用{ { partial() } },不能使用的原因,是因为为了兼容markdown的 { % % } 语法,修改了nunjucks的源码,

1
2
var VARIABLE_START = '{{';
var VARIABLE_END = '}}';

(1) 把所有的.swig后缀的文件,全部改为了.njk文件,然后在原先的.swig文件中引入的.swig文件,也同样换成.njk

1
2
3
4
5
6
7
8
9
10
## 下面的内容
{% include "menu.swig" %}
## 改为
{% include "menu.njk" %}

## extends语法
{% extends '../_layout.swig' %}
## 改为
{% extends '_layout.njk' %}

参考文章:
1.模板加载器
2.swig模板引擎语法 (这里有macro创建自定义可复用代码段的说明,但是没有partial的用法说明)

1.Error: Unable to call partial, which is undefined or falsey

没有办法,只能先尝试着将.swig文件全部改为.njk文件,重新运行,但是第一个问题就是:Error: Unable to call partial, which is undefined or falsey

nunjucks不支持partial语法了。
当我把全部的文章删除之后,然后重新运行,发现其实在.njk中使用 { { partial() } },不能使用的原因,是因为为了兼容markdown的 { % % } 语法,修改了nunjucks的源码。也可以看下面的:unexpected token 章节,遇到两个扩号叠加的情况,可以在中间加一个 &nbsp;,也就是html中的空格的殊符号

参考文章:
1.Hexo-5.x 与 NexT-8.x 跨版本升级 (这里有模版升级的各种问题)
2.JS Templating: Transitioning from swig to nunjucks

2.template not found

将全部的.swig都改成了.njk之后,还是提示某一个模版不存在,但是明明存在这个.njk文件的。

在网上有这么一个说法:Nunjucks不允许相对路径,所有路径都与配置的基本目录相关。hexo nunjucks的基本路径就是layout,也就是所有的引入,都要相对于layout目录引入。比如,引入_partials/header/menu.njk

1
{% include '_partials/header/menu.njk' %}

这个问题也还是有待商榷,我测试了include是支持相对路径的,但是extends这个语法就似乎不支持相对路径。

参考文章:
1.extending with “../layout.html” results in “template not found”
2.Accept relative paths in import/include #349
3.Relative paths in extend (这个讨论中,提到了一个opts.path,即相对目录的方法,但是不知道在哪里设置,Did you provide a opts.path,nunjucks/blob/master/src/environment.js 文件中的env.renderString(‘test’, {}, { path: path.resolve(__dirname, ‘test.html’) });)
4.Resolving nunjucks includes using relative paths?
5.如何从根本解决hexo不兼容{ { } }标签问题 (也是两种方法,但是效果都不好,使用三个点,以及raw标签)
6.一些学习心得
7.解决nunjucks包括使用相对路径? (这里就说,Nunjucks不允许相对目录,所有的路径都与配置的基本目录相关)

3.unexpected token: } }

使用Nunjucks进行解析的时候: Error [Nunjucks Error]: _posts/Hexo升级过程中踩过的坑.md [Line 40, Column 756] unexpected token:} }

这是因为Nunjucks解析和markdowns语法有冲突。在md文件中,不能同时存在两个左中括号({ {),或者是两个右中括号(} } )连在一起的情况。根据参考文章中的描述, 标签包裹,或者是使用三个点包裹都可以,但是我实际的测试中,效果并不好。其实解决方法也很简单,遇到两个扩号叠加的情况,可以在中间加一个 &nbsp;,也就是html中的空格的殊符号,这样就可以解决问题了

参考文章:
1.解决Hexo标签与MD文件冲突问题 (这里提到了两种解决方法,一种修改markdown文件,一种就是修改nunjucks源码)

4.unexpected token: !

在njk中有一个对象,使用感叹号判断是否为空,这个在js代码中非常的常见,但是似乎在nunjucks模板中就不常见了。

1
2
3
4
5
<!--错误-->
{% if !postObjTag[name] %}

<!--改为-->
{% if not postObjTag[name] %}

5.Cannot read property ‘charAt’ of undefined

6.|| 变成了or

在nunjucks中,不能使用||进行或者比较,要使用or, &&换成and

7.严格的语法

1
2
3
4
5
6
7
8
9
10
11
12
13
// 错误
{%
set js_commons = [
'src/utils.js',
]
%}

// 正确
{%
set js_commons = [
'src/utils.js'
]
%}

8.不支持的方法

1
2
3
4
5
6
7
8
9
10
11
// truncate使用方法改变了
// swig语法
truncate(strip_html(post.excerpt), {length: 250})

// nunjucks语法
"foo bar baz qux"|truncate(9)

// 跳过html
strip_html
// 省略号
addslashes
参考文章:
1.truncate (truncate语法)

9.post为空

这是我遇到的另一个比较大的难题,就是在_home.njk这个模板文件中,我可以通过site.posts获取全部站点的文章,也可以使用page.posts获取本页全部站点的内容,但是当我使用for进行循环的时候,post的内容确实空的。

1
2
3
4
{% for p in page.posts %}
<!--这里输出的内容确实空的-->
{{p.title}}
{% endfor %}

正确的做法是添加一个toArray()

1
2
3
{% for post in page.posts.toArray() %}
{{post.title}}
{% endfor %}

这里可以看到本身的posts以及我自定义之后的posts的区别

上面那个是通过自定义hexo.extend.generator.register(‘index’)生成器是使用的pagination对象生成的,下面的是hexo.extend.generator.register(‘category’)生成器是使用解构函数获取到的。
我把自己定义的生成标签页和生成分类页的内容注释掉,然后添加了page.posts.toArray()、post.categories.toArray()、post.tags.toArray(),这才解决了问题。所以说,自定义主题的时候,遇见了各种各样的问题,你都不知道如何去解决。最后的关注焦点,其实就成了如何重写我自己的生成tags和category的逻辑了。

经过努力思考和资料搜集,page.posts其实是一个object,但是这个object不是一般的object,而是一个model,Post是Hexo封装的一个对象,而且他包含了forEach、toArray方法,所以使用pages.toArray不会报错,但是我自己创建的tags等,是一个数组,并不能继续调用toArray方法了。

最后修改生成主页文章的方法,就是其中的post.toArray()方法调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 重写主页生成器,添加置顶功能
hexo.extend.generator.register('index', function(locals){
var config = this.config;
var posts = locals.posts;
posts.data = posts.data.sort(postSort);
var paginationDir = config.pagination_dir || 'page';
// 原来的
// return pagination('', posts, {

// 现在的
return pagination('', posts.toArray(), {
perPage: config.index_generator.per_page,
layout: ['index', 'archive'],
format: paginationDir + '/%d/',
data: {
__index: true
}
});
});
参考文章:
1.变量 (官方变量的说明)
2.hexo自定义主题搭建笔记
3.从 0 到 1 开发 Hexo 主题杂谈 (这个还是使用的Swig模板引擎)
4.【解决】hexo 生成的publish中html都是空的? (这里倒是提供了一个好的方法hexo s –debug,打开调试模式,而且还提到了使用nvm重新下载nodejs,解决了输出空白的问题,但是我的nodejs版本已经是很高了。)
5.fix: compatible with Node.js 14
7.Iterate Data Model on Jade or Swig (这里也说了:Hexo uses Warehouse for its data model. It’s not an array so you may have to transform objects into iterables.应该使用toArray())

10.可以在script标签中直接引用站点和theme配置中的内容

可以在script标签中直接引入站点的配置内容

1
2
3
4
5
6
<!--其中的{{config.title}}会被替换为站点根目录下的_config.yml中的title-->
<!--其中的{{theme.title}}会被替换为主题根目录下的_config.yml中的title-->
<script>
console.log('{{config.title}}');
console.log('{{theme.title}}');
</script>

11.theme配置和站点配置分开了

在使用.swig模板的时候,我可以在文件中使用 theme.root,引用到在站点根目录下_config

1
2
3
4
5
6
7
<script type="text/javascript" id="hexo.configurations">
var BTheme = window.BTheme ||{};
var CONFIG = {
root: '{{ config.root }}'
};
</script>

6.新建文章出现tile为null

升级到hexo 5.3.0之后,在windows上使用命令:hexo new post 新建一篇文章,文章的开头变成了:’[object Object]’: null。

1
2
3
4
5
6
7
8
---
title:
'[object Object]': null
date:
'[object Object]': null
tags:
categories:
---

这个问题还有待深入的研究。 这个问题莫名奇妙的好了,不知道为什么。关机重启,再不行就重装系统吧。

7.Accessing non-existent property ‘lineno’ of module exports inside circular dependency

7.同时部署两个网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## hexo5.x之前的
deploy:
type: git
repo:
github:
gitee:
branch: master


## hexo5.x之后的
deploy:
- type: git
repo:
- type: heroku
repo:
参考文章:
1.部署

8.for语法

使用nunjucks模版引擎之后,原有的for循环的写法改变了。

1
2
3
4
5
6
7
8
{#  原有的写法 #} 
{% for index,item in site.data.movie %}
{% endfor %}


{# 现在的写法 #}
{% for item in site.data.movie %}
{% endfor %}
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。