迁移到Hexo遇到的几个问题

想将Blog从VPS上迁移到Github Page,正好看到了Hexo,同时也突然喜欢上了NexT的主题,然后马上动手迁移。

导入到Hexo

从wordpress导出所有内容

从wordpress导出的步骤比较简单,但我却遇到个比较诡异的问题,就是下载到的xml文件不完整——无论用哪个浏览器,得到的文件只有79.6K。

一开始以为是php的问题,然后修改php.ini里面的memory_limit到512M,但不成功。 接着以为是nginx的问题,但发现php返回的文件就是这个大小。最后的解决方法是实用wp-cli.

1
2
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar export --path=<wordpress path> --dir=./

将WXR文件导入到Hexo时中文URL问题

网上已经很多Hexo的介绍,安装步骤就不说了。导入过程中遇到的是 中文URL 的问题。由wordpress导出的文件里post_name是URL encode的,而hexo-migrator-wordpress会将该值当作slug直接使用,导致会出现一堆诸如 4-e6-9c-8810-e6-97-a5-e5-85-a5-e6-89-8bp1i.md这样的文章(文件)。

找到的解决方法在hexo-migrator-wordpress的Github issue里面找到,关于Wordpress迁移时,生成文件名的中文名字问题。但可能是我几年前写Blog没注意,在标题上添加了utf-8里面也没有的字符,只是简单的使用decodeURI时会报错,最后只能catch那个错误。

1
2
3
4
5
try {
if (slug) data.slug = decodeURI((slug));
} catch (e) {
if (slug) data.slug = slug;
}

使用algolia搜索服务

本来打算使用Local Search,但不知道什么神秘原因页面一直在loading,同时在NexT主题的作者Blog里体验了一把algolia的速度,决定使用它。

API key错误

安装NexT的文档配置algolia,运行hexo algolia的时候一直报错,没办法只能去研究代码。一开始发现是algolia返回的结果提示api key为空,看到代码

1
var HEXO_ALGOLIA_INDEXING_KEY = process.env.HEXO_ALGOLIA_INDEXING_KEY;

发现需要环境变量,到hexo-algolia主页发现原来为了安全,需要用户重新申请多一个拥有Add records, Delete records, List indices, Delete index权限的API Key,并将其导出为环境变量

1
export HEXO_ALGOLIA_INDEXING_KEY=…

Record is too big错误

鉴于我是那种‘命运一直在和我作对’的人,我才不相信这么容易就可以完成我的迁移😂。果然,向algolia建立索引的时候又报错了。debug得知服务器的返回结果

message: ‘Record at the position 0 objectID=<> is too big size=43586 bytes. Contact us if you need an extended quota’

网上所以解决办法未果,得知每次request的大小最大只有10K,看来又要自己研究代码。首先是--chunk-size选项,开头我以为这是byte为单位,查lodash的代码后才知道这是array的大小。既然这样那就改变这个值试试。从1000到100再到10,这个错误提示一直存在,到最后将其改成1,错误依然。

登陆algolia网站看了一下,发现还是索引了不少文章,那应该就是某几篇太长了。继续浏览发觉algolia索引的内容还有html tag和html encode了的内容,这样确实会占用不少字符,也难怪会超过10K了。最后的办法是去除html tag,decode文章的内容。这里需要用到2个node module,striptagshtml-entities

1
2
3
var striptags = require('striptags');
const Entities = require('html-entities').AllHtmlEntities;
const entities = new Entities();

然后在文件 index.js hexo-algolia/lib/command.js开始处加上以上引用,在66行添加以下代码

1
2
3
4
5
6
7
.then(function(publishedPosts) {
return publishedPosts.map(function(data) {
data.content = striptags(data.content);
data.content = entities.decode(data.content);
return data;
})
})

这样索引的内容体积就少了。