运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++内置了丰富的运算符,并提供了以下类型的运算符:

  • 算数运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

  在程序中,运算符是用来操作数据的,因此,这些数据也被称作操作数。使用运算符将操作数连接而成的式子称为:表达式。 表达式的特点:

  • 变量和常量都可以认为是表达式;
  • 运算符的类型对应了表达式的类型,如算术运算符对应算数表达式;
  • 每一个表达式都有自己的值,即表达式都有运算结果;

算数运算符

A=10,B=20

运算符 描述 实例
+ 两个操作数相加 A+B=30
- 第一个操作数减去第二个操作数 A-B=-10
* 两个操作数相乘 A*B=200
/ 分子除以分母 B/A=2
% 取模运算符,整除后的余数 B%A=0
++ 自增运算符,整数值增加1 ++A = 11
-- 自减运算符,整数值减少1 - -A=9

  除法运算中整数和浮点数的运算结果不太一样,整数除的话结果就是整数,要想输出完整整型数:需要用浮点数去除:

1
2
3
int A = 10;
cout << 15 / A << endl; //输出1
cout << 15.0 / A << endl; //输出1.5

  自增/自减运算符放在变量的前面和后面是不一样的。放在变量前面就是先做运算再出结果;放在后面就是先出结果再运算。

1
2
3
4
int A = 10;
int B = 10;
cout << ++A << endl; //输出11
cout << B++ << endl; //输出10(但是B变为11)

关系运算符

A=10 ;B=20

运算符 描述 实例
== 检查两个操作数是否相等,如果相等则条件为真 (A == B)不为真
!= 检查两个操作数是否相等,如果不相等则条件为真 (A!=B)为真
> 检查左操作数是否大于右操作数,如果是则条件为真 (A>B)不为真
< 检查左操作数是否小于右操作数,如果是则条件为真 (A<B)为真
>= 检擦左操作数是否大于等于右操作数,如果是则为真 (A>=B)不为真
<= 检查左操作数是否小于等于右操作数,如果是则条件为真 (A<=b)为真

关系运算符返回的都是bool类型的值。

逻辑运算符

A = true; B = false;

运算符 描述 实例
&& 逻辑与运算符。如果两个操作数不为零,则条件为真 (A && B)为假
|| 逻辑或运算。两个操作数任意一个非零,则条件为真 (A || B)为真
! 逻辑非运算,用来逆转操作数的逻辑状态,是单目运算符 !(A && B)为真

可以用逻辑运算符来表示德摩根律:\(\neg(A \land B)\) 等价于 \(\neg A \lor \neg B\)\(\neg(A \lor B)\) 等价于 \(\neg A \land \neg B\)

1
2
cout << (!(A || B) == (!A && !B)) << endl;
cout << (!(A && B) == (!A || !B)) <<endl;

逻辑运算符本身也是有优先级的

1
2
auto a = true || true && false;     //true
auto b = (true || true) && false; //false

赋值运算符

把右侧的值赋给左侧。注意左侧的值一定要是一个变量。

运算符 描述
= 赋值运算
+= 加且赋值运算符
-= 减且赋值运算符
*= 乘且赋值运算符
/= 除且等于运算符
%= 求模且等于运算符
<<= 左移且赋值运算符
>>= 右移且赋值运算符
&= 按位与且赋值运算符
^= 按位异或且赋值运算符
|= 按位或且赋值运算符

位运算符

位运算符作用于位(bit),并逐位进行操作。

p q p&q p | q p^q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

位运算符还包括取反操作~和移位运算<<和>>,都是以bit为单位运算。

与、或、异或都是双目运算符,结合性从左到右,优先级高于逻辑运算符,低于关系运算符,且从高到低为&、^、|

使用移位运算符需要注意,左移运算还比较简单,移走的位自动填充0,但右移运算有两种情况,逻辑右移时移走的位填充0,但算数右移时移走的位与符号位有关。底层到底是逻辑右移还是算数右移取决于编译器,而不是程序员,所以对于有符号数,尽可能不要使用右移运算!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 位运算
int A = 10,B = 20;

cout << (A&B) << endl; // 01010 & 10100 = 00000 ==> 0

cout << (A | B) << endl; // 01010 | 10100 = 11110 ==> 30

cout << (A^B) << endl; // 01010 ^ 10100 = 11110 ==> 30

//取反运算需要补码的知识,计算机中都是用补码表示的
cout << (~A) << endl; // ~0000000000001010 = 11111111111110101 ==> 0000000000001011==-11

cout << (A << 2) << endl; // 00001010 << 2 ==> 00101000 ==> 40

cout << (A >> 2) << endl;// 00001010 >> 2 ==> 00000010 ==> 2

杂项运算符

运算符 描述
sizeof sizeof运算符,返回变量的大小,即这个变量的类型所占用的byte的长度
Condition ?X:Y 条件运算符,唯一的三目运算符。如果Condition为真,则值为X,否则值为Y
逗号运算符,会执行一系列运算,整个逗号运算符表达式的值是以逗号分隔的列表中的最后一个表达式的值
.(点)和->(箭头) 成员运算符,用于引用类、结构体和共用体的成员
Cast 强制类型转换运算符,把一种数据类型转换成另一种数据类型,如int(2.20)将返回2。C++中不建议使用强制转换
& 指针运算符&,返回变量的地址
* 指针运算符*,指向一个变量

运算符优先级

下表从高到低列出各个运算符,较高的运算符会被优先计算:

类别 运算符 结合性
后缀 () [] ++ -- 从左到右
一元 + - ! ~ ++ -- (type)* & sizeof() 从右到左
乘除 * / % 从左到右
加减 + - 从左到右
移位 << >> 从左到右
关系 < <= > >= 从左到右
相等 == != 从左到右
位与AND & 从左到右
位异或XOR ^ 从左到右
位或OR | 从左到右
逻辑与 && 从左到右
逻辑或 || 从左到右
条件 ?: 从右到左
赋值 = += -= *= = %= >>= <<= ^= |= 从右到左
逗号 从左到右

只需要记住两点:

  1. 一般来说,一元运算符优先级高于对应的二元运算符;
  2. 弄不清就加括号

编译型语言

编程语言可以分为四个层次,从上到下,语言会更接近人类使用语言的方式,但相对应的程序运行效率逐渐降低

  1. 机器语言、汇编语言:这些语言执行效率很高,但移植性很差;
  2. 编译型语言:C/C++。这种类型的语言更接近人类的使用方式,在不同的机器上也可以跨平台使用。但跨平台有一些难度;
  3. 解释型语言:Basic、Python。这种类型的语言通过解释器作为中间层,跨平台性很强;
  4. 脚本语言:bash、csh。不同的平台拥有不同的脚本,本身的功能并不强大,但是很容易把各种语言融合在一起。

C++属于编译型语言,需要经历编译和链接的过程,才能变成真正的可执行程序:

数据类型

  C++中的每个变量都有其数据类型,数据类型决定这个变量所占用内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。

  在计算机中,1byte=8bit。我们在说数据类型的大小的时候一般以byte作为单位来计算。

  计算机中都是用0、1这种二进制存储的。日常中我们习惯用10进制来看,有时候为了方便,调试过程中更习惯用16进制的方式来表示。

名称 字节数 描述 范围
char 1 存储字符或者整数,8位(bit) 有符号:-128~127;
无符号:0 ~ 255;
short 2 短整数,16位 有符号:-32768~32767;
无符号:0 ~65535;
long 4 长整数,32位 有符号:-2147483648~2147483647;
无符号:0 ~4294967295 ;
int 4 整数 同上
float 4 浮点数
double 8 双精度浮点数
long double 8 长双精度浮点数
bool 1 布尔值,只能是真值或假值 true或false
wchar_t 2 宽字符,这是为存储两字节长的国际字符而设计的类型
1
2
3
4
5
6
7
8
9
10
11
//常见的数据类型的定义
char a[10] = "a";
short int s = 97;
int m = 97;
long int n = 97;
//给float类型的变量赋值时,要在数值后面加上一个f或F,表示这是一个float类型的常量,否则默认为double类型的常量
float f = 97.0f;
double d = 97.0;
long double k = 97.0;
bool b = true;
wchar_t w[10] = L"a";

标识符和关键字

C++中的标识符是用来标识变量、函数、类、模块,或者任何其他用户自定义项目的名字;

  • 一个标识符通常以字母A~Z或a ~z或下划线_开始,后面跟零个或者多个字母、下划线和数字;
  • 一个标识符不允许使用数字开头;
  • 一个标识符内不允许出现标点字符,如@、&等等;
  • 不能混淆大小写,C++是区分大小写的编程语言;
  • 不能使用C++关键字作为标识符,原则上不允许长度超过32位;

标识符命名规则:

  • 不要试图发明最好的命名规则,要制定一个让大部分人都满意的命名并在项目组中贯彻执行;
  • 标识符应该直观,可以望文知意,尽量使用英文单词组合,不要使用拼音;
  • 标识符长度要符合“min-length&max-information”原则,长度尽可能短,信息尽可能多
  • 变量名字尽可能使用“名词”或“形容词+名词”形式,尽量避免出现数字;函数名尽量使用“动词+名词”
  • 可借鉴的命名规则:
    • 匈牙利命名法:开头字母用变量类型缩写,其余部分用变量的英文或者英文缩写,要求第一个字母大写,如int iMyAge;
    • Camel(驼峰)命名法:第一个单词首字母小写,后面单词首字母大写,如int myAge;
    • Pascal命名法:每个单词的第一个字母都大写,如int MyAge;

C++的关键字

变量与常量

变量

  • 变量就是在程序运行过程中,值可以改变的量;
  • 变量在程序的执行中可以进行赋值造作,发生变化;
  • 变量有一个名字,并在使用之前要说明其类型,一经说明,就在内存中占据与其类型相应的存储单元;

变量定义:

  • 首先是类型说明符,随后紧跟一个或者多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束:int m = 1,n = 1;
  • 当变量在创建时获得了一个特定的值,我们说这个变量被初始化了。用于初始化变量的值可以是任意复杂的表达式;
  • 当一次定义了一个或多个变量时,变量的名字随着定义就可以使用了,如:int m=1,n=1; int sum = m + n;

常量

  • 在程序运行过程中,其值一直保持不变的量为常量;
  • 常量也区分不同的数据类型;

常量在C++中有两种定义的方法:

  1. 使用#define,如:#define PI 3.14
  2. 使用const,如:const double PI = 3.14

尽量使用const形式定义变量,因为#define不会出现在编译时期,在编译出错时不容易排错。define是C语言时期的习惯。

宏定义 const
宏定义相当于字符替换 常量声明
预处理器处理 编译器处理
无安全类型检查 有安全类型检查
不分配内存 分配内存
存储在代码段 存储在数据段
可以通过#undef取消 不可取消

整数常量

整数常量可以是十进制、八进制或者十六进制的常量:

  • 前缀指定基数:0x或者0X表示十六进制,0表示八进制,不带前缀则默认十进制;
  • 整数常量也可以带一个后缀,后缀是U和L的组合,U表示无符号整数,L表示长整数。后缀可以是大写也可以小写,不区分顺序。后缀不能重复。

布尔常量

布尔常量共有两个,他们都是C++关键字,true代表真,false代表假。

字符常量

  • 字符常量是括在单引号中的。如果常量以L(仅当大写时)开头,则表示宽字符常量(如L'x'),此时必须保存在wchar_t类型的变量中;否则就是窄字符常量(如'x'),此处可以存储在char类型的简单变量中;
  • 字符常量可以是一个普通字符('x')、一个转义序列('\t')、或者一个通用字符('\u02C0')。
  • 需要表达一些符号的时候需要用到转义字符;

常见转义字符如下:

转义字符 含义
\\\ \ 字符
\' '字符
\" "字符
\? ?字符
\a 警报铃
\b 退格键
\f 换页符
\n 换行符
\r 换行符
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh... 一个或多个数字的十六进制数

C++概况

C++语言应用广泛,凡是要求大型的、对性能要求很高的程序,以及物联网应用上,都会用到C++语言。

C++历史

  • C++编程语言可追溯到1979年,Bjarne Stroustrup创立了带类的C,这就是C语言的超集。1983年,这个语言被命名为C++;
  • C++最开始仅仅是C语言的增强版,但是后来又引入了很多功能。1998年伴随着STL标准库的诞生,一堆新功能和特性的产生,C++标准委员会发布了第一个国际标准C++ + ISO/IEC 1488:称为C++ 98;
  • 2011年中期,C++标准(被称作C++ 11)完成了新的标准。Boost库项目对新标准产生了相当大的影响,一些新模块直接从响应的Boost库中派生出来;
  • C++ 11之后,每三年C++都会发布新的语言标准,每一版都在基本保留向后兼容性的同时,提供着改进和新功能;

C++特点

优点:

  1. 强大的抽象封装能力:这让C++语言具备了强大的开发工程能力;
  2. 高性能:运行快,占用资源少;
  3. 低功耗:特别适合在各种微型嵌入式设备中高效运行程序;

缺点:

  1. 语法相对复杂,细节比较多;
  2. 需要一些好的规范和范式,否则代码很难维护;

C++的应用

  • 大型桌面应用程序(如Google Chrome、Miscrosoft Office)
  • 大型网站的后台(Google的搜索引擎)
  • 游戏和游戏引擎(Unity)
  • 视觉库和AI引擎(Opencv和Tensorflow)
  • 数据库(Mircrosoft SQL Server)
  • 嵌入式领域

总的来说,在开发成本比较高,对于内存和CPU要求很高,低功耗并且程序被调用非常频繁等场景中,目前C++是最合适的语言。

Hexo博客要求必须使用Github风格的Markdown语言编辑。所以需要了解具体的编写格式。

一、编辑器

市面上有很多的Markdown编辑器,之前很多人喜欢用Typora,但目前这个已经没有免费版可以用了。干脆直接用VSCode。

使用VSCode需要下载两个插件,第一个是【Markdown All in One】,是一个组合包,把最常用的markdown优化都安装好;第二个是【Markdown Preview Github Styling】,是Github使用的Markdown渲染样式。使用这个样式,在本地就能预览Markdown文件最终在Github Pages中显示的效果。

二、常用语法

标题

利用#设置标题,一个表示一级,两个表示二级,依次类推

1
2
3
#      一级标题
## 二级标题
……………… 以此类推

引用

利用>可以创建引用块

文本高亮

利用一组反引号`来把文本包起来。

1
`这里面是需要高亮的字符`

代码块

利用三个反引号`把内容扩起来即可。在上面的那个反引号后面还可以加上语言名称来进行自适应。

斜体

可以用一组*号来把文字包起来,也可以直接用快捷键Ctrl+I

加粗

k可以用一组**来把文字包起来,也可以用快捷键Ctrl+B

删除线

用一组~~把文字包起来

下划线

下划线可以用<u> </u>把文字包起来

按键效果

可以用一组<kbd> </kbd>把文字包起来,实现按键效果。

列表

列表分为有序列表和无序列表

1
2
3
4
5
6
7
无序列表:用-加空格
- 第一
- 第二

有序列表:用数字加.加空格
1. 第一
2. 第二

三、链接与图片

图片其实是一种超链接,所以把图片归类为链接里面。

1、跳转链接

普通的网站跳转都属于跳转链接,语法很简单:

1
[网站说明](跳转链接)

2、图片链接

图片链接的markdown语法和跳转链接类似:

1
![](图片链接)

3、图片存储

网上很多教程都是利用相对路径来存储图片,操作如下: 1. 安装图片插件

1
npm install hexo-asset-image --save

  1. _config.yml配置文件中,修改为 post_asset_folder: true

其中第二步可以忽略,第二步的意义在于我们新建文章的时候,会在soruce目录下生成文章同名文件夹供我们存储图片,我们也可以手动创建文件夹。

但是对于GitPages或者云服务器来说,其提供的免费存储空间都是有上限的,这样操作只适用于图片较少的情况。我们可以利用云服务器对象存储功能实现图床。

我的域名使用的是腾讯的,那就用腾讯的COS来操作,并且腾讯提供可视化工具COSBrowser,很方便。 参考博客: Hexo 博客图片添加至图床---腾讯云COS图床使用

一个图片测试:

四、公式

公式使用的是Latex语法。但需要注意,Hexo并不支持Laxte语法,所以我们需要开启相关的开关。有些主题就自带这个功能。 Markdown使用$包裹实现行内公式,使用$$包裹实现行间公式。 Latex语法可以不掌握,借助工具即可: HostMath 不过Hexo显示数学公式还需要一些其他设置,Hexo默认使用 hexo-renderer-marked 引擎渲染网页,该引擎会把一些特殊的 markdown 符号转换为相应的 html 标签,导致公式不显示。

五、表格

1
2
3
4
5
6
|     1   |      T2       |  T3   |
|----------|:-------------:|------:|
| 1 | 1 | 1 |
| 22 | 22 | 22 |
| 333 | 333 | 333 |

1 T2 T3
1 1 1
22 22 22
333 333 333

------表示左对齐,:------:表示居中,-----:表示右对齐 Hexo的表格必须和正文之间有空行,否则不能正常显示

六、流程图

Hexo里流程图限制多多,直接在其他软件画完截图吧。我也懒得学了。【流汗黄豆】

七、特殊字符

常见转义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
! &#33; — 惊叹号 Exclamation mark
” &#34; &quot; 双引号 Quotation mark
# &#35; — 数字标志 Number sign
$ &#36; — 美元标志 Dollar sign
% &#37; — 百分号 Percent sign
& &#38; &amp; Ampersand
‘ &#39; — 单引号 Apostrophe
( &#40; — 小括号左边部分 Left parenthesis
) &#41; — 小括号右边部分 Right parenthesis
* &#42; — 星号 Asterisk
+ &#43; — 加号 Plus sign
< &#60; &lt; 小于号 Less than
= &#61; — 等于符号 Equals sign
- &#45; &minus; — 减号
> &#62; &gt; 大于号 Greater than
? &#63; — 问号 Question mark
@ &#64; — Commercial at
[ &#91; --- 中括号左边部分 Left square bracket
\ &#92; --- 反斜杠 Reverse solidus (backslash)
] &#93; — 中括号右边部分 Right square bracket
{ &#123; — 大括号左边部分 Left curly brace
| &#124; — 竖线Vertical bar
} &#125; — 大括号右边部分 Right curly brace

八、hexo模板

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
89
90
91
# !!!!!!!!!!
# 每一项的 : 后面均有一个空格
# 且 : 为英文符号
# !!!!!!!!!!

title:
# 文章标题,可以为中文

date:
# 建立日期,如果自己手动添加,请按固定格式
# 就算不写,页面每篇文章顶部的发表于……也能显示
# 只要在主题配置文件中,配置了 created_at 就行
# 那为什么还要自己加上?
# 自定义文章发布的时间

updated:
# 更新日期,其它与上面的建立日期类似
# 不过在页面每篇文章顶部,是更新于……
# 在主题配置文件中,是 updated_at

permalink:
# 若站点配置文件下的 permalink 配置了 title
# 则可以替换文章 URL 里面的 title(文章标题)

categories:
# 分类,支持多级,比如:
# - technology
# - computer
# - computer-aided-art
# 则为 technology/computer/computer-aided-art
# (不适用于 layout: page)

tags:
# 标签
# 多个可以这样写 [标签1,标签2,标签3]
# (不适用于 layout: page)

description:
# 文章的描述,在每篇文章标题下方显示
# 并且作为网页的 description 元数据
# 如果不写,则自动取 <!-- more -->
# 之前的文字作为网页的 description 元数据

keywords:
# 关键字,并且作为网页的 keywords 元数据
# 如果不写,则自动取 tags 里的项
# 作为网页的 keywords 元数据

comments:
# 是否开启评论
# 默认值是 true
# 要关闭写 false

layout:
# 页面布局,默认值是 post,默认值可以在
# 站点配置文件中修改 default_layout
# 另:404 页面可能用到,将其值改为 false

type:
# categories,目录页面
# tags,标签页面
# picture,用来生成 group-pictures
# quote?
# https://io-oi.me/tech/test/

photos:
# Gallery support,用来支持画廊╱相册,用法如下:
# - photo_url_1
# - photo_url_2
# - photo_url_3
# https://io-oi.me/tech/test/

link:
# 文章的外部链接
# https://io-oi.me/tech/test/

image:
# 自定义的文章摘要图片,只在页面展示,文章内消失
# 此项只有参考本文 5.14 节配置好,否则请勿添加!

sticky:
# 文章置顶
# 此项只有参考本文 5.15 节配置好,否则请勿添加!

password:
# 文章密码,此项只有参考教程:
# http://shenzekun.cn/hexo的next主题个性化配置教程.html
# 第 24 节,配置好,否则请勿添加!
# 发现还是有 bug 的,就是右键在新标签中打开
# 然后无论是否输入密码,都能看到内容

由于Hexo属于静态博客,文章内容都是本地存储,只有静态页面(public文件夹)会push到git上面。如果我们更换电脑的话,配置相同的环境、依赖和博客文件,如果用U盘拷贝就太low了。所以我们可以利用Github远程仓库来实现多台终端的博客更新部署。

主要思路是利用git的分支,把静态博客页面文件放在master主分支,把hexo的部署环境文件和博客原文放在新建的Hexo分支上。

# 一、Hexo的原理和依赖

1、环境

Hexo需要有Node.js环境和Git环境,这在哪个电脑都必须有的。

2、资源配置依赖

首先要安装Hexo

1
npm install -g hexo-cli 

hexo所需要的包信息都已经存储在package.json文件中了,我们可以直接利用这个文件,执行命令行安装所需资源:

1
npm install

3、博客内容

博客的内容主要就是主题文件和博客文件

  • node_modules: hexo所需要的文件,这个文件不需要上传git
  • themes:主题文件
  • source:博文的md文件
  • public:生成的静态页面,这个一般都clean掉
  • _config.yml:全局配置文件
  • .gitignore:hexo自动生成的,里面一般会记录node_modules,我们不许要改,这个文件就会被忽略掉

二、Git仓库修改

对我们之前创建的username.github.io仓库,创建一个新的hexo分支,并在仓库->Settings->Branches->Default branch中把这个分支设置为默认分支。clone到本地,此时本地应该是Hexo分支。

之后我们把我们之前写的博客目录下的文件,全部拷贝到这个本地仓库中【注意要把之前themes目录中的.git文件删掉。因为一个git目录下不能有另一个git仓库。如果我们需要更新主题文件,只能把主题clone到本地后进行拷贝覆盖】。然后提交git到Hexo分支:

1
2
3
git add .
git commit -m 'update'
git push

此时我们观察github,可以看到,master分支里面保存着静态博客资源(在_config.yml中的Deployment配置的),Hexo分支备份博客部署文件,供我们维护更新。两者在一个仓库中互不干扰。

三、新的提交操作

目前我们在写博客时,就要在提交前做git更新了

1
2
3
4
5
6
7
8
9
10
11
git pull     //提交前最好更新最新


git add .
git commit -m 'update'
git push


hexo clean
hexo g
hexo d

Hexo是一个快速,简单而强大的博客框架,使用Markdown语言编写文章,Hexo可以在几秒钟内生成具有美丽主题的静态页面文件。

一、环境搭建

1、Node.js

Node.js是基于Chrome JavaScript运行时建立的一个平台,npm是node.js的包管理工具。Hexo是基于Node.js的,使用Hexo搭建博客,就需要本地有Node.js环境。Node.js环境点击这里,一路next。安装完成后可以用命令行查看版本号。

1
2
3
node -v //查看node.js的版本

npm -v //查看包管理器的版本

由于国内环境使用npm速度感人,可以安装cnpm,把镜像源换成淘宝的

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

之后可以命令行输入cnpm,如果能打出帮助界面表示安装成功。

2、Git

git的相关配置不在此赘述。hexo的很多操作都要依赖于git

3、Hexo

Hexo依托于npm包管理器,我们可以直接下载

1
cnpm install -g hexo-cli
-g命令是在全局安装Hexo命令行工具。当安装完成后,我们可以查看hexo版本来检查是否安装成功
1
hexo -v    //查看Hexo版本

二、博客搭建

首先我们新建一个存放博客的文件目录。之后我们的操作全部在此目录下。如果之后我们搭建错误想要从头再来,直接删掉这个目录新建一个即可。

然后我们初始化hexo

1
hexo init
初始化后,文件目录下面就会自动生成hexo的基础框架,后续博客都是基于这个框架来做。

之后安装hexo的依赖组件

1
cnpm install

目前目录下面有如下几个部分:

  • node_modules:存的是利用【npm install --save】下载安装的组件
  • scaffolds:存放模板文件,可以创建post、page、draft三种页面
  • source:存放用户资源,即我们的待发布文档
  • themes:存放主题文件夹,默认landspace
  • _config.yml:此文件很重要,是我们网站的配置信息
  • package.json:应用程序的信息

此时会自动生成一篇Helloworld的博客,我们可以启动博客来看看效果。

1
2
3
hexo clean      //清空缓存,即清空我们的public文件夹
hexo g //hexo generate命令,在本地生成静态页面,即pubilc文件夹
hexo s //hexo server命令,开启本地服务器,可供我们本地预览
本地服务器开启后,我们可以访问localhost:4000来本地预览,输入Ctrl+C关闭本地服务器

三、写博客

1
2
3
4
5
6
7
hexo n "第一篇文章"
//hexo new [layout] <title>
//hexo new命令,不设置layout会根据_config.yml中的default_layout在source\\_posts目录下生成一篇博客文章
//如果标题包含空格,使用引号括起来

//-p 自定义路径
hexo new page --path about/me "About me"

生成博客还是老三样

1
2
3
hexo clean
hexo g
hexo s

四、部署到github

执行完上述步骤,我们的博客只能在本地看,我们必须部署到网上才能通过网络来看。Github提供GitPages免费站点服务,自带域名和1G免费空间,存放博客资源和网页信息足够。

git本地配置和ssh公钥配不再赘述

1、新建git仓库

要注意仓库名必须要符合规则,即【用户名.github.io】格式。git会跟进这个仓库来创建域名。

2、hexo配置git插件

1
cnpm install --save hexo-deployer-git

安装完成后我们需要修改_config.yml文件中的Deployment信息(最下面)

1
2
3
4
deploy:
type: git
repo: git@github.com:Liuqianci/Liuqianci.github.io.git
branch: master

3、部署远端

在之前的基础上,可以把本地文章部署到远端了

1
2
3
4
5
hexo clean
hexo g
hexo s

hexo d //hexo deploy命令,部署远端

此时我们的github仓库就有内容了,我们也可以输入域名直接访问我们的博客。

五、自定义域名

虽然gitpages给我们提供了一个域名,但是我们还可以自己申请一个属于自己的域名。我绑定的是腾讯的域名。

在腾讯云里申请域名,此流程很快。

域名申请下来后,需要绑定我们的博客网站。在腾讯云的控制台上进行域名解析。一般解析两条,A对应IP,CNAME对应域名。我们博客的IP,直接ping我们博客的域名即可。

域名解析完成后,我们要进行域名绑定,在source目录下新建一个CNAME文件,写入自己的域名。然后在GitPages上也进行配置,进入Github的settings中,添加GitPages的Custom Domain为我们的自定义域名。我们可以勾选Enforce HTTPS来开启https

最后在_config.yml的url选项中填写我们的自定义域名。完成发布。