盒子
盒子
文章目录
  1. hexo-generator-search 插件修改
    1. 安装插件
    2. 修改插件
  2. hexo-search 插件修改
    1. 安装插件
    2. 修改插件

优化本地站内搜索功能

主题使用的本地搜索功能,需安装hexo-generator-search插件生成 XML 格式的索引文件,或者安装hexo-search插件生成 json 格式的索引文件,本地站内搜索都是基于索引文件的。

但是默认生成search.xml索引文件比较大,这里我们说下优化search.xml索引文件大小,加快搜索速度。

hexo-generator-search 插件修改

安装插件

本地站内搜索都是基于索引文件的,Hexo 中可通过hexo-generator-search插件生成 XML 格式的索引文件。

1
npm install hexo-generator-search --save

然后在 Hexo 站点根目录下的_config.yml中添加如下配置即可:

1
2
3
search:
path: search.xml
field: all

修改插件

  • 改造index.js

默认生成的search.xml文件很大,原生插件生成的内容太多了,还会包含代码行数、html 标签,包含很多冗余信息,所以有必要阉割 + 改造,参考网上部分文章,采用以下代码对其进行精简。

首先修改node_modules/hexo-generator-search/index.js文件,在其中添加 3 个函数,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var merge = require('utils-merge');
var pathFn = require('path');
var config = hexo.config.search = merge({
path: 'search.xml',
field: 'post'
}, hexo.config.search);
// Set default search path
if (!config.path){
config.path = 'search.xml';
}
// Add extension name if don't have
if (!pathFn.extname(config.path)){
config.path += '.xml';
}
hexo.extend.generator.register('search', require('./lib/generator'));
stripe_code = function(str) { // 去除代码行号,根据自己的主题修改
return str.replace(/<span class="line">[0-9]*<\/span>/ig, '');
}
<!-- 或者将代码全部去除
stripe_code = function(str) { // 去除代码
return str.replace(/<figure class="highlight.*?<\/figure>/ig, '');
}
-->
stripe = function (str) { // 去除html标签
return str.replace(/(<([^>]+)>)/ig, '');
}
minify = function (str) { // 压缩成一行
return str.trim().replace(/\n/g, ' ').replace(/\s+/g, ' ');
}
  • 阉割模板search.ejs

然后修改模板文件search.ejs,主要目的是调用上面添加的 3 个函数对实际内容进行精简,这里只保留链接、标题、内容。精简成下面这个样子就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<search>
<% var url = config.url + config.root %>
<% if(posts){ %>
<% posts.each(function(post){ %>
<entry>
<title><%-: post.title | cdata %></title>
<url><%- encodeURI(post.permalink) %></url>
<content type="html"><%-: minify(stripe(stripe_code(post.content))) | cdata %></content>
</entry>
<% }) %>
<% } %>
<% if(pages){ %>
<% pages.each(function(page){ %>
<entry>
<title><%-: page.title | cdata %></title>
<url><%- encodeURI(page.permalink) %></url>
<content type="html"><%-: minify(stripe(stripe_code(page.content))) | cdata %></content>
</entry>
<% }) %>
<% } %>
</search>

精简后,生成的search.xml文件体积可缩小为原来的 1/3,能有效加快搜索速度。

hexo-search 插件修改

安装插件

本地站内搜索都是基于索引文件的,Hexo 中可通过hexo-search插件生成 json 格式的索引文件。

1
npm install hexo-search --save

然后在Hexo站点根目录下的_config.yml中添加如下配置即可:

1
2
3
4
search:
path: search.json
source: all # other values: posts, pages
trim_html: false

修改插件

  • 改造index.js

默认生成的search.json文件很大,原生插件生成的内容太多了,还会包含代码行数、html 标签,包含很多冗余信息,所以有必要阉割 + 改造,参考网上部分文章,采用以下代码对其进行精简。

首先修改node_modules/hexo-search/index.js文件,在其中添加 3 个函数,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
'use strict';
var merge = require('utils-merge');
var pathFn = require('path');
var config = hexo.config.search = merge({
path: 'search.json',
source: 'all',
trim_html: false
}, hexo.config.search);
// Set default search path
if (!config.path) {
config.path = 'search.json';
}
// Add extension name if don't have
if (!pathFn.extname(config.path)) {
config.path += '.json';
}
hexo.extend.generator.register('search', require('./lib/generator'));
// 以下为增加的内容
stripe_code = function(str) { // 去除代码行号,根据自己的主题修改
return str.replace(/<span class="line">[0-9]*<\/span>/ig, '');
}
<!-- 或者将代码全部去除,上面这条代码跟此条代码任选其一
stripe_code = function(str) { // 去除代码
return str.replace(/<figure class="highlight.*?<\/figure>/ig, '');
}
-->
stripe = function (str) { // 去除html标签
return str.replace(/(<([^>]+)>)/ig, '');
}
minify = function (str) { // 压缩成一行
return str.trim().replace(/\n/g, ' ').replace(/\s+/g, ' ');
}
  • 修改库node_modules/hexo-search/lib/generator.js

然后修改库文件generator.js,主要目的是调用上面添加的 3 个函数对实际内容进行精简,这里只保留链接、标题、内容。精简成下面这个样子就好了。搜索sources.forEach(function(post)将其替换为如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//原代码
sources.forEach(function(post) {
var item = {
title: post.title,
url: config.url + '/' + post.path,
content: post.content
};
data.push(item);
});
//修改后代码
sources.forEach(function(post) {
var item = {
title: post.title,
url: config.url + '/' + post.path,
content: minify(stripe(stripe_code(post.content)))
};
data.push(item);
});

精简后,生成的search.json文件体积可缩小为原来的 1/5,能有效加快搜索速度。

支持一下
扫一扫,支持 Lany