构建基于 Obsidian + Hexo + Github 的零干扰写作环境
我喜欢写东西,我也喜欢捣鼓程序和代码,但我不喜欢在编程环境下写东西,也不喜欢在非编程环境下操作代码。
但是搭建博客本身就需要使用nodejs,避不开的就是“编程环境”。花了两天时间捣鼓后,我琢磨出来能将一个终端环境与写作环境彻底分离的博客搭建方案,能给 “强迫症站长” 提供一种几乎零干扰的博客写作体验——一键生成,将注意力只专注于写作上。
具体来说,本实践实现了三大核心目标:
在Obsidian中完成写作-配置-发布全流程,不需要额外呼出终端
自动化处理 元数据生成/图床上传/部署发布
在满足前两点的基础上,保持Hexo原生功能完整性
参考指南:
如何让图片安详地躺在床上 - Hexo
Hexo + Obsidian + Git 完美的博客部署与编辑方案 - 个人文章 - SegmentFault 思否
使用Hexo+Github+Obsidian搭建博客并实现多端同步 - Shiki
Hexo 部署
需要预先准备好Node js
和 Git
对于这两个东西的安装,可以参考Hexo官网的步骤:
安装 Hexo 并本地启动测试
导航至准备部署博客的文件夹内,打开Powershell或其他命令行终端,输入:
1 | npm install -g hexo-cli # 全局安装 |
开始创建一个项目
1 | hexo init blog # init后面的内容就是博客文件夹的名字,我这里以“blog”为例 |
生成网页文件后本地启动
1 | hexo g # generate 生成界面 |
浏览器访问命令行中提示的网站http://localhost:4000/可以看到在本机的4000端口Hexo已经生成了一个示例网站了。
测试完毕后记得在命令行 Ctrl + C
关闭本地启动
配置Github一键部署
目前,Hexo已有 hexo-deployer-git
这个现成轮子供我们一键部署。先在Blog文件夹内执行以下代码安装好它:
1 | npm install hexo-deployer-git --save |
hexo-deployer-git能够执行三个步骤:
生成静态文件:自动执行
hexo generate
命令,将你的Markdown文章转换为静态HTML文件部署到远程:将生成的静态文件推送到你配置的Git远程仓库
初始化Github Actions:生成静态文件同时生成Github Actions脚本,实现此后哦每次推送自动构建和部署。
配置部署信息
安装完成后,还需要在博客根目录的 _config.yml
文件中添加部署配置,才能开始享受一键部署:
1 | deploy: |
完成配置后,可使用以下命令进行部署:
1 | hexo clean && hexo deploy |
或者简写为:
1 | hexo d -g |
Obsidian配置
插件安装
需要安装Image auto upload Plugin
Linter
Shell commands
三个插件,如果不希望在Obsidian当中看到任何与写作无关的文件夹(node_modules
public
等),再安装一个Hide Folders
Shell commands
用于在Obsidian环境中一键执行hexo部署指令
只需在Shell Commands
的设置里添加hexo clean && hexo deploy
即可:
需要使用时,可以直接在Obsidian用Ctrl + P
呼出快捷键执行该指令
Linter
最重要的一个插件,用于新建md文件时一键生成可以被Hexo解析的YAML头
Hexo博客的md文件都有YAML文件头以方便解析,在Obsidian当中以笔记属性
显示
通常,在文件夹当中启动终端,然后输入hexo new post "此处输入博客主题"
,生成的md文件就会附带对应的YAML头,这一步操作需要呼出后台。明显不符合本文的目标。如果每一次都手动输入的话未免显得麻烦。
此外,不同的Hexo主题可能YAML头不同,new post
命令创建的文件一般只有date
tag
title
三个属性,而butterfly主题可选的属性多达20左右。
因此,有必要准备此插件以加速博客源页面的创建流程。
首先,打开保存时格式化文件
选项
这里以默认的Hexo主题为例,默认Hexo主题有三个属性内容:date
title
tags
,其中date
遵循 YYYY-MM-DD hh:mm:ss
的格式
打开Linter的设置,找到插入YAML属性
,打开指定 YAML 键插入到 YAML Front-matter 中
,并在要插入的键
中输入
1 | date: |
tags
只能自行手动输入,不过date
和title
的内容可以自动生成date
的生成,如图设置即可title
的自动输入可以通过启用YAML标题
来实现:
这样一来,只需Ctrl + S
,插件便会自动生成三个信息,免去手动输入的麻烦。
Hide Folders
这个插件主要用于在Obsidian当中隐藏某些无用文件夹,满足强迫症的需要
设置很简单,不想要哪个直接输入名字即可,另外支持模糊查找
整理一下,我就可以在Obsidian当中继续用PARA 方法来组织草稿了
注意:source不要隐藏,所有需要发布的博客,源文件都得拖到这里来
Image auto upload Plugin
这个插件和图床设置有关,放到下一章一起讲
配置一键图床上传+黏贴链接
我使用的是 PicList + 腾讯云COS对象存储 + ObsidianImage Auto Upload Plugin
插件,其中PicList + COS用于将文件快速上传至图床,Image Auto Upload Plugin
则负责将“上传图片——返回超链——黏贴至md”这个流程化简为Ctrl + V
一键完成。
图床方面腾讯云阿里云都行,建议购买大厂的并且顺带买一个CDN,或者使用cloudflare的服务也行,如果你有境外信用卡的话。
PicList + 腾讯云COS对象存储的部署请参考PicList的官方文档。
如何在Obsidian中使用
在社区插件中搜索安装 Image auto upload
,然后进入插件设置页面,修改默认上传器为 PicGo(app)
,设置 PicGo server
为 http://127.0.0.1:36677/upload
即可,如下图所示, 此外该插件还额外支持通过PicList进行云端删除,请在删除接口内填入 http://127.0.0.1:36677/delete
:
之后就可以开始享受一键CV贴图的快感了。
安全
域名与CDN加速
这方面已经有博客写的很完善了,使用国内的CDN加速需要实名备案,我先用的Cloudflare,目前还在琢磨图床的CDN当中。
使用cloudflare免费加速github page | MonkeyWie’s Blog
防图床盗刷
移动端同步
因为我自己一直在用坚果云,于是就选择了Remotely Save
插件,参考这篇文章进行配置
Obsidian通过Remotely save插件实现坚果云webdav同步 - 经验分享 - Obsidian 中文论坛
同样推荐使用这个方案来配置多端同步,方便随时记录想法,再转化为实际产出。
常见问题
hexo deploy操作后自定义域名失效
解决 Hexo 部署到 GitHub Pages 自定义域名失效 | Lucky
在source
文件夹内添加CNAME,导向自己的域名,然后在 Shell command 当中将 hexo clean && hexo deploy
修改为 hexo clean && hexo generate && hexo deploy
如果你使用hexo-generator-cname
,切记要在_comfig.yml
当中设置自定义域名,否则每次都只会生成example.com
一键插入代码块、标注\取消代码
这个 Obsidian 有原生快捷键支持,只需要在写作时养成习惯
即可,Ctrl + P
搜索 “代码” 就可以找到,按照自己的需求设置快捷键即可,另外,其实框选后按下`键,就可以直接将框选的文字变成代码
了
1 | 我选择了 Ctrl + R 和 Ctrl + Shift + R |