Hexo-Solitude(Acrylic)博客配置教程

在嘈杂的互联网中寻求属于自己的一方净土,并非遥不可及…

也许你才刚刚踏上旅程、也许你已经踩过坑坑洼洼,但是…让我们继续出发~

注:Acrylic目前已经停止维护,项目文件已经不兼容许多库,建议使用Solitude

配置

  • Windows 11
  • 2024年7月
  • 已经提前安装并配置好git(这部分建议搜索相关git教程)

技术路线

node.js + hexo + github + solitude

主要流程

  1. 安装node.js
  2. 安装hexo

1 安装node.js

1.1 打开node.js官网,在上方选项栏选择“下载”栏目

1

1.2 选择自己需要的版本下载

我的建议是不要选择太新的node.js,与hexo很可能不匹配,这里我选择v14.21.3(也不一定)

不太会用命令行的同学可以点“预构建安装程序”傻瓜式下载(会用命令行的同学也推荐傻瓜式下载)

2

1.3 打开下载好的安装程序,一键安装

3

1.4 测试node.js安装情况

打开命令行(win+R 输cmd),输入:

1
2
node -v
npm -v

出现如下提示即为安装成功:

4

2 安装hexo

2.1 通过镜像站安装hexo

吐槽一句,很多这里博客会推荐大家下载cnpm,然后用cnpm下载hexo,但实际上cnpm的下载过程中往往伴随着各种出错(楽)

打开命令行(win+R 输cmd),输入:

1
npm install -g hexo-cli -registry=https://registry.npmmirror.com

稍微解释一下,-g指定了安装包的名称,-registry=指定了远程仓库的位置(默认是海外的服务器,科学上网可以不加这个)

registry.npmmirror.com是淘宝的npm镜像站,原名称是registry.npm.taobao.org,现在使用老网址会提示证书过期

如果出现以下提示即可能为安装成功:

5

2.2 验证hexo安装

打开命令行(win+R 输cmd),输入:

1
hexo -v

出现以下提示即为安装成功:

6

2.3 初始化hexo

在你喜欢的地方(建议全英文路径),创建一个名为blog的文件夹,它以后就是我们的博客的主文件夹了

在blog文件夹中打开命令行(推荐blog文件夹地址栏输cmd,回车),输入:

1
hexo init

如果没有科学上网,很可能出现在以下地方卡住的情况:
7

让我们来hexo的源码中来找找原因:

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
import BlueBirdPromise from 'bluebird';
import { join, resolve } from 'path';
import { magenta } from 'picocolors';
import { existsSync, readdirSync, rmdir, unlink, copyDir, readdir, stat } from 'hexo-fs';
import tildify from 'tildify';
import spawn from 'hexo-util/dist/spawn'; // for rewire
import { sync as commandExistsSync } from 'command-exists';
import type Context from '../context';

const ASSET_DIR = join(__dirname, '../../assets');
const GIT_REPO_URL = 'https://github.com/hexojs/hexo-starter.git';

interface InitArgs {
_: string[];
install?: boolean;
clone?: boolean;
}

async function initConsole(this: Context, args: InitArgs) {
args = Object.assign({ install: true, clone: true }, args);

const baseDir = this.base_dir;
const target = args._[0] ? resolve(baseDir, args._[0]) : baseDir;
const { log } = this;

if (existsSync(target) && readdirSync(target).length !== 0) {
log.fatal(`${magenta(tildify(target))} not empty, please run \`hexo init\` on an empty folder and then copy your files into it`);
await BlueBirdPromise.reject(new Error('target not empty'));
}

log.info('Cloning hexo-starter', GIT_REPO_URL);

if (args.clone) {
try {
await spawn('git', ['clone', '--recurse-submodules', '--depth=1', '--quiet', GIT_REPO_URL, target], {
stdio: 'inherit'
});
} catch (err) {
log.warn('git clone failed. Copying data instead');
await copyAsset(target);
}
} else {
await copyAsset(target);
}

await BlueBirdPromise.all([
removeGitDir(target),
removeGitModules(target)
]);
if (!args.install) return;

log.info('Install dependencies');

let npmCommand = 'npm';
if (commandExistsSync('pnpm')) {
npmCommand = 'pnpm';
} else if (commandExistsSync('yarn')) {
npmCommand = 'yarn';
}

try {
if (npmCommand === 'yarn') {
const yarnVer = await spawn(npmCommand, ['--version'], {
cwd: target
});
if (typeof yarnVer === 'string' && yarnVer.startsWith('1')) {
await spawn(npmCommand, ['install', '--production', '--ignore-optional', '--silent'], {
cwd: target,
stdio: 'inherit'
});
} else {
npmCommand = 'npm';
}
} else if (npmCommand === 'pnpm') {
await spawn(npmCommand, ['install', '--prod', '--no-optional', '--silent'], {
cwd: target,
stdio: 'inherit'
});
}

if (npmCommand === 'npm') {
await spawn(npmCommand, ['install', '--only=production', '--optional=false', '--silent'], {
cwd: target,
stdio: 'inherit'
});
}
log.info('Start blogging with Hexo!');
} catch (err) {
log.warn(`Failed to install dependencies. Please run 'npm install' in "${target}" folder.`);
}
}

async function copyAsset(target: string) {
await copyDir(ASSET_DIR, target, { ignoreHidden: false });
}

function removeGitDir(target: string) {
const gitDir = join(target, '.git');

return stat(gitDir).catch(err => {
if (err && err.code === 'ENOENT') return;
throw err;
}).then(stats => {
if (stats) {
return stats.isDirectory() ? rmdir(gitDir) : unlink(gitDir);
}
}).then(() => readdir(target)).map(path => join(target, path)).filter(path => stat(path).then(stats => stats.isDirectory())).each(removeGitDir);
}

async function removeGitModules(target: string) {
try {
await unlink(join(target, '.gitmodules'));
} catch (err) {
if (err && err.code === 'ENOENT') return;
throw err;
}
}

export = initConsole;

虽然洋洋洒洒一百来行,但翻译下来只有两行对我们来说是有用的

1
2
git clone --recurse-submodules --depth=1 --quiet https://github.com/hexojs/hexo-starter.git .
npm install --only=prodection --optional=false --silent

可以发现,正是npm install --only=prodection --optional=false --silent导致了卡死

8

还记得我们安装hexo的操作嘛?没错~
加入--registry=https://registry.npmmirror.com
在blog文件夹里打开cmd,输入:

1
2
git clone --recurse-submodules --depth=1 --quiet https://github.com/hexojs/hexo-starter.git .
npm install --only=prodection --optional=false --registry=https://registry.npmmirror.com

观察到:

9

无视warning,安装成功!(如果加入了–silent,则观察不到这么多额外输出)

2.4 启动hexo(搭建第一个本地网站)

在blog文件夹打开cmd,输入:

1
hexo server

这个命令会启动hexo服务器,观察到以下输出即为启动成功:

10

打开任意浏览器,输入http://localhost:4000/,成功Hello World~

11

3 Solitude下载安装运行

这部分请参考官方文档~

4 魔改

会把自己研究的小玩意儿以及遇到的bug放在这里,施工中ing

4.1 hexo g后不自动产生/archives页面

archives生成需要hexo-generator-archive

解决方案:

1
npm install hexo-generator-archive --save