安装Hexo

1
2
3
4
5
6
7
npm install hexo-cli -g

hexo init

npm install hexo-deployer-git --save

npm install hexo-renderer-pug hexo-renderer-stylus --save

安装Solitude

在Hexo根目录下执行

1
git clone -b dev https://github.com/everfu/hexo-theme-solitude.git themes/solitude

编辑 Hexo 项目的 _config.yml 文件,将 Hexo 主题修改为 solitude

1
theme: solitude

安装主题依赖

1
npm i hexo-renderer-pug

将主题配置复制到博客根目录

1
copy .\themes\solitude\_config.yml .\_config.solitude.yml

安装插件

字数统计

1
npm i hexo-wordcount

数学公式

卸载 hexo-render-marked

1
npm un hexo-renderer-marked

安装 hexo-renderer-markdown-it katex @renbaoshuo/markdown-it-katex

1
npm i hexo-renderer-markdown-it katex @renbaoshuo/markdown-it-katex

添加以下内容到 _config.yml

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
markdown:
preset: 'default'
render:
html: true
xhtmlOut: false
langPrefix: 'language-'
breaks: true
linkify: true
typographer: true
quotes: '“”‘’'
enable_rules:
disable_rules:
plugins:
- '@renbaoshuo/markdown-it-katex'
anchors:
level: 2
collisionSuffix: ''
permalink: false
permalinkClass: 'header-anchor'
permalinkSide: 'left'
permalinkSymbol: '¶'
case: 0
separator: '-'
images:
lazyload: false
prepend_root: false
post_asset: false
inline: false # https://markdown-it.github.io/markdown-it/#MarkdownIt.renderInline

开启配置项

1
2
3
4
5
6
7
8
9
10
11
12
13
# --------------------------- start ---------------------------
# Katex
# Latex formula support
# Latex 公式支持
katex:
enable: true
# Whether to load on each page
# 是否在每个页面加载
per_page: true
# Whether to enable copy formula
# 是否启用复制公式
copytex: false
# --------------------------- end ---------------------------

PWA

安装 hexo-swpp 和 swpp-backends 插件

在博客根目录执行

1
npm i hexo-swpp 
1
npm i swpp-backends

配置 PWA

开启主题 pwa 配置并在 Hexo 配置中启用 swpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 大约在773行
# --------------------------- start ---------------------------
# PWA
# Progressive Web App
pwa:
enable: true
manifest: /manifest.json # manifest.json
theme_color: "#006a73" # Theme color
mask_icon: /img/pwa/favicon.png # Mask icon
apple_touch_icon: /img/pwa/favicon.png # Apple touch icon
bookmark_icon: /img/pwa/favicon.png # Bookmark icon
favicon_32_32: /img/pwa/favicon_32.png # 32x32 icon
favicon_16_16: /img/pwa/favicon_16.png # 16x16 icon
# --------------------------- end ---------------------------

在 Hexo 最下面添加 swpp 配置

1
2
3
4
5
swpp:
# 是否启用插件
enable: false
# 是否在发布前自动执行脚本
# auto_exec: true

在 source 目录中创建 manifest.json 文件

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
41
42
43
44
45
46
47
48
49
{
"name": "网站名称",
"short_name": "网站名称缩写",
"theme_color": "#006a73",
"background_color": "#006a73",
"display": "fullscreen",
"scope": "/",
"start_url": "/",
"id": "/",
"icons": [
{
"src": "/img/pwa/favicon_16.png",
"sizes": "16x16",
"type": "image/png",
"purpose": "any"
},
{
"src": "/img/pwa/favicon_16.png",
"sizes": "16x16",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/img/pwa/favicon_32.png",
"sizes": "32x32",
"type": "image/png",
"purpose": "any"
},
{
"src": "/img/pwa/favicon_32.png",
"sizes": "32x32",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/img/pwa/favicon.png",
"sizes": "180x180",
"type": "image/png",
"purpose": "any"
},
{
"src": "/img/pwa/favicon.png",
"sizes": "180x180",
"type": "image/png",
"purpose": "maskable"
}
],
"splash_pages": null
}

在博客根目录创建一个 sw-rules.js 文件

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
module.exports.config = {
/** @type {?ServiceWorkerConfig|boolean} */
serviceWorker: {
escape: 1,
cacheName: 'SolitudeCache',
debug: false,
},
register: {
onsuccess: undefined,
onerror: () =>
console.error(
'Service Worker 注册失败!可能是由于您的浏览器不支持该功能!'
),
builder: (root, framework, pluginConfig) => {
const { onerror, onsuccess } = pluginConfig.register;
return `
<script>
(() => {
const sw = navigator.serviceWorker;
const error = ${onerror && onerror.toString()};
if (!sw?.register('${new URL(root).pathname}sw.js')
${onsuccess ? `?.then(${onsuccess.toString()})` : ""}
?.catch(error)
) error()
})()
</script>`;
},
},
/** @type {?DomConfig|boolean} */
dom: {
/** @type {?VoidFunction} */
onsuccess: () => {
caches
.match('https://id.v3/')
.then((res) => {
if (res)
res.json().then((json) => {
utils &&
utils.snackbarShow(
`已刷新缓存,更新为${json.escape + '.' + json.global + '.' + json.local
}版本最新内容`,
false,
2500
);
});
else console.info('未找到缓存');
})
.catch((error) => console.error('缓存匹配出错', error));
},
},
/** @type {?VersionJsonConfig|boolean} */
json: {
/** @type {number} */
maxHtml: 15,
/** @type {number} */
charLimit: 1024,
/** @type {string[]} */
merge: [],
exclude: {
/** @type {RegExp[]} */
localhost: [],
/** @type {RegExp[]} */
other: [],
},
},
/** @type {?ExternalMonitorConfig|boolean} */
external: {
/** @type {number} */
timeout: 5000,
/** 拉取文件时地并发限制 */
concurrencyLimit: 100,
/** @type {({head: string, tail: string}|function(string):string[])[]} */
js: [],
/** @type {RegExp[]} */
stable: [
/^https:\/\/npm\.elemecdn\.com\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/,
/^https:\/\/cdn\.cbd\.int\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/,
/^https:\/\/cdn\.jsdelivr\.net\/npm\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/,
],
replacer: (srcUrl) => {
if (srcUrl.startsWith('https://cdn.jsdelivr.net/npm/')) {
const pathname = new URL(srcUrl).pathname;
return [
srcUrl,
`https://cdn.cbd.int/${pathname}`,
`https://npm.elemecdn.com/${pathname}`,
`https://fastly.jsdelivr.net/npm/${pathname}`,
];
} else {
return srcUrl;
}
},
},
};

module.exports.cacheRules = {
simple: {
clean: true,
search: false,
match: (url, $eject) =>
url.host === $eject.domain && ['/404.html'].includes(url.pathname),
},
cdn: {
clean: true,
match: (url) =>
[
'cdn.cbd.int',
'lf26-cdn-tos.bytecdntp.com',
'lf6-cdn-tos.bytecdntp.com',
'lf3-cdn-tos.bytecdntp.com',
'lf9-cdn-tos.bytecdntp.com',
'cdn.staticfile.org',
'npm.elemecdn.com',
].includes(url.host) &&
url.pathname.match(/\.(js|css|woff2|woff|ttf|cur)$/),
},
};

module.exports.getSpareUrls = (srcUrl) => {
if (srcUrl.startsWith('https://npm.elemecdn.com')) {
return {
timeout: 3000,
list: [
srcUrl,
`https://fastly.jsdelivr.net/${new URL(srcUrl).pathname}`,
],
};
}
};

module.exports.ejectValues = (hexo, rules) => {
return {
domain: {
prefix: 'const',
value: new URL(hexo.config.url).host,
},
};
};

module.exports.skipRequest = (request) => request.url.startsWith("https://i0.hdslb.com") ||
request.url.startsWith('https://meting.qjqq.cn') ||
request.url.startsWith('https://api.i-meto.com');

主题标签

安装插件

1
npm i hexo-solitude-tag

追番页面

安装插件

1
npm i hexo-bilibili-bangumi

在 Hexo 配置文件底部加入以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 追番插件
# https://github.com/HCLonely/hexo-bilibili-bangumi
bangumi: # 追番设置
enable: true
source: bili
path:
vmid: 527260354
title: "追番列表"
quote: "生命不息,追番不止!"
show: 1
lazyload: false
loading:
showMyComment: false
pagination: false
extra_options:
top_img: false
lazyload:
enable: false

本地搜索

安装插件,并修改主题和 Hexo 配置

1
npm i hexo-generator-search

主题配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 大约在856和869行
search:
enable: true
type: local # local / algolia / docsearch
tags:
# - Solitude
# - Hexo

···

# Local search
local:
preload: false
CDN: # url: search.xml

Hexo配置

在最底下加入如下配置,具体如何填写参考插件仓库 README

1
2
3
4
5
search:
path: search.xml
field: post
content: true
template:

Algolia搜索

安装插件,并修改主题和 Hexo 配置

1
npm install hexo-algoliasearch --save

主题配置

1
2
3
4
5
6
7
8
9
10
# 大约在856和864行
search:
enable: true
type: algolia # local / algolia / docsearch
tags:
# - Solitude
# - Hexo
algolia:
hits:
per_page: 6

Hexo配置

在最底下加入如下配置,具体如何填写参考插件仓库 README

记得配置 fields 参数的 titlepermalink 和 content

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
algolia:
appId: "Z7A3XW4R2I"
apiKey: "12db1ad54372045549ef465881c17e743"
adminApiKey: "40321c7c207e7f73b63a19aa24c4761b"
chunkSize: 5000
indexName: "my-hexo-blog"
fields:
- content:strip:truncate,0,500
- excerpt:strip
- gallery
- permalink
- photos
- slug
- tags
- title

配置文章链接转数字或字母

1
npm install hexo-abbrlink --save
1
2
3
4
5
6
_config.yml添加配置项:
文章链接转数字或字母:
abbrlink:
alg: crc32 #算法: crc16(default) and crc32
rep: hex #进制: dec(default) and hex: dec #输出进制:十进制和十六进制,默认为10进制。丨dec为十进制,hex为十六进制