与我而言,建立个人博客存在的意义有两个。
一方面,当作自己的备忘录,记录零散的知识点,避免重复的搜索工作;
另一方面,可以更好的分享一些自己的心得,方便与大家交流。
选择GitHub_Hexo_Next
的组合的主要原因就是方便、便宜、简单,为从来没有接触过前端的自己降低难度。
为了能让博客漂亮一点,这几天来的折腾过程记录整理在此,以备遗忘。
因为优化后的个人博客中有写自定义语法,所以写作辅助小节的样式展示不完全正确,可以移步
好望角。如果转载,请转载个人博客地址(好望角)中原文。
我的环境是win10系统,经过一下步骤可以构建好一个运行在本地的静态博客(电脑不能占用localhost:4000端口)
node -v
、 npm -v
。shift
单击右键点击‘在此处打开Powershell’npm install -g hexo-cli
hexo init blog
hexo new 我就是试试博客搭建好没
hexo g
hexo s
要想将本地博客部署到gitpages上,按照下面步骤操作即可。
git config --global user.name "你的GitHub用户名"
git config --global user.email "你的GitHub注册邮箱"
ssh-keygen -t rsa -C "你的GitHub注册邮箱"
,中间不需要设置什么,直接三个回车。ssh [email protected]
验证是否配置成功。如果出现Hi 你的用户名!You've successfully authenticated ,,,bala,,,Connection to github.com closed
证明连接成功,以后推送的时候只需第一次输入密码,以后直接推送即可。deploy:
type: git
repo: https://github.com/OnlyChristmas/OnlyChristmas.github.io.git # 你的代码仓库地址,记得后面加上`.git`
branch: master
npm install hexo-deployer-git --save
hexo clean
hexo g
hexo d
具体操作可以参考这里/
npm install hexo -g #安装Hexo
npm update hexo -g #升级
hexo init #初始化博客
# 主要命令的含义以及简写
hexo n "我的博客" == hexo new "我的博客" #新建文章
hexo g == hexo generate #生成
hexo s == hexo server #启动服务预览
hexo d == hexo deploy #部署
# 可能用到的设置命令
hexo server #Hexo会监视文件变动并自动更新,无须重启服务器
hexo server -s #静态模式
hexo server -p 5000 #更改端口
hexo server -i 192.168.1.1 #自定义 IP
hexo clean #清除缓存,若是网页正常情况下可以忽略这条命令
图片是博客必不可少的一部分,但它们会造成加载缓慢。所以对于我们严肃的技术博客来说,就要少贴图,多敲代码,哈哈~。
但是偶尔也是要贴几张图,才能说得更明白,这个时候推荐使用七牛云的外链,来提高速度。
虽然我们是个严肃的技术博客,要有学术风格(就是丑!),但也不能太丑吧!?所以我这里换用Next主题,配置方式如下。当然也有更多的漂亮主题可供挑选,只是在配置的时候如是出现问题,更难解决,新手慎用。
在blog文件夹下的shell中输入,下载主题文件。
git clone https://github.com/iissnan/hexo-theme-next themes/next
然后在 站点配置文件 配置如下信息:
# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
# theme: landscape
theme: next
优化虽好,可不要贪多哦。全打开的话网页加载会很慢。。。
# Schemes
# scheme: Muse
# scheme: Mist
# scheme: Pisces
scheme: Gemini
首先在 algolia 注册账号。此处优化需注意,官方文档不够完善。
创建APIKey HEXO_ALGOLIA_INDEXING_KEY
进入Algolia的API Keys页面ALL API KEYS选项卡
创建APIKey
也就是说,我们有两个APIKey,其中一个是Search-only API Key(我们后面需要进行用它配置),另一个是HEXO_ALGOLIA_INDEXING_KEY(新建好即可)。
具体的配置步骤如下:
在 站点配置文件 中需要添加
algolia:
applicationID: # Application ID
apiKey: # Search-only API Key
indexName: # 此处选择之前创建的Index
chunkSize: 5000
```
algolia_search:
enable: true
hits:
per_page: 10
labels:
input_placeholder: Search for Posts
hits_empty: “不好意思,木有’ q u e r y ′ 的 搜 索 结 果 ? " h i t s s t a t s : " {query}'的搜索结果?" hits_stats: " query′的搜索结果?"hitsstats:"{hits} results found in ${time} ms”
```
接下来,我采取的配置方法和官方文档有点出入,但是亲测有效(我是win10系统)。
1. 在博客文件夹根目录右键打开git bash here
2. export HEXO_ALGOLIA_INDEXING_KEY= 'Search-only API Key'
3. hexo algolia
bash中出现类似提示说明配置成功
INFO [Algolia] Identified 6 pages and posts to index.
INFO [Algolia] Indexing chunk 1 of 1 (50 items each)
INFO [Algolia] Indexing done.
# Canvas-nest
canvas_nest: true # 背景有降落伞
# three_waves
three_waves: false # 背景有像海浪一样的小球球
# canvas_lines
canvas_lines: false # 背景有立体蜘蛛网
# canvas_sphere
canvas_sphere: false # 屏幕中央有一个爆炸状的球球
highlight:
enable: true
line_number: true
auto_detect: true
tab_replace: true
注意,网上的自定义样式优化代码中,有对代码块的优化,那部分代码需要注释掉。
npm install --save hexo-generator-feed
# Extensions
## Plugins: http://hexo.io/plugins/
#RSS订阅
plugin:
- hexo-generator-feed
#Feed Atom
feed:
type: atom
path: atom.xml
limit: 20
hub:
content:
content_limit: 140
content_limit_delim: ' '
# Set rss to false to disable feed link.
# Leave rss as empty to use site's feed link.
# Set rss to specific value if you have burned your feed already.
rss: "/atom.xml"
./public
中看到atom.xml
说明生成成功。/themes/next/layout/_macro/post.swig
,搜索 rel="tag">#
,将 # 换成
,当然也可以切换成任何你喜欢的小图标。在 主题配置文件 中搜索并配置如下信息,也可以根据自己的喜欢修改其他配置。
# Show PV/UV of the website/page with busuanzi.
# Get more information on http://ibruce.info/2015/04/04/busuanzi/
busuanzi_count:
# count values only if the other configs are false
enable: true
# custom uv span for the whole site
site_uv: true
site_uv_header: 你是第
site_uv_footer: 个小伙伴
# custom pv span for the whole site
site_pv: true
site_pv_header: 总访问
site_pv_footer: 人次
# custom pv span for one page only
page_pv: false
page_pv_header:
page_pv_footer:
# Show number of visitors to each article.
# You can visit https://leancloud.cn get AppID and AppKey.
leancloud_visitors:
enable: true
app_id: #
app_key: #
/themes/next/layout/_macro/post.swig
,我的代码修改成如下样子,也可以自由发挥。 {# LeanCould PageView #}
{% if theme.leancloud_visitors.enable %}
℃
{% endif %}
{% if theme.post_meta.item_text %}
{% endif %}
/themes/next/languages/zh-Hans.yml
,可以任意修改文字信息,我的代码如下所示:post:
created: 创建于
modified: 更新于
sticky: 置顶
posted: '发表于:'
in: '类别:'
read_more: 阅读全文
untitled: 未命名
toc_empty: 此文章未包含目录
visitors: 热度
$ npm install hexo-wordcount --save
# Post wordcount display settings
# Dependencies: https://github.com/willin/hexo-wordcount
post_wordcount:
item_text: true
wordcount: true
min2read: false
totalcount: true
separated_meta: true
这里我遇到一个大坑,在正文中写``标签一定要用代码块包括,否则可能会造成wordcount无法正常统计字数!一直显示为0
在github手动添加readme文件总是会被擦掉,会很麻烦,现在有两种解决方法。
/blog/source
中添加一个README.MDOWN
文件,每次推送到github都可以正常解析。skip_render: README.md
favicon:
# small: /images/favicon-16x16-next.png
# medium: /images/favicon-32x32-next.png
# apple_touch_icon: /images/apple-touch-icon-next.png
# safari_pinned_tab: /images/logo.svg
small: # 你的图像
medium: # 你的图像
apple_touch_icon: # 你的图像
safari_pinned_tab: # 你的图像
#android_manifest: /images/manifest.json
#ms_browserconfig: /images/browserconfig.xml
# Progress bar in the top during page loading.
pace: true
# Themes list:
#pace-theme-big-counter
#pace-theme-bounce
#pace-theme-barber-shop
#pace-theme-center-atom
#pace-theme-center-circle
#pace-theme-center-radar
#pace-theme-center-simple
#pace-theme-corner-indicator
#pace-theme-fill-left
#pace-theme-flash
#pace-theme-loading-bar
#pace-theme-mac-osx
#pace-theme-minimal
# For example
# pace_theme: pace-theme-center-simple
pace_theme: pace-theme-minimal
footer:
# Specify the date when the site was setup.
# If not defined, current year will be used.
since: 2018
# Icon between year and copyright info.
icon: heart
# If not defined, will be used `author` from Hexo main config.
copyright:
# -------------------------------------------------------------
# Hexo link (Powered by Hexo).
powered: false
theme:
# Theme & scheme info link (Theme - NexT.scheme).
enable: false
# Version info of NexT after scheme info (vX.X.X).
version: true
/blog/scaffolds/
中新建了一个next博文模板,代码如下:---
title: {{ title }}
date: {{ date }}
comments: true
categories: NLP
tags: [tag1, tag2]
post_copyright: true
---
This is a summary
#### Writing
new_post_name: :title.md # File name of new posts
default_layout: next
npm install hexo-generator-sitemap --save-dev
hexo d -g
npm install hexo-generator-baidu-sitemap --save-dev
hexo d -g
# SEO 优化
sitemap:
path: sitemap.xml
baidusitemap:
path: baidusitemap.xml
User-agent: * Allow: /
Allow: /archives/
Disallow: /vendors/
Disallow: /js/
Disallow: /css/
Disallow: /fonts/
Disallow: /vendors/
Disallow: /fancybox/
Sitemap: http://thief.one/sitemap.xml
Sitemap: http://thief.one/baidusitemap.xml
# Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEO
baidu_push: true
# Google Analytics
google_analytics: # 你的账号
先注册gitment,这是作者博客,按照官方文档搭建即可
# Gitment
# Introduction: https://imsun.net/posts/gitment-introduction/
# You can get your Github ID from https://api.github.com/users/
gitment:
enable: true
mint: true # RECOMMEND, A mint on Gitment, to support count, language and proxy_gateway
count: false # Show comments count in post meta area
lazy: false # Comments lazy loading with a button
cleanly: false # Hide 'Powered by ...' on footer, and more
language: # Force language, or auto switch by theme
github_user: OnlyChristmas # MUST HAVE, Your Github ID
github_repo: OnlyChristmas.github.io # MUST HAVE, The repo you use to store Gitment comments
client_id: 8fc5c43242323koljoa # MUST HAVE, Github client id for the Gitment
client_secret: 4ff9a214325312515151b04c400d46 # EITHER this or proxy_gateway, Github access secret token for the Gitment
proxy_gateway: # Address of api proxy, See: https://github.com/aimingoo/intersect
redirect_protocol: # Protocol of redirect_uri with force_redirect_protocol when mint enabled
优化虽好,可不要贪多哦。全打开的话网页加载会很慢。。。
next内置的代码在服务器升级https之后,百度分享的js请求不了。但是在 github上的轮子 可以修改后再其启用这一功能。
/themes/next/source/
目录下。themes/next/layout/_partials/share/baidushare.swig
中末尾处的代码进行替换。前面是原有代码,下面是替换的代码。
hexo g
再hexo s
,否则可能会出现问题。在next\source\js\src
下新建脚本custom_title.js
,将下面代码复制进去。 js脚本来源
var OriginTitle = document.title;
var titleTime;
document.addEventListener('visibilitychange', function () {
if (document.hidden) {
$('[rel="icon"]').attr('href', "/img/TEP.ico");
document.title = '╭(°A°`)╮ 爱我别走 ~';
clearTimeout(titleTime);
}
else {
$('[rel="icon"]').attr('href', "/favicon.ico");
document.title = '(ฅ>ω<*ฅ) 这才对嘛~' + OriginTitle;
titleTime = setTimeout(function () {
document.title = OriginTitle;
}, 2000);
}
});
在next\layout\_layout.swig
的
标签体内添加
在/themes/next/source/js/src/
中新建love.js
,其中写入的代码如下。
!function(e,t,a){function r(){for(var e=0;e
在/themes/next/layout/_layout.swig
中的标签体内添加下面代码。
/themes/next/source/js/src/
中新建fireworks.js
,其中写入的代码如下。 "use strict";function updateCoords(e){pointerX=(e.clientX||e.touches[0].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[0].clientY-canvasEl.getBoundingClientRect().top}function setParticuleDirection(e){var t=anime.random(0,360)*Math.PI/180,a=anime.random(50,180),n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function createParticule(e,t){var a={};return a.x=e,a.y=t,a.color=colors[anime.random(0,colors.length-1)],a.radius=anime.random(16,32),a.endPos=setParticuleDirection(a),a.draw=function(){ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.fillStyle=a.color,ctx.fill()},a}function createCircle(e,t){var a={};return a.x=e,a.y=t,a.color="#F00",a.radius=0.1,a.alpha=0.5,a.lineWidth=6,a.draw=function(){ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,0,2*Math.PI,!0),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=1},a}function renderParticule(e){for(var t=0;t
/themes/next/layout/_layout.swig
中的
标签体内添加下面代码。
{% if theme.fireworks %}
{% endif %}
# Fireworks 鼠标点击烟花爆炸
fireworks: true
themes/next/source/css/_custom/custom.styl
中,添加如下代码// 鼠标样式
* {
cursor: url("http://om8u46rmb.bkt.clouddn.com/sword2.ico"),auto!important
}
:active {
cursor: url("http://om8u46rmb.bkt.clouddn.com/sword1.ico"),auto!important
}
怎么生成歌单的外链看这里
然后将生成的代码加入到想要放入的位置就好了(适当调整大小)。
themes/next/layout/_layout.swig
文件中,
的下面,并且记得herf
改为自己的github地址。.\themes\next\source\js\src\
目录下。.\themes\next\source\js\src\
目录下,创建clipboard-use.js
,文件内容如下:/*页面载入完成后,创建复制按钮*/
!function (e, t, a) {
/* code */
var initCopyCode = function(){
var copyHtml = '';
copyHtml += '';
$(".highlight .code pre").before(copyHtml);
new ClipboardJS('.btn-copy', {
target: function(trigger) {
return trigger.nextElementSibling;
}
});
}
initCopyCode();
}(window, document);
.\themes\next\source\css\_custom\custom.styl
样式文件中添加下面代码://代码块复制按钮
.highlight{
//方便copy代码按钮(btn-copy)的定位
position: relative;
}
.btn-copy {
display: inline-block;
cursor: pointer;
background-color: #eee;
background-image: linear-gradient(#fcfcfc,#eee);
border: 1px solid #d5d5d5;
border-radius: 3px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-appearance: none;
font-size: 13px;
font-weight: 700;
line-height: 20px;
color: #333;
-webkit-transition: opacity .3s ease-in-out;
-o-transition: opacity .3s ease-in-out;
transition: opacity .3s ease-in-out;
padding: 2px 6px;
position: absolute;
right: 5px;
top: 5px;
opacity: 0;
}
.btn-copy span {
margin-left: 5px;
}
.highlight:hover .btn-copy{
opacity: 1;
}
.\themes\next\layout\_layout.swig
文件中,添加引用要在
标签内:
\themes\next\layout\_macro
文件夹中,新建passage-end-tag.swig
,并且写入如下代码(当然也可以自由发挥):
{% if not is_index %}
-------------本文结束 感谢您的时间-------------
{% endif %}
\themes\next\layout\_macro\post.swig
文件,在post-body
之后, post-footer
之前添加如下代码。(在我文件大约360的位置)
{% if not is_index %}
{% include 'passage-end-tag.swig' %}
{% endif %}
# 文章末尾添加“本文结束”标记
passage_end_tag:
enabled: true
in theme directory(source/images): # 你的头像
# in site directory(source/uploads): /uploads/avatar.gif
avatar: # 你的头像
\themes\next\source\css\_common\components\sidebar\sidebar-author.styl
,在里面添加如下代码:.site-author-image {
display: block;
margin: 0 auto;
padding: $site-author-image-padding;
max-width: $site-author-image-width;
height: $site-author-image-height;
border: $site-author-image-border-width solid $site-author-image-border-color;
/* 头像圆形 */
border-radius: 80px;
-webkit-border-radius: 80px;
-moz-border-radius: 80px;
box-shadow: inset 0 -1px 0 #333sf;
/* 设置循环动画 [animation: (play)动画名称 (2s)动画播放时长单位秒或微秒 (ase-out)动画播放的速度曲线为以低速结束
(1s)等待1秒然后开始动画 (1)动画播放次数(infinite为循环播放) ]*/
/* 鼠标经过头像旋转360度 */
-webkit-transition: -webkit-transform 1.0s ease-out;
-moz-transition: -moz-transform 1.0s ease-out;
transition: transform 1.0s ease-out;
}
img:hover {
/* 鼠标经过停止头像旋转
-webkit-animation-play-state:paused;
animation-play-state:paused;*/
/* 鼠标经过头像旋转360度 */
-webkit-transform: rotateZ(360deg);
-moz-transform: rotateZ(360deg);
transform: rotateZ(360deg);
}
/* Z 轴旋转动画 */
@-webkit-keyframes play {
0% {
-webkit-transform: rotateZ(0deg);
}
100% {
-webkit-transform: rotateZ(-360deg);
}
}
@-moz-keyframes play {
0% {
-moz-transform: rotateZ(0deg);
}
100% {
-moz-transform: rotateZ(-360deg);
}
}
@keyframes play {
0% {
transform: rotateZ(0deg);
}
100% {
transform: rotateZ(-360deg);
}
}
/themes/next/layout/_partials/footer.swig
文件尾部加上,并且修改你的上线时间。载入天数...载入时分秒...
在daovoice注册账号可以得到 app_id
在 主题配置文件 中添加如下配置
# Online contact
daovoice: true
daovoice_app_id: # 这里填你刚才获得的 app_id
/themes/next/layout/_partials/head.swig
,添加如下代码:
{% if theme.daovoice %}
{% endif %}
hexo n page top
新建页面,编辑自动生成的index.md文件,代码如下,替换好你的leancloud账号和页面链接(一共三处)
themes\next\source\css_schemes\你设置的主题\index.styl
文件中搜索background
,会出现五个结果,我这里只将前两个设置为none(透明)
,也可以根据需求设置更多的透明。// =================================================
// Desktop layout styles.
// =================================================
// Post blocks.
.content-wrap {
padding: initial;
background: none;
box-shadow: initial;
border-radius: initial;
}
// Post & Comments blocks.
.post-block {
padding: $content-desktop-padding;
background: none;
box-shadow: $box-shadow-inner;
border-radius: $border-radius-inner;
}
white
// =================================================
// < 767px
// =================================================
+mobile() {
// Posts in blocks.
.content-wrap {
padding: $content-mobile-padding;
background: white;
}
blog\themes\next\layout\_partials\header.swig
,在 ... /ul>
标签之间加入以下代码:
High一下
blog/source/
文件夹下新建404.html
并加入如下代码:
blog/package.json
中并列"dependencies": {}
添加如下代码: "scripts": {
"dev": "hexo clean && hexo generate && hexo server --debug"
}
npm run dev
一条命令就可以启动本地的调试环境blog/package.json
中 "dependencies": {}
后面平行的添加如下内容:"devDependencies": {
"gulp-asset-rev": "^0.0.15",
"gulp-clean-css": "^3.9.0",
"gulp-concat": "^2.6.1",
"gulp-debug": "^3.1.0",
"gulp-htmlclean": "^2.7.15",
"gulp-htmlmin": "^3.0.0",
"gulp-if": "^2.0.2",
"gulp-changed": "^3.1.0",
"gulp-make-css-url-version": "^0.0.13",
"gulp-modify-css-urls": "^0.2.2",
"gulp-plumber": "^1.1.0",
"gulp-uglify": "^3.0.0",
"gulp-useref": "^3.1.2",
"gulp-util": "^3.0.8",
"hexo-deployer-git": "^0.3.1",
"hexo-encrypt": "^0.5.1",
"hexo-generator-json-content": "^3.0.1",
"hexo-generator-search": "^2.1.1",
"hexo-generator-searchdb": "^1.0.8",
"hexo-server": "^0.2.2",
"run-sequence": "^2.2.0"
}
npm config set registry https://registry.npm.taobao.org
npm install
blog/gulpfile.js
中添加如下代码(没有的话则新建):/* npm install 超时请使用:(两条命令在当前文件目录下执行)
npm config set registry https://registry.npm.taobao.org
npm install
或者:
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install
*/
var gulp = require('gulp');
var debug = require('gulp-debug');
var cleancss = require('gulp-clean-css'); //css压缩组件
var cssversion = require('gulp-make-css-url-version'); //css资源添加版本号
var uglify = require('gulp-uglify'); //js压缩组件
var htmlmin = require('gulp-htmlmin'); //html压缩组件
var htmlclean = require('gulp-htmlclean'); //html清理组件
var assetRev = require('gulp-asset-rev'); //版本控制插件
var runSequence = require('run-sequence'); //异步执行组件
var changed = require('gulp-changed'); //文件更改校验组件
var gulpif = require('gulp-if') //任务 帮助调用组件
var plumber = require('gulp-plumber'); //容错组件(发生错误不跳出任务,并报出错误内容)
var isScriptAll = true; //是否处理所有文件,(true|处理所有文件)(false|只处理有更改的文件)
var isDebug = true; //是否调试显示 编译通过的文件
// 压缩js文件
gulp.task('compressJs', function () {
var option = {
// preserveComments: 'all',//保留所有注释
mangle: true, //类型:Boolean 默认:true 是否修改变量名
compress: true //类型:Boolean 默认:true 是否完全压缩
}
return gulp.src(['./public/**/*.js','!./public/**/*.min.js']) //排除的js
.pipe(gulpif(!isScriptAll, changed('./public')))
.pipe(gulpif(isDebug,debug({title: 'Compress JS:'})))
.pipe(plumber())
.pipe(uglify(option)) //调用压缩组件方法uglify(),对合并的文件进行压缩
.pipe(gulp.dest('./public')); //输出到目标目录
});
// 压缩css文件
gulp.task('compressCss', function () {
return gulp.src('./public/**/*.css')
.pipe(gulpif(!isScriptAll, changed('./public')))
.pipe(gulpif(isDebug,debug({title: 'Compress CSS:'})))
.pipe(plumber())
.pipe(cleancss({rebase: false}))
.pipe(gulp.dest('./public'));
});
// 压缩html文件
gulp.task('compressHtml', function () {
var cleanOptions = {
protect: /<\!--%fooTemplate\b.*?%-->/g, //忽略处理
unprotect: /