有时候,使用markdown写完一份文档后,想要快速分享给别人看,但是又要考虑对方是不是没有安装markdown编辑器的小白,于是我之前会将markdown先转成html,然后将这个html文档丢到minio(一个文件托管和共享服务,相当于我的网盘)上,之后再将链接分享给别人。

如此一来有两个缺点,第一是每次写完文档需要复杂的操作步骤,非常麻烦;第二是当文档每次更新完后,都需要我再来一遍同样的操作,痛苦x2.

今天要介绍的方法,灵感来源于涛哥博客上的我的博客技术栈 (taoshu.in)这篇文章。在这篇文章中,涛哥说明了使用他的博客技术栈,可以在写完博客文章后无感知自动更新到网站上。虽说我之前也只需要用hexo命令部署一下,但是从1到0的操作简化其实感觉上远比从10到1更加直观便利。在文章中,提到了一种我很早就想找的一种同步工具——Syncthing,用他实现文件的无感同步。我又想到之前好像听过一种文档工具,可以直接把md文件自动渲染成html文档进行展示,而他就躺在我的收藏夹中。于是,两者组合就构成了一种文章无感上线的工具。

Syncthing

先参考官方文档:Welcome to Syncthing’s documentation! — Syncthing documentation

Syncthing是一个文件同步工具,当不同的设备同时运行着Syncthing时,他们可以匹配,共享目录。共享的目录中的文件如果在任何一台设备上有更新的版本,就会被立刻同步到共享了这个目录的其他设备上。

这个工具的最大优势就在于平台支持性非常好。Windows、Mac和Linux都可以通过官方文档中的说明安装和配置自动启动。而安卓和iOS则可以安装对应的APP(iOS目前虽然没有官方的APP上架,但是有一款第三方APP Mobius Sync可供使用)。

安装

直接下载官方的软件包,解压即可。官方应用中包括一个绑定的Web UI,可以帮助轻松配置共享。默认Web UI运行在本地8384端口,并且只允许127.0.0.1的访问。如果在Linux服务器上配置的话,可以用Nginx进行反代转发,就可以正常使用了。为了安全,可以设置一个密钥,但是务必注意,不要勾选“使用加密连接到图形管理界面”。

设备匹配

Syncthing使用设备ID来识别和匹配设备,如果要查看自己的设备ID,可以在Web UI的右上角设置中找到显示设备ID的选项。

之后,只要在一台机器上输入另一台的设备ID,Syncthing就会尝试建立P2P网络,其余的就交给Syncthing了。网络打通后,另一台设备就会受到匹配请求,同意即可。之后,文件夹就可以共享给已经添加好的设备了。

目录共享

Syncthing通过文件夹ID来确定不同设备上的文件夹是不是应该同步同一份数据。可以先在两台设备上都建好文件夹ID相同的两个目录,然后从一台设备共享给另一台,也可以直接将设备上已有的目录添加到共享目录中,然后共享给另一台设备,接受共享请求时设置对应的目录。

Docsify

先参考官方文档:快速开始 (docsify.js.org)

Docsify是一款md文档自动渲染生成html界面的工具。

安装

直接使用npm安装即可:npm i docsify-cli -g

初始化文档目录

docsify init ./docs,类似git init,会在目录下建立docsify的基础文件。

配置Nginx

在nginx配置中,添加一个服务器,设置location的root到该目录即可。示例:

server {
  listen 80;
  server_name  your.domain.com;

  location / {
    root /path/to/dir/of/docs/;
    index index.html;
  }
}

之后就可以直接使用了。

例如如果目录下面有一个abc.md的文件,可以直接通过your.domain.com/abc来访问到这个md对应渲染的界面了,不需要有任何额外的后台程序。

如果里面文档经常修改变更,可以在location /块下面加上expires -1,来关闭对这个网站使用disk cache。

定制化

可以在window.$docsify =配置一些属性。

  1. 配置loadSidebar: true, 设置自定侧边栏。然后可以编辑_sidebar.md,按照链接列表形式配置侧边栏目录,如- [软件架构](software-achitecture)
  2. subMaxLevel: 3 设置自定侧边栏的同时还可以显示当前文档目录。数字表示最多显示到几级标题
  3. 加入<script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>并且设置search: ‘auto’可以配置自动全文搜索功能。
  4. name: ‘claws文档’ 可以配置文档标题,显示在侧边栏的开头。
  5. 在目录中放上favicon.ico可以作为网站图标。