Hexo升级过程中踩过的坑
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,解决了问题。
1.ERROR Local hexo not found
2.Deprecated config detected: “external_link” with a Boolean value is deprecated
这是hexo从4.2.1升级到5.3.0遇到到一个警告。
1 | ## 将external_link |
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之后,出现了下面的问题,可能就是循环引用的问题吧。
1.解决 Hexo 在使用 Node.js 14 时的 Accessing non-existent property ‘xxx’ of module exports inside circular dependency 问题 _ (这里有除了降级之外的其他方法)
2.部署Hexo踩过的坑—node14.0配置hexo (https://zhuanlan.zhihu.com/p/136552969) (这里只有降级的方法)
3.Node 14 with warning (node:31518) Warning: Accessing non-existent property ‘column’ of module exports inside circular dependency
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 | var VARIABLE_START = '{{'; |
(1) 把所有的.swig后缀的文件,全部改为了.njk文件,然后在原先的.swig文件中引入的.swig文件,也同样换成.njk
1 | ## 下面的内容 |
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 章节,遇到两个扩号叠加的情况,可以在中间加一个
,也就是html中的空格的殊符号
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文件中,不能同时存在两个左中括号({ {),或者是两个右中括号(} } )连在一起的情况。根据参考文章中的描述, 标签包裹,或者是使用三个点包裹都可以,但是我实际的测试中,效果并不好。其实解决方法也很简单,遇到两个扩号叠加的情况,可以在中间加一个
,也就是html中的空格的殊符号,这样就可以解决问题了
1.解决Hexo标签与MD文件冲突问题 (这里提到了两种解决方法,一种修改markdown文件,一种就是修改nunjucks源码)
4.unexpected token: !
在njk中有一个对象,使用感叹号判断是否为空,这个在js代码中非常的常见,但是似乎在nunjucks模板中就不常见了。
1 | <!--错误--> |
5.Cannot read property ‘charAt’ of undefined
6.|| 变成了or
在nunjucks中,不能使用||进行或者比较,要使用or, &&换成and
7.严格的语法
1 | // 错误 |
8.不支持的方法
1 | // truncate使用方法改变了 |
1.truncate (truncate语法)
9.post为空
这是我遇到的另一个比较大的难题,就是在_home.njk这个模板文件中,我可以通过site.posts获取全部站点的文章,也可以使用page.posts获取本页全部站点的内容,但是当我使用for进行循环的时候,post的内容确实空的。
1 | {% for p in page.posts %} |
正确的做法是添加一个toArray()
1 | {% for post in page.posts.toArray() %} |
这里可以看到本身的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 | // 重写主页生成器,添加置顶功能 |
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 | <!--其中的{{config.title}}会被替换为站点根目录下的_config.yml中的title--> |
11.theme配置和站点配置分开了
在使用.swig模板的时候,我可以在文件中使用 theme.root,引用到在站点根目录下_config
1 | <script type="text/javascript" id="hexo.configurations"> |
6.新建文章出现tile为null
升级到hexo 5.3.0之后,在windows上使用命令:hexo new post 新建一篇文章,文章的开头变成了:’[object Object]’: null。
1 | --- |
这个问题还有待深入的研究。 这个问题莫名奇妙的好了,不知道为什么。关机重启,再不行就重装系统吧。
7.Accessing non-existent property ‘lineno’ of module exports inside circular dependency
1.Node 14 with warning (node:31518) Warning: Accessing non-existent property ‘column’ of module exports inside circular dependency
2.fix: compatible with Node.js 14 (好像有人说是hexo-fs的问题)
7.同时部署两个网站
1 | ## hexo5.x之前的 |
1.部署
8.for语法
使用nunjucks模版引擎之后,原有的for循环的写法改变了。
1 | {# 原有的写法 #} |