Hexo-Solitude(Acrylic)博客配置教程
在嘈杂的互联网中寻求属于自己的一方净土,并非遥不可及…
也许你才刚刚踏上旅程、也许你已经踩过坑坑洼洼,但是…让我们继续出发~
注:Acrylic目前已经停止维护,项目文件已经不兼容许多库,建议使用Solitude
配置
Windows 11
2024年7月
已经提前安装并配置好git(这部分建议搜索相关git教程)
技术路线
node.js + hexo + github + solitude
主要流程
安装node.js
安装hexo
1 安装node.js
1.1 打开node.js官网 ,在上方选项栏选择“下载”栏目
1.2 选择自己需要的版本下载
我的建议是不要选择太新的node.js,与hexo很可能不匹配,这里我选择v14.21.3 (也不一定)
不太会用命令行的同学可以点“预构建安装程序”傻瓜式下载(会用命令行的同学也推荐傻瓜式下载)
1.3 打开下载好的安装程序,一键安装
1.4 测试node.js安装情况
打开命令行(win+R 输cmd),输入:
出现如下提示即为安装成功:
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
,现在使用老网址会提示证书过期
如果出现以下提示即可能为安装成功:
2.2 验证hexo安装
打开命令行(win+R 输cmd),输入:
出现以下提示即为安装成功:
2.3 初始化hexo
在你喜欢的地方(建议全英文路径),创建一个名为blog
的文件夹,它以后就是我们的博客的主文件夹了
在blog文件夹中打开命令行(推荐blog文件夹地址栏输cmd,回车),输入:
如果没有科学上网,很可能出现在以下地方卡住的情况:
让我们来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' ; 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
导致了卡死
还记得我们安装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
观察到:
无视warning,安装成功!(如果加入了–silent,则观察不到这么多额外输出)
2.4 启动hexo(搭建第一个本地网站)
在blog文件夹打开cmd,输入:
这个命令会启动hexo服务器,观察到以下输出即为启动成功:
打开任意浏览器,输入http://localhost:4000/
,成功Hello World~
3 Solitude下载安装运行
这部分请参考官方文档 ~
4 魔改
会把自己研究的小玩意儿以及遇到的bug放在这里,施工中ing
4.1 hexo g后不自动产生/archives页面
archives生成需要hexo-generator-archive
解决方案:
1 npm install hexo-generator-archive --save