0%

博客的搭建

前言

首先我们都知道,JavaScript是一门语言,一门和Java完全没有关系的语言。JavaScript被广泛应用于前端。

Node.js则是一个JavaScript环境,能够让JavaScript不再依赖于浏览器,是一个V8的引擎,类比于Java中的JRE。

npm则是Node.js的一个包管理系统,用它可以下载各种各种的工具。Java中没有类似的包管理,但是有Maven。

hexo是一款博客的框架,利用的技术是hexo自动生成静态的页面,然后托管到Github Pages上面,相当于GitHub白给我了一个服务器让我存放我的静态页面,而hexo则是能够让我专心使用Markdown写作,页面的生成就交给它了。

所以hexo就类似于Java中的spring框架,如果需要用它,那么我们必然要安装对应的环境Node.js(即JRE)和对应的包管理程序npm(Maven)

具体步骤

没有什么比官方的文档更靠谱了 -> https://hexo.io/zh-cn/index.html

首先是hexo是基于Node.js的,所以需要先去安装Node.js。

Mac的很简单,只需要brew install node 一句话就装好了,windows可以直接下载对应的.msi文件然后下一步下一步完成安装。npm同理。

最后可以通过npm -vnode -v 查看是不是安装成功。

OK安装Node.js之后就可以安装hexo了,也是一句话就行了,npm install hexo-cli -g 这样子hexo就已经安装好了,接下来按照官方文档就可以了。

把自己的命令也敲下来,仅供参考。接下来的内容是基于已经有Github Pages了

首先创建一个自己的blog的文件夹,然后进入到这个空的文件夹内,一句话初始化hexo init 过一会就好了。

我这里遇到的一个问题是由于hexo默认应该是通过https从GitHub上面克隆库下来,然而我当时是配置过代理的,所以会报错,于是我就简单把小飞机关掉就好了。

之后如果成功初始化了的话,目录结构就像这样:

1
2
3
4
5
6
7
8
9
10
.  
├── _config.yml // 你的配置文件
├── db.json // 比较庞大的数据,大致扫了一眼跟博客内容有关
├── node_modules // npm的依赖,不建议通过git同步
├── package-lock.json // 应用程序插件的下载信息
├── package.json // 应用程序的信息,基本就是一些插件的信息
├── public // 编译生成的页面,同理也不建议同步
├── scaffolds // 模板文件,一般修改里面的post.md
├── source // 存放各类博文的.md文件
└── themes // 存放主题文件(一般都是网上下)

然后可以使用hexo g 直接生成静态页面,然后hexo s 开启服务器,到浏览器输入localhost:4000 就能看到你的博客了。

最后肯定是把你的博客上传到github pages 了。直接编辑_config.yml这个文件,在最后加入

1
2
3
4
deploy:
type: git
repo: 你的项目地址.git
branch: master

这里我还吃过亏,每个冒号后面请务必加一个空格!!!否则是不会成功的。

直接hexo d 就可以一键部署过去了。我这边是因为已经配置了公私钥,所以没有要我输入GitHub的账号密码什么的。然后我这里遇到的问题是hexo说我没有git….但是我肯定是有的,后来查阅资料发现还是需要安装相关插件,也是一句话的事情npm install hexo-deployer-git --save 然后就没有问题了。

至此基本的博客就完成了,以后写博客可以这么操作:

  1. 进入到目录/source/_posts/ ,创建你的Markdown文件安心写作。或者是直接到blog的目录下面用hexo new "博文题目"来自动创建
  2. hexo g 生成静态页面
  3. hexo s 本地查看你的博客
  4. hexo d 直接上传到GitHub

就是这么简单,还是很舒服的。

替换主题

hexo的更换主题很方便,直接把你要的主题下到themes文件中,然后在_config.yml中修改theme即可。(还是空格问题记得注意)

我选择的是Next主题下面的Pisces的小主题,用起来还是很舒服的,直接用Git进行主题的下载与同步,然后稍微修改下就可以了。

提供一下next主题的文档:https://theme-next.iissnan.com/getting-started.html 照着它来大体上是没什么问题的。

这里很坑的一点是,我在修改语言的时候,上面这个官方文档里说简体中文是zh-Hans 但是实测其实是zh-CN ,可以通过themes\next\languages 里面对应的.yml文件名来查看。

自定义域名

其实我感觉没什么必要,chenlangping.github.io 用起来感觉也挺好的,但是鉴于手头上有一个域名chenlangping.cn,然后开始折腾。但是我在配置的时候发现一个问题,还是记录一下。

首先我购买的域名是chenlangping.cn,然后GitHub上面的博客的域名是chenlangping.github.io

给懒人看的 购买了域名之后,只需要一条记录: www CNAME username.github.io. 这样就可以了,其他什么花里胡哨的都不需要,记得等10分钟-1小时再确认有没有生效

按照网上的教程,首先去GitHub的仓库,有两种操作方法,任选其一即可:

  1. 在根目录下创建一个CNAME的文件,然后把购买到的域名写进去即可。
  2. 进入settings下面Custom domain,填入你购买的域名,然后确认即可,GitHub会自动帮你生成CNAME文件。

这么做的目的,是为了一旦有人访问xxx.github.io,就能够跳转到填入Custom domain的域名中。(此句存疑)

然后去你的DNS解析商,填入以下的三条记录即可。

1
2
3
@          A             192.30.252.153
@ A 192.30.252.154
www CNAME username.github.io. #注意最后这个“点”

然后坐等一会儿就好了。然而我实际情况是,当我访问chenlangping.cn的时候,会跳出GitHub的404页面,且如果我访问的是chenlangping.github.io,会跳转到chenlangping.cn这个页面,然后跳出404。

在解决这个问题前,首先了解下有两种记录类型,一种是A,还有一种是CNAME,A的意思就是把你的域名解析成ip地址,而CNAME的意思是把你的域名解析成另外一个域名。我一开始用的是A,然后网上说直接Ping一下 chenlangping.github.io这个域名就能得到你博客的ip地址,确实得到了,然后我复制了这个ip地址,直接粘贴到浏览器一访问,是404不存在。这里应该是存在什么技术能够实现这个,但是我不知道。

接下来是我自己摸索的方法。抛开刚刚那个技术问题,由于直接访问ip访问不了博客,然就通过CNAME解析来访问呗,我一开始是这么想的,所以仅仅在DNS的服务商(阿里云、腾讯云等)配置了一条记录,主机记录是@,然后类型是CNAME,记录的值当然是我的 chenlangping.github.io啦。这样我以为就好了,因为现在一旦访问我购买的域名chenlangping.cn,那么根据配置的CNAME,会跳转到chenlangping.github.io,接下来就跟直接访问chenlangping.github.io一样了。也就是说,我现在在腾讯云记录上只有一条记录,也就是

1
@      CNAME           chenlangping.github.io.

然后GitHub这边的仓库设置保持不变。这样就能通过chenlangping.cn来访问我的博客了。之后又去加了一条,把@改成www,这样不论是 www.chenlangping.cn 还是 chenlangping.cn 都能直接访问我的博客了。

存在的问题

根据上文所述,CNAME是把域名解析到另外一个域名,那么我最后仅仅在域名解析商中添加了一条记录,同时也在GitHub仓库中添加了一条记录,也就是通过域名解析商,我能够让chenlangping.cn访问chenlangping.github.io,但是通过github,我又能够通过chenlangping.github.io访问chenlangping.cn,这样是不是就造成了死循环呢?我去问了同学,同学说的是,GitHub仓库中的CNAME是用来指定,哪个域名可以解析到GitHub仓库,而不是我之前理解的那样。OK这样确实能够有效避免死循环,但是之前我遇到的问题就解释不通了,如果按照我同学的理解,那么我当时访问chenlangping.github.io是不会跳转到chenlangping.cn的,但是事实上就是跳转了,所以很迷。

解答:GitHub上面的CNAME就是一般CNAME的意思,并不是所谓的什么接受域名。其实是之前”死循环”的理解是正确的,那么为什么不会构成死循环呢?因为一开始chenlangping.github.io它指向的是正确的ip地址,然后我在DNS服务商加了一条CNAME,相当于复制了正确的A记录,之后GitHub pages又复制了正确的记录,这样自然不会有什么问题。当然如果一开始就是错的,那么复制来复制去的自然也是错误的,解决办法也很简单,只需要在GitHub仓库里的settings暂时把CNAME去掉,过一会它就会恢复成正确的,然后再把它改回去就好了。当然如果你用的是网上的教程,就不用担心这种问题,因为根本就不会有循环,而且ip地址是写死的,但是网上的方法似乎是不能https的。

备份推荐

一开始我是把整个blog文件都用Dropbox进行同步的,没出过什么问题,缺点就是每次用hexo g的时候都会生成全新的静态页面,一开始的时候还好,但是随着博文越来越多,会生成越来越多的静态文件,而这些静态文件会在dropbox间进行同步,比较消耗资源。比较推荐另外两套解决方案:

  1. 自己使用github进行同步,推荐使用以下的gitignore文件:
1
2
3
4
5
6
7
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
  1. 使用对应的hexo-git-backup插件,有它来进行备份。
  2. 以上1和2都用,确保博客的安全。

其他的小问题

  • 如何设置文章的各种属性?

    • 通过设置Front-matter,以下选项中的所有内容均为非必填的,根据需要自行选择。

    • 配置选项 默认值 描述
      title Markdown 的文件标题 文章标题,强烈建议填写此选项
      date 文件创建时的日期时间 发布时间,强烈建议填写此选项
      author _config.yml中的 author 文章作者
      img featureImages中的某个值 文章特征图,推荐使用图床(腾讯云、七牛云、又拍云等)来做图片的路径.如: http://xxx.com/xxx.jpg
      top true 推荐文章(文章是否置顶),如果 top 值为 true,则会作为首页推荐文章
      password 文章阅读密码,如果要对文章设置阅读验证密码的话,就可以设置 password 的值,该值必须是用 SHA256 加密后的密码,防止被他人识破。前提是在主题的 config.yml 中激活了 verifyPassword 选项
      toc true 是否开启 TOC,可以针对某篇文章单独关闭 TOC 的功能。前提是在主题的 config.yml 中激活了 toc 选项
      mathjax false 是否开启数学公式支持 ,本文章是否开启 mathjax,且需要在主题的 _config.yml 文件中也需要开启才行
      summary 文章摘要,自定义的文章摘要内容,如果这个属性有值,文章卡片摘要就显示这段文字,否则程序会自动截取文章的部分内容作为摘要
      categories 文章分类,本主题的分类表示宏观上大的分类,只建议一篇文章一个分类
      tags 文章标签,一篇文章可以多个标签
  • hexo和typora图片位置冲突了

    • 因为我设置了hexo创建新文章的时候会自动创建一个与文章同名的文件夹,为了存放图片,方便管理,比如我需要在我的文章引入一张图片,我只需要把图片放入文件夹中,然后![](图片的名字.jpg) 即可引用,但是typora就不会显示,要解决这个也挺简单的,在文章的一开始加入typora-root-url: 图片文件夹的名字 就可以了,这样不论是hexo和typora都能正确显示图片了。

CI/CD

过了一段时间发现我的域名直接访问又访问不了了,应该是墙又高了。而且平时老翻的话,其实访问起来也是很不爽的,所以希望能够hexo d的时候,顺手也把自己的博客放到国内的云服务上面,这个时候就需要对应的CI/CD来进行帮助了。

  1. 在云服务器上创建一个用户,就简单叫git好了:adduser git
  2. 到这个用户的家目录下,建立一个bare的仓库:cd /home/git && git init --bare hexo.git
  3. 修改对应的仓库的权限:chown -R git:git hexo.git
  4. 复制公钥到authorized_keys文件中。此时可以使用ssh -T git@公网ip 测试一下有没有问题。这里我遇到了一个问题,就是之后部署是通过git的ssh方式的,而ssh的话需要保证.ssh的权限是当前用户的,而我当时用的root的权限创建的,所以一直ssh连接不上去。
  5. 创建一个脚本,touch /home/git/hexo.git/hooks/post-receive,并且该对应的脚本权限设置成可以执行。 在脚本中加入如下语句:
1
2
#!/bin/sh
git --work-tree=/var/www/html/chenlangping.github.io --git-dir=/home/git/hexo.git checkout -f
  1. 在hexo的配置文件的部署部分,加入aliyun: git@公网ip:/home/git/hexo.git,master即可。