项目实战技术社区靠不住,不如自建博客

作者:开课吧李伟

项目定位

前段时间,有朋友跟我说:你在思否写的博客已经半个月打不开了。

这个问题我是知道的,以前也遇到过,只是这次持续的时间太长,估计至少得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端名称;




转载请注明:http://www.aierlanlan.com/cyrz/2640.html