作者:开课吧李伟
项目定位
前段时间,有朋友跟我说:你在思否写的博客已经半个月打不开了。
这个问题我是知道的,以前也遇到过,只是这次持续的时间太长,估计至少得20天了,这个不能忍。
对于这个问题的解决方式,我首先想到的是将文章迁移到掘金。只是想想掘金里那乱七八糟的广告,就打消了这个念头。而且,它万一也跟思否一样呢?那我又得重蹈覆辙。
所以,我决定自建博客。
对于自建博客,我首先想到的场景是:我在本地创建了md文件,然后一键上传,便可以发布到线上,然后我就可以通过相应网址看见相应的博客。
项目开发要求:简单、快速、省钱。
项目功能:我自己能用就好,发布到线上,能看见,先不考虑评论功能。
开发工具:
nodejs:对本地文件进行增删改查和上传。
阿里云的oss:存储本地上传的博客和图片,供前端读取。oss很便宜,我用了很久,一直没怎么花钱。
Typora:md文件编辑器,在这里面,可以为图片指定一个相对的存放目录。
接下咱们就说一下整体的实现思路。
整体思路
博客书写规则
我会将所有博客写在一个固定的目录中。一个主题的博客会有一个独立的文件夹,
这个文件夹里可能会有多个与此主题相关的md,同时还会有一个images文件夹,用于存放md里的所有静态资源。如:
项目结构
build.js:编译、打包、上传本地博客
mds.json:存储md文件目录信息
st.json:存储静态文件目录信息
conf.json:项目配置文件
main:所有博客都有写在这里面
web:前端文件,也可以与项目分离
dist:本地博客打包目录
项目实现逻辑
先建立两个目录信息文件mds.json和st.json,默认为空数组,用于在后面存储文件信息;
在main中,用Typora编辑器,按照一个文件夹一个主题的规则写博客,其中的图片链接可以自动指向同级的images文件夹;
在build.js中写node。
先获取main中的文件目录,与mds.json和st.json中的文件作对比,从而知道哪些文件是新的,哪些文件是已删除的。
对新的文件要重新编译、打包和上传;对已删除的文件,要从本地的打包目录和oss端删除。
最后,根据文件类型,将main中的文件目录更新到mds.json和st.json中。
node端的具体实现
实现项目功能的主要文件是build.js,所以我们终点讲解build.js里的各种功能逻辑。
基础数据的定义
fsnode内置文件系统
tool方法工具
getFiles()获取目录中的所有文件信息,并根据文件类型,将其分为静态文件和md文件。其字段属性为:
path文件路径;
folder文件所在的文件夹;
name文件名;
type文件类型;
ossName文件在oss中的线上名称;
mtime修改时间;
ctime创建时间,初始为修改时间。
getRandom()基于时间戳和随机数,获取一个基本不会重复的数值。
conf配置文件
enter博客入口
out博客出口,解析后的线上版md文件会发布到这里后,再上传到oss
menu博客目录:
st静态资源目录;
mdsmd文件目录;
ossPathStoss中存放静态资源的bucket路径
ossPathMdsoss中存放md文件的bucket路径
bucketSt存放静态资源的bucket配置参数,用于OSS用户端实例化
bucketMds存放md文件的bucket配置参数,用于OSS用户端实例化
OSS阿里云的oss服务端接口对象
mdsOld上一次build生成的md文件目录
stOld上一次build生成的静态资源目录
menuOld整合上一次上一次build生成的目录
menuNow当前博客入口中的文件目录
clients基于bucket配置项,将存放两种资源的bucket实例化
更新博客入口中的文件
setFiles()先将图片文件上传到oss,返回静态资源目录信息
setFiles()再将md文件写入本地dist目录,在上传到oss,返回ms文件目录信息
writeMenu()将静态目录信息和md目录信息分别写入相应本地json文件中,并上传到oss
setFiles()对博客入口中的文件进行增加、修改、提交、删除操作
getFilesState()对新旧两种目录进行对比,返回目录状态信息,如所有已删除的文件、新增的文件、修改过的文件
若新旧目录一样,则返回null;否则:
updateFiles()将新増和修改过的文件写入本地(仅限md文件),并上传到oss
deleteFiles()将已删除的文件从本地出口(只针对md文件)中删除,从oss中删除
返回最新的目录
writeMenu()将最新文件写入本地目录,上传oss。
updateFiles()遍历文件目录,将新増和修改过的文件写入本地(仅限md文件),并上传到oss
如果是md文件:
readFileSync()基于文件路径读取相应的md文件内容;
getUrls()从md中获取所有图片文件的链接地址,并通过此链接获取此文件的oss端名称;