Hexo + git + Coding Pages 博客

Hexo + Git + Coding Pages = Blog

前置条件

git+命令行(linux)

环境配置

以下操作基于Windows

git安装与配置

  1. 下载git
  2. 安装与配置:略

Nodejs安装与配置

  1. 下载Nodejs

  2. 安装Nodejs

在安装时界面下方有一个"Add to PATH"的选项,最好勾上;或者也可以安装完成后自己手动添加环境变量。

安装依赖包

1
npm install

hexo安装

1
npm install -g hexo

npm是Node的包管理工具,后面还要多次用到它~ 其中的参数-g是将hexo安装到全局,如果不加的话则默认只会安装到当前目录

开始

初始化

  1. 选择一个你希望用来存放博客的空文件夹,进入,右键"git bash here"

其实也就是在命令行下进入这个文件夹

  1. Hexo 初始化
1
hexo init
  1. git初始化

    1
    
    git init

Hexo的初始化要求目标文件夹为空,如果先建立git仓库的话由于隐藏文件夹.git的存在会导致hexo “target not empty"的报错。

在执行这个操作之后,部分文件夹结构如下:

文件夹/文件备注
scaffolds存放文章模板,新建文章时根据其中的模板生成。其中draft.md是草稿模板,page.md是独立页面模板,post.md是文章模板。可以自己修改。
source存放资源文件
themes存放主题文件
_config.yml存放这个博客的基本配置,所用的标记语言是YAML,可以打开编辑调整设置。

如果主题是从git仓库clone的,应当将主题目录下的.git隐藏文件夹删掉,防止对博客的整个git仓库产生干扰。

不过据说用git的子模块可以更方便的解决,而且可以更新主题。但我不会

git分支

Hexo编译生成的网站位于hexo根目录下的public文件夹内,deploy命令会将其部署到Git远程仓库。但是同时我们也希望用Git管理所有的源文件和配置文件。建立两个git仓库又太麻烦,那么这时可以用Git的分支功能。

也就是说,可以将源文件提交为hexo(或者其他名字)分支,将hexo生成的网页提交为master分支。

coding的page服务只能部署master分支的网页。

创建分支xxx

1
git branch xxx

git仓库建立后,需要commit一次才能建立新的分支

切换到分支xxx

1
git checkout xxx

配置

打开博客根目录下的_config.yml,这个配置文件使用YAML编写,其中以“#”开头的是注释,形如“name: value”的代表名为name的项值为value

冒号后的空格不能省去

注意:接下来在编辑所有的文本文件时,都需要使用UTF-8编码进行编辑或者保存。否则容易造成非英文字符乱码。一般推荐用带编码转换功能的文本编辑器。反正不要用记事本

注释

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Hexo Configuration
## Docs: https://hexo.io/docs/configuration.html
## Source: https://github.com/hexojs/hexo/

# Site
title: 博客标题
subtitle: 副标题
description: 描述
author: 文章作者
language: 语言(zh-CN,en,etc)
timezone: 时区

# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://yoursite.com
root: /
permalink: :year/:month/:day/:title/
# 决定博客生成文件的结构,为了简化可以使用:category/:tittle/,这样也便于搜索引擎抓取
permalink_defaults:

# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render:

# Writing
new_post_name: :title.md # File name of new posts
default_layout: post # 默认模板
titlecase: false # Transform title into titlecase
external_link: true # Open external links in new tab
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: true
highlight: # 如果在文章中插入代码时的高亮
# 有些主题自带的高亮与这里的冲突,请查看主题的文档
  enable: true # 开关
  line_number: true # 行号
  auto_detect: false # 自动检测
  tab_replace: # 替换缩进
  
# Home page setting
# path: Root path for your blogs index page. (default = '')
# per_page: Posts displayed per page. (0 = disable pagination)
# order_by: Posts order. (Order by date descending by default)
index_generator:
  path: ''
  per_page: 10 # 每一页显示的文章数
  order_by: -date # 排序关键字
  
# Category & Tag
default_category: uncategorized
category_map:
tag_map:
# 映射,例如:
# 编程: Coding
# 这样可以将文章中设置的分类或者标签“编程”映射为Coding,这样可以避免中文路径的出现

# Date / Time format
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss

# Pagination
## Set per_page to 0 to disable pagination
per_page: 10
pagination_dir: page

# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: landscape # 选择所使用的主题

# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy: # 这里用来设置部署,下面以git为例
    type: git
    repo: #这里填你的git远程仓库地址
    branch: master # 部署到哪个分支。Coding Pages只支持部署master分支
    message: # 默认为Site Updated ...

使用

写文章

新建文章

1
hexo new xxx

这样就在source/_posts下建立了xxx.md

现在的内容如下:

1
2
3
4
5
6
---
title: xxx
date: 2018-05-11 10:37:55
tags:
---
这里是正文内容(markdown语法)

其实还可以有更多的设置项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
---
title: xxx
date: 2018-05-11 10:37:55
comment: true
tags:
	- tag1
	- tag2	
	- ...
categories:
	- category1
	- category2	
	- ...
toc: true
ca
---
这里是正文内容(markdown语法)

其中comment是评论的开关;toc是文章目录的开关

写草稿

有的时候开始写一篇文章,但是尚未完成不能发布,这时候可以先新建一篇草稿:

1
hexo new draft xxx

这样就在source/_draft下建立了xxx.md,格式与文章相同。

发布草稿

当草稿写完后可以将其发布:

1
hexo publish xxx

这样就将_draft下的xxx.md移动到_post下了。但这不是普通的移动。

  1. 新建草稿时并不会添加时间信息,但是在发布草稿时会将发布时的时间添加到文章内。
  2. 在新建或者发布文章时,如果文件名重复,hexo会自动重命名为类似xxx-1.md,但是标题是根据文件内部的title确定的。

独立页面

1
hexo new page xxx

这样就在source下建立了名为xxx的文件夹,其中包含index.md。

但是这时这个独立页面还是不可见的,添加入口的方法见你所使用的主题文档

编译

1
hexo generate

或者可以简化成:

1
hexo g

这时hexo会将所有的.md和资源文件编译成.html文件,并按照_config.yml中指定的结构存放于public文件夹内。

正常的输出信息类似于:

1
2
3
4
5
6
7
8
$ hexo g
INFO  Start processing
INFO  Files loaded in xxx s
INFO  Generated: xxx
INFO  Generated: xxxx
INFO  Generated: xxxxx
...
INFO  xx files generated in xx ms

此时public中就是一个完整的站点了。

如果编译出现错误,最好检查一下编译之前所进行的操作正确性。报错的信息也会指出在什么文件的什么位置造成了错误。但是通常这样的错误会引发连锁反应,难以找到最初的根源。

另外hexo在编译时只会更新有变化的文件,如果想要清空已经生成的文件,使得下一次能够全部重新编译,可以这样:

1
hexo clean

本地预览

有时我们想要看看现在博客呈现效果,但是又不想重新部署,这时可以开启本地预览:

1
hexo server

简化写法:

1
hexo s

正常的输出信息是:

1
2
INFO  Start processing
INFO  Hexo is running at http://localhost:4000/xxx/. Press Ctrl+C to stop.

其中的xxx是_config.yml中指定的root:项。

所以现在你的博客已经运行在本地了,在浏览器中输入http://localhost:4000/xxx/.,就可以预览博客的效果。

部署

当然,想要让小伙伴们也能看到我们的博客,还要将其部署到某个服务器。

或者我们可以利用Coding Pages服务,或者github.io。

具体的方法见Coding的介绍

对于博客本身,我们还要在配置文件_config.yml中找到部署的配置并填写完整:

1
2
3
4
5
deploy:
- type: git
  repo: #填写你的git仓库地址
  branch: master #coding只支持master分支运行pages
  message: 

在一切设置完毕后,使用下面的命令执行部署:

1
hexo deploy

简写:

1
hexo d

另外,编译和部署可以一起使用:

1
hexo g -d
1
hexo d -g

批量修改分类

见我的这篇文章

完善

CDN

博客的主题往往会用到一些常用的前端开发的库,默认是一起存在主题文件夹下的。众所周知,服务商对于像我们这样搭建的博客不会分配太多的带宽,所以如果能够从速度更快第三方加载一些公用的库,博客打开的速度就可以得到提升。而且将资源分布到不同的节点可以防范一定程度的DDOS攻击。

一些主题内置了设置公用CDN加速的配置,常用的公用CDN有https://www.bootcdn.cn等

注意:使用公用CDN后,博客就会从指定的url载入相关的文件而不是从博客本身的目录加载。所以如果设置了公用CDN而在未联网的情况下进行本地预览时,就会出现异常。

添加自定义代码

注意:尚未测试这个方法对于其他主题适用不适用。

在sources文件夹下_data文件夹内建立footer.yml,然后这样写:

1
2
3
4
nameOfCode:
	yourCode
another:
	anotherCode

或者如果有一定基础,可以自己修改主题的模板文件。

文章浏览统计

LeanCloud

LeanCloud是一家云服务提供商,而且对于一般的使用免费,后面还会用到。

文章的计数器功能可以用LeanCloud。具体见你的主题配置。

站长统计

先注册友盟

再到首页-产品-U-Web统计-立即使用-添加站点。

然后把生成的代码放到合适的位置即可。

评论系统

第三方评论系统有许多,这里介绍一种。

Valine

Valine“是一款基于Leancloud的快速、简洁且高效的无后端评论系统。 ”(来自Valine首页)

大多数的主题已经内置了Valine,如果没有,可以参阅Valine的教程,这里不再赘述。

绑定域名

如果拥有自己的域名,可以将博客绑定到域名上。

申请域名

域名可以从阿里云,腾讯云等申请/购买,不同的域名价格差距还是很大的。

在购买之前和购买之后,还要完善各种各样的信息。另外,一些域名不实名认证可能无法正常使用。

下面以阿里云购买的域名为例。

解析域名

获得域名之后,要将域名解析到博客。由于我们的博客是托管在Coding上,Coding给出的方案是将域名用CNAME方式解析到pages.coding.me,然后Coding再根据用户在pages服务中设置的域名解析到对应的用户。

所以,我们只要进解析界面将我们的域名解析到pages.coding.me即可。(注意:**不用**把pages替换为你的用户名,即不用改动任意一个字符!)

另外,由于Coding用Let’s Encrypt申请SSL/TLS证书,解析时要确保在境外能够访问博客,可以将境外的线路也解析到相同的地址。

搜索引擎收录

sitemap

安装插件:

1
2
npm install hexo-generator-sitemap --save     
npm install hexo-generator-baidu-sitemap --save

这样以后每次编译时都会自动更新博客根目录下的sitemap.xml和baidusitemap.xml。

Google

登录

首先要有个Google账户。然后访问https://www.google.com/webmasters,登录,输入博客域名。

验证

此处介绍文件验证。下载验证用的html文件,放在source文件夹根目录下。

注意:为了防止hexo编译该html文件,应该在其开头加上:

1
2
3
---
layout: false
---

(冒号后面有一个空格)

然后编译,部署,等待服务器部署完成后,访问 你的域名/那个html的名称.html,如果是空白背景上显示一行这样的文本(也就是文件内容):

1
google-site-verification: googlexxxxxxxxxxxxxxxx.html

就说明成功了。然后接着验证即可。

吐槽:Google的人机验证总不把我当人-_-。

提交站点地图

在左面“抓取”目录下选择“站点地图”,点“添加/测试站点地图”(在右面)

然后就是等啦。

百度

首先要有个账号。然后访问https://ziyuan.baidu.com。

点用户中心,站点管理。

吐槽:百度居然要这么多信息……

然后输入域名,选择类型;

然后验证。

同样以文件验证为例,下载,放到source,并且加上防止hexo编译的代码。编译部署。

确认后按完成验证。

链接提交

百度的链接提交方式有很多;

自动提交有主动推送,自动推送,sitemap;

主动推送:

安装插件,

1
npm install hexo-baidu-url-submit --save

然后在_config.yml中添加:

1
2
3
4
5
6
7
8
baidu_url_submit:
  count: 100 
  host: www.example.com 
  # 域名
  token: xxxxxxxx 
  # 密钥
  path: baidu_urls.txt 
  # 新链接保存文件

然后在deploy项中添加:

1
   type: baidu_url_submitter

这样每次部署都会推送了。

自动推送

复制代码添加到博客即可。

sitemap

之前我们安装了两个插件,一个是生成通用的sitemap,一个是生成百度的sitemap。所以这里需要填写百度的sitemap.xml的url。

360搜索

首先要有个360账号。

然后访问http://zhanzhang.so.com。

验证

我的站点-站点管理-添加网站。

添加后会多一条记录,记录那一行会显示蓝色的“请验证”。

没错,点它。

还是以文件验证为例,下载,放到source文件夹下。(360的验证文件是txt格式的,省心多了)。

编译,部署。

用同样方式检验文件后,点击验证。

sitemap

现在,在刚刚“请验证”的地方多了很多选项。

这里我们点“管理sitemap”-添加新数据,输入,添加。

自动收录

复制代码,添加到博客中即可。

SEO优化

版权

添加许可证

我用的这个。

其中license.png可以在这里下载。

1
版权声明:这篇文章采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="知识共享许可协议" style="border-width:0;height:20px;width:107px;" src="/img/license.png" /></a>进行许可,转载请注明出处。

防复制

添加自定义代码如下:

1
<body oncopy='return false'></body>

这样别人就不能复制页面的内容了。但是这种写法好像不是很正规,不过可以生效(摊手)。

或者如果你更担心,可以用更严格的方法:

1
<body leftmargin=0 topmargin=0 oncontextmenu='return false' ondragstart='return false' onselectstart ='return false' onselect='return false' oncopy='return false' onbeforecopy='return false' ></body>

这样就既不能选择文本,也不能右键了。

或者可以在复制时添加版权信息。

我参考这里的方法改进了一下。

另外还有一些参考资料:

https://developer.mozilla.org/zh-CN/docs/Web/API/Range/selectNode

https://developer.mozilla.org/zh-CN/docs/Web/API/Selection

主要思路:

对于IE,直接添加到剪贴板;

对于其他浏览器,新建一个不可见的div,在复制时将其内容添加到选区。

需要注意的是这里并不能将visibility设为hidden而是要将其位置设置到页面外,否则这个div并不能被选取。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
function addLink() 
{
	var selection = window.getSelection();
	var copyright =" </br></br>//来自du33169.tech </br>转载请保留原文链接: "+document.location.href+"</br>"; 
	if (window.clipboardData) // Internet Explorer
	{          
		window.clipboardData.setData ("Text", selection+copyright);
		return false;
	} 
	var newdiv = document.createElement('div');
	newdiv.style.left='-9999px';
	(document.body).appendChild(newdiv);
	newdiv.innerHTML = copyright;
	var tmprange=document.createRange();
	tmprange.selectNode(newdiv);
	selection.addRange(tmprange);
	window.setTimeout(function() {
	(document.body).removeChild(newdiv);
	},0);
	
	alert('已成功复制到剪贴板!\n 如需转载请注明出处(du33169.tech),\n 谢谢支持!');
}
1
<body oncopy="addLink()"></body>

一些常用插件

站内搜索

https://github.com/wzpan/hexo-generator-search

这个插件可以生成搜索索引。

使用如下命令安装:

1
$ npm install hexo-generator-search --save

然后在配置文件中添加:

1
2
3
search:
   path: search.xml
   field: all

然后如果使用的主题集成了搜索功能的话,开启即可。

如果没有,则需要自己添加,不再赘述。

压缩插件

hexo在编译的时候会产生大量的空格和换行,也影响加载速度。

使用hexo-neat(非官方,不推荐)

首先安装:

1
npm install hexo-neat --save

然后在_config.yml中添加配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
neat_enable: true 

neat_html: 
  enable: true 
  exclude: 

neat_css: 
  enable: true 
  exclude: 
    - '**/*.min.css' 

neat_js: 
  enable: true 
  mangle: true 
  output: 
  compress: 
  exclude: 
    - '**/*.min.js' 

这样编译的时候就会自动压缩。

但是由于压缩需要时间,所以编译由原来的几秒变成了几十秒……

一个解决方法:将_config.yml中的neat_enable设为false,然后将其复制一份(例如neat.yml),在neat.yml中将neat_enable设为true。

这样在平时hexo g的时候不会压缩保证效率,在需要部署的时候可以用hexo g --config neat.yml

缺点是要保持两个配置文件同步,可以用脚本实现。

压缩的效果还是很显著的,这是我的public文件夹总大小:

压缩前压缩后
50MB15MB

参考: https://blog.csdn.net/lewky_liu/article/details/82432003 hexo-neat的github地址

使用hexo-uglify, hexo-clean-css, hexo-html-minifier

(2022.3.16更新)

参考:https://blog.jijian.link/2020-03-05/hexo-compress/

这三个是官方的插件,支持缓存。缺点就是server 的时候也会压缩,但是对我没影响。

安装:

1
npm i hexo-clean-css hexo-html-minifier hexo-uglify --save

配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uglify:
  mangle: true
  # 下面如果取消注释则不能为空,为空会导致 js 不文件压缩
  # output:
  # compress:
  exclude:
    - '*.min.js'
  es6: false

clean_css:
  exclude: 
    - '*.min.css'

html_minifier:  
  collapseBooleanAttributes: true
  collapseWhitespace: true
  # Ignore '<!-- more -->' https://hexo.io/docs/tag-plugins#Post-Excerpt
  ignoreCustomComments: [ !!js/regexp /^\s*more/]
  removeComments: true
  removeEmptyAttributes: true
  removeScriptTypeAttributes: true
  removeStyleLinkTypeAttributes: true
  minifyJS: true
  minifyCSS: true

文章加密

hexo-blog-encrypt

安装

1
npm install --save hexo-blog-encrypt

在_config.yml中添加:

1
2
3
4
5
6
7
8
# Security
##
encrypt:
    enable: true
    default_abstract: 需要密码才能查看。
    ## 默认的显示在文章摘要部分的内容
    default_message: 请在下方横线输入密码后回车:
    ## 默认的位于密码解密界面的提示

使用

如果想要特殊指定,在文章开头的yaml头部分,添加以下内容:

1
2
3
4
password: 123456
# 这篇文章的密码
abstract: Welcome to my blog, enter password to read.
message: Welcome to my blog, enter password to read.

**注意:**由于yaml的bug,密码不能是带有前缀0的纯数字。

​ 解决方法:用双引号括起密码(双引号本身不作为密码内容)

美化

Mathjax

添加以下代码:

1
<script type="text/javascript" src="https://cdn.bootcss.com/mathjax/2.7.5/MathJax.js?config=default"></script>

就可以在markdown文章中直接使用数学公式。

测试一下:

$$ x^2+y^2-|x|y=1 $$$$ \sqrt{4-2\sqrt3}=\sqrt3-1 $$

踩坑

2019-3-23更新:

latex中_(下划线)和\(斜杠)会被hexo默认的markdown渲染引擎转义,造成mathjax对公式渲染错误。

解决方法

详见此

!注意:如果使用Pandoc要先下载安装,再在hexo安装插件。

一言

用来每次显示不同的一句(富有哲理的)话。

这里我用了lwl12提供的更便捷的api,只有一行代码,放到想放的地方就可以了。

1
<script type="text/javascript" src="https://api.lwl12.com/hitokoto/v1?encode=js&charset=utf-8"></script><script>lwlhitokoto()</script>

我不会告诉你我放在页面最下面

—2020.1.16更新:

lwl12的api好像不能用了,博客也没法访问,那么直接用现在才发现的官方api吧:

1
2
<span id="hitokoto">:D 获取中...</span>
<script src="https://v1.hitokoto.cn/?encode=js&select=%23hitokoto" defer></script>

装饰

背景

感觉背景有些单调并且缺乏活力,想更有活力些?

当然可以。

canvas-nest提供了一个简洁而美观的网页背景效果,可以产生能与鼠标互动的立体几何图形。

1
<script type="text/javascript" color="10,43,92" opacity='0.7' zIndex="-2" count="99" src="https://cdn.bootcss.com/canvas-nest.js/1.0.1/canvas-nest.min.js"></script>

这段代码已经使用了CDN,将其添加到博客中即可。

其中color是RGB表示的颜色,opacity表示透明度,count表示线段的数量。

鼠标点击特效

https://github.com/djzhao627/JSClickBubble

这个js文件可以实现点击鼠标时在点击处弹出文字并向上淡出。

保存为js并添加到博客即可。

自定义404页面

当来访者尝试访问一个不存在的页面时,会自动跳转到404页面。如果使用Coding Pages,默认会跳转到Coding的404页面。

如果在sources文件夹下建立404.html,在部署之后就会将其作为默认的404页面。

但是hexo会将sources下的所有.html和.md都编译,所以同样要在.html的开头加上:

1
2
3
---
layout:false
---

404页面的内容可以自己设计。

音乐

网易云音乐播放器

单曲

在歌曲页面左边封面下方,点生成外链播放器

歌单

首先将自己的歌单分享-分享给大家,然后在自己的动态里打开,就能找到生成外链播放器的链接了。

注意,网易云音乐播放器不支持https!所以对于使用https的博客,网易云的播放器不适用。

Aplayer

一个更好的解决方法(这个博客失效了)

MetingJS

踩坑

这里是一些踩过的坑。

1.编译报错

1
2
FATAL Cannot read property 'replace' of null
TypeError: Cannot read property 'replace' of null

原因:url配置有误,root项即使是根目录也应该是“root: /‘

2.自定义代码部署后不生效

可能原因之一

即博客使用了https,但代码中使用的CDN使用了http,被浏览器认为不安全。

3.文件根目录绝对路径

有时候需要从根目录开始访问某个文件,但是为了本地测试又不能直接使用域名,那么可以这样访问:/bin/cat.txt,将会定位到根目录下bin文件夹中的cat.txt文件。

4.编译报错

1
2
3
4
TypeError: Cannot read property 'toString' of undefined
...
Callback is not a function
...

原因

升级hexo或者其中插件后出现版本问题

解决办法:

删除node_modules文件夹,将package.json和package-lock.json两个文件回退,再执行npm install

5.执行hexo d时卡住

可能原因

  • 文件正在上传
  • _config.yml格式不对

解决方法

Windows下如果是用ssh方法连接远程仓库,可以打开任务管理器看看是不是有ssh.exe在占用上传带宽,如果是就等吧。

6 public文件夹中生成的文件全都是0B的空文件

原因

node的版本>=14时会出问题

解决办法

使用以下命令回退:

1
2
sudo npm install n -g #安装node版本管理工具
sudo n stable #安装稳定版node,当前(2020.9)为node12.18,可以正常使用hexo
0%