搭建技术博客

核心提示作者:开课吧李伟项 目 定 位前段时间,有朋友跟我说:你在思否写的博客已经半个月打不开了。这个问题我是知道的,以前也遇到过,只是这次持续的时间太长,估计至少得20天了,这个不能忍。对于这个问题的解决方式,我首先想到的是将文章迁移到掘金。只是

作者:李伟我们开始上课吧

项目位置

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

我知道这个问题,以前也遇到过,但是这次持续时间太长了,估计至少要20天,实在是舍不得。

要解决这个问题,我首先想到的是把文章迁移到掘金。只是想到掘金里面乱七八糟的广告就打消了这个念头。更何况,如果只是想不呢?那我还得再做一次。

所以,我决定建立自己的博客。

对于自建博客,我想到的第一个场景是:我在本地创建md文件,然后一键上传,然后就可以发布到网上,然后就可以通过相应的网站看到相应的博客。

项目要求:简单、快捷、性价比高。

项目功能:可以自己用,发布到网上看,不考虑评论功能。

开发工具:

Nodejs:添加、删除、检查和上传本地文件。

阿里云的Oss:存储本地上传的博客和图片,供前端阅读。Oss很便宜。我用了很久,也没花多少钱。

Typora: MD文件编辑器,您可以在其中指定图片的相对存储目录。

接下来说一下整体实现思路。

政体四路

博客写作规则

我会把所有的博客都写在一个固定的目录里。有主题的博客会有一个单独的文件夹,

该文件夹中可能有多个与该主题相关的md,并且还会有一个images文件夹来存储md中的所有静态资源。比如:

项目结构

Build.js:编译、打包和上传本地博客

Mds.json:存储md文件目录信息。

St.json:存储静态文件的目录信息。

Conf.json:项目配置文件

主:所有博客都写在里面。

Web:前端文件,也可以和项目分开。

Dist:本地博客包目录

项目实现逻辑

首先建立两个目录信息文件mds.json和st.json,默认为空 array,用于存储后面的文件信息;

在main中,使用Typora editor按照一个文件夹一个主题的规则进行博客,其中图片链接可以自动指向同级的图片文件夹;

在build.js中写入节点

先获取main中的文件目录,与mds.json和st.json中的文件进行对比,就可以知道哪些文件是新的,哪些文件被删除了。

新文件要重新编译打包上传;删除的文件应该从本地打包目录和oss端删除。

最后,根据文件类型,将main中的文件目录更新为mds.json和st.json

节点的具体实现

实现项目功能的主要文件是build.js,所以我们会在最后解释build.js中的各种功能逻辑。

基础数据的定义

fs内置文件系统

方法工具

GetFiles获取目录中的所有文件信息,根据文件类型分为静态文件和md文件。其字段属性为:

Path文件路径;

文件所在的文件夹;

名称文件名;

类型文件类型;

oss中ossName文件的在线名称;

Mtime修改时间;

Ctime创建时间,初始修改时间。

GetRandom根据时间戳和随机数得到一个基本不重复的数值。

配置文件

输入博客条目

解析后的在线md文件将在这里发布,然后上传到oss。

菜单博客目录:

St静态资源目录;

Mds md文件目录;

在ossPathSt oss中存储静态资源的存储桶路径

ossPathMds oss中存储md文件的存储桶路径

BucketSt存储静态资源的桶配置参数,这些参数用于实例化OSS客户端。

BucketMds存储md文件的桶配置参数,用于实例化OSS客户端。

阿里云OSS服务器接口对象

mdsOld的最后一次构建生成的Md文件目录

stOld上次构建时生成的静态资源目录

MenuOld集成了上一次构建生成的目录。

menuNow当前博客门户中的文件目录

客户机基于存储桶配置项实例化保存两种资源的存储桶。

更新博客门户中的文件

SetFiles首先上传图片文件到oss,返回静态资源目录信息。

然后SetFiles将md文件写入本地dist目录,上传到oss,返回ms文件的目录信息。

WriteMenu将静态目录信息和md目录信息写入对应的本地json文件,上传到oss。

SetFiles在博客门户中添加、修改、提交和删除文件。

GetFilesState比较新旧目录,并返回目录状态信息,如所有删除的文件、新文件和修改的文件。

如果新旧目录相同,则返回null;否则:

UpdateFiles在本地写入新的和修改过的文件,并将它们上传到oss。

DeleteFiles从本地出口和oss中删除已删除的文件。

返回到最新目录。

WriteMenu将最新文件写入本地目录并上传到oss。

UpdateFiles遍历文件目录,在本地写入新的和修改过的文件,并将它们上传到oss。

对于md文件:

ReadFileSync根据文件路径读取对应的md文件内容;

GetUrls从md获取所有图片文件的链接地址,通过该链接获取该文件的oss端名;

CompileMd解析Md文件,用oss地址替换这个文件的本地地址;

WriteFile将此文件发布到导出目录。

如果是图片文件:

只获取文件的本地地址用于后续操作。

使用oss实例对象将文件上传到oss。

DeleteFiles遍历文件目录,并从本地出口和操作系统中删除已删除的文件。

如果是md文件,从本地出口删除已删除的文件;

从oss中删除文件。

获取文件状态。

Df:要删除的文件在旧文件里,不在新文件里;

Cf:要添加的文件不在老文件里,在新文件里;

用友:要更新的文件在新旧文件里都有,但是已经改了;

Nf:修改过的文件+新文件;

Of:未更改的文件;

菜单:最新目录。

WriteFile在本地写入文件。

CompileMd解析Md文件,用oss地址替换这个文件的本地地址。

GetUrls查找所有图片URL。

如从' ]'中提取'images/img.jpg',并排除底层目录没有'.'的链接和html链接。比如从']'中提取' images/img.jpg ',排除没有'.'的链接和html链接在底层目录中。

GetOssName根据文件的本地路径从相应的目录中获取相应的oss路径。

GetFile根据文件的本地路径从对应的目录中获取文件,并从目录中删除文件。

前端的具体实现

主页的功能是从oss中读取文件目录文件,然后显示在页面上。

从oss获取存储目录的mds.json文件。

主页效果

标题点击后会跳转到详情页,链接中会拼接出标题串和这篇文章特有的logo。

在详情页,根据首页投放文章的唯一logo,从oss获取md文件,解析成HTML,放到页面上。

有很多针对md的解析工具,比如marked。

我们可以给md文件添加样式。我这里用的是github-markdown.css。

上面类中的“markdown-body”是对github-markdown.css样式的调用。不要把它落下。

好了,我写博客的基本需求在这里实现了。

 
友情链接
鄂ICP备19019357号-22