本文首發在個人我的博客:cherryblog.site/
歡迎你們前去參觀,順便求fork,麼麼噠~javascript
上一次在掘金上發表的hexo
高階教程:hexo高階教程next主題優化之加入網易雲音樂、網易雲跟帖、動態背景、自定義主題、統計功能,收到了很多朋友的喜歡,手動比心♪(^∀^●)ノ,也有很多朋友私信我給我提改進的意見,本着生命就是要折騰的原則,我又作了以下的優化: css
開始作這個博客的時候是想着記錄本身學習的過程,並無期望別人發現(本身比較菜,寫的都是一些基礎的東西,也沒有什麼特別nb的技巧值得炫耀〒▽〒),可是自從給博客增長了統計的功能以後,而且在掘金社區發佈以後,看着天天還有那麼百十號人來看看,心裏還有點小激動呢~[]~( ̄▽ ̄)~* html
酒香不敵巷子深
咱們要作對搜索引擎友好的站點
前端
因此我就在想,怎麼才能讓其餘小夥伴搜索到我寫的文章呢?因而就想到了對網站進行seo優化,這段時間也一直在作網站的seo優化,對於hexo生成的博客來講,代碼其實修改的並很少,主要是要多用心去給各個搜索引擎提交你的sitemap,讓搜索引擎的小蜘蛛多來你的站點,這樣別人在搜索東西的時候纔有更多的可能搜出你的文章,給你的網站帶來人氣~java
做爲一個前端工做者,對網站的優化確定仍是須要有不少的,奈什麼時候間基本都被工做佔用,因此就先把優化功能先放了放,只進行了代碼壓縮node
在這半個月的時間,對於hexo搭建搭建的我的博客,雖然沒有讓我對某一門語言的深度增長,可是卻讓我對整個建站流程的寬度增長了很多,優化是一件比寫出代碼的技術難度還要高的事情。git
推廣是一個煩人的事情啊喂,特別是對於咱們搞技術的來講,可能就不擅長推廣,那麼怎麼才能讓別人知道咱們呢,咱們就要想辦法讓別人經過搜索就能夠搜索到你博客的內容,給咱們帶來天然流量,這就須要seo優化,讓咱們的站點變得對搜索引擎友好github
SEO是由英文Search Engine Optimization縮寫而來, 中文意譯爲「搜索引擎優化」。SEO是指經過站內優化好比網站結構調整、網站內容建設、網站代碼優化等以及站外優化。web
咱們首先要作的就是讓各大搜索引擎收錄你的站點,咱們在剛建站的時候各個搜索引擎是沒有收錄咱們網站的,在搜索引擎中輸入site:<域名>
,若是以下圖所示就是說明咱們的網站並無被百度收錄。咱們能夠直接點擊下面的「網址提交」來提交咱們的網站
npm
登陸百度站長平臺:zhanzhang.baidu.com, 只要有百度旗下的帳號就能夠登陸,登陸成功以後在站點管理中點擊添加網站而後輸入你的站點地址,建議輸入的網站爲www開頭的,不要輸入github.io的,由於github是不容許百度的spider爬取github上的內容的,因此若是想讓你的站點被百度收錄,只能使用本身購買的域名
layout:false
,這樣就不會被hexo編譯。(若是驗證文件是txt格式的就不須要),其餘兩種方式也是很簡單的,我我的推薦文件驗證和cname驗證,cname驗證最爲簡單,只需加一條解析就好~
咱們須要使用npm自動生成網站的sitemap,而後將生成的sitemap提交到百度和其餘搜索引擎
npm install hexo-generator-sitemap --save
npm install hexo-generator-baidu-sitemap --save複製代碼
在根目錄配置文件中修改url爲你的站點地址
# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://cherryblog.site
root: /
permalink: :title.html
permalink_defaults:複製代碼
執行完以後就會在網站根目錄生成sitemap.xml文件和baidusitemap.xml文件,能夠經過www.cherryblog.site/baidusitema…
而後咱們就能夠將咱們生成的sitemap文件提交給百度,仍是在百度站長平臺,找到連接提交,這裏咱們能夠看到有兩種提交方式,自動提交和手動提交,自動提交又分爲主動推送、自動推送和sitemap
如何選擇連接提交方式
一、主動推送:最爲快速的提交方式,推薦您將站點當天新產出連接當即經過此方式推送給百度,以保證新連接能夠及時被百度收錄。
二、自動推送:最爲便捷的提交方式,請將自動推送的JS代碼部署在站點的每個頁面源代碼中,部署代碼的頁面在每次被瀏覽時,連接會被自動推送給百度。能夠與主動推送配合使用。
三、sitemap:您能夠按期將網站連接放到sitemap中,而後將sitemap提交給百度。百度會週期性的抓取檢查您提交的sitemap,對其中的連接進行處理,但收錄速度慢於主動推送。
四、手動提交:一次性提交連接給百度,可使用此種方式。
通常主動提交比手動提交效果好,這裏介紹主動提交的三種方法
從效率上來講:
主動推送>自動推送>sitemap
安裝插件npm install hexo-baidu-url-submit --save
而後再根目錄的配置文件中新增字段
baidu_url_submit:
count: 100 # 提交最新的一個連接
host: www.cherryblog.site # 在百度站長平臺中註冊的域名
token: 8OGYpxowYnhgVsUM # 請注意這是您的祕鑰, 因此請不要把博客源代碼發佈在公衆倉庫裏!
path: baidu_urls.txt # 文本文檔的地址, 新連接會保存在此文本文檔裏複製代碼
在加入新的deploye
deploy:
- type:baidu_url_submitter複製代碼
這樣執行hexo deploy
的時候,新的連接就會被推送了
在主題配置文件下設置,將baidu_push設置爲true:
# Enable baidu push so that the blog will push the url to baidu automatically which is very helpful for SEO
baidu_push: true複製代碼
而後就會將一下代碼自動推送到百度,位置是themes\next\layout_scripts\baidu_push.swig,這樣每次訪問博客中的頁面就會自動向百度提交sitemap
{% if theme.baidu_push %}
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
{% endif %}複製代碼
將咱們上一步生成的sitemap文件提交到百度就能夠了~
site:cherryblog.site
已經能夠搜索到結果
相比於百度,google的效率實在不能更快,貌似十分鐘左右站點就被收錄了,其實方法是和百度是同樣的,都是先驗證你的站點全部權,而後提交sitemap
google站點平臺:www.google.com/webmasters/…
除了百度和google兩大搜索引擎,還有搜狗、360等其餘的搜索引擎,流程都是同樣的
,你們就自行選擇添加哈,這裏就再也不贅述了~
seo搜索引擎優化認爲,網站的最佳結構是用戶從首頁點擊三次就能夠到達任何一個頁面,可是咱們使用hexo編譯的站點打開文章的url是:sitename/year/mounth/day/title四層的結構,這樣的url結構很不利於seo,爬蟲就會常常爬不到咱們的文章,因而,咱們能夠將url直接改爲sitename/title的形式,而且title最好是用英文,在根目錄的配置文件下修改permalink以下:
url: http://cherryblog.site
root: /
permalink: :title.html
permalink_defaults:複製代碼
seo優化應該說是一個收益延遲的行爲,可能你作的優化短時間內看不到什麼效果,可是必定要堅持,seo優化也是有很深的能夠研究的東西,從咱們最初的網站設計,和最基礎的標籤的選擇都有很大的關係,網站設計就如咱們剛剛說的,要讓用戶點擊三次能夠到達網站的任何一個頁面,要增長高質量的外鏈,增長相關推薦(好比說咱們常常見到右側本站的最高閱讀的排名列表),而後就是給每個頁面加上keyword和描述
在代碼中,咱們應該寫出能讓瀏覽器識別的語義化HTML,這樣有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來肯定上下文和各個關鍵字的權重;而且對外鏈設置nofollow標籤,避免spider爬着爬着就爬出去了(減小網站的跳出率),而且咱們要儘可能在一些比較大的網站增長咱們站點的曝光率,由於spider會常常訪問大站,好比咱們在掘金等技術社區發表文章中帶有咱們的站點,這樣spider是頗有可能爬到咱們中的站點的,so....
前面已經提到過一個慘絕人寰的消息,那就是github是不容許百度的爬蟲爬取內容的,因此咱們的項目若是是託管在github上的話基本是不會被百度收錄的,因此我又同時託管到了coding上,而後在作解析的時候海外的ip 指向到github,國內的或者說百度的直接指向coding
Coding 是一個面向開發者的雲端開發平臺[1] ,目前提供代碼託管,運行空間,質量控制,項目管理等功能。此外,還提供社會化協做功能,包含了社交元素,方便開發者進行技術討論和協做。
2016年3月CODING宣佈收購代碼託管平臺GitCafe。
以前好多小夥伴都是將項目託管在gitcafe上,可是如今gitcafe被coding收購了,因而就轉到coding上了,以前好多人說github的服務器在國外,因而就轉戰國內的coding了,我將代碼遷移至coding還有另一個緣由,github不讓百度的爬蟲爬取啊,讓我哭一會,否則也不會這樣折騰。coding就是中國版的github(只是打一個比喻),有提供pages服務。
首先咱們先要建立一個coding帳號而且在coding上建立一個項目,必需要是公開項目,私有項目是沒有page服務的,項目名稱能夠隨意起
第一次使用coding須要使用ssh,方法和以前github是同樣同樣的,將ssh公鑰複製到coding上
deploy:
type: git
message: [message]
repo:
github: <repository url>,[branch]
gitcafe: <repository url>,[branch]複製代碼
因此個人配置就是這樣的(我這個配置github和coding都有ssh和https兩種方式):
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo:
#github: git@github.com:sunshine940326/sunshine940326.github.io.git
github: https://github.com/sunshine940326/sunshine940326.github.io.git
coding: git@git.coding.net:cherry940326/cherry940326.git
#coding: https://git.coding.net/cherry940326/cherry940326.git複製代碼
完成以後在git bash 中輸入
ssh -T git@git.coding.net複製代碼
若是獲得如圖提示就說明配置成功了
將代碼上傳至coding以後咱們就要開啓pages服務了,在pages頁面咱們只須要將部署來源選擇爲master分支,而後將自定義域名填寫咱們本身購買的域名就能夠了
而後咱們到萬網下面設置咱們的域名解析,將默認ip解析到coding上(這裏要注意,解析到coding時記錄值是pages.coding.me,並無具體的帳號名或者倉庫名,而且只有設置完成域名解析才能夠在coding上設置自定義域名),將海外的ip解析到github上,設置以下:
至此就完成了將你的hexo編譯的博客同時部署在github和coding上
以前就想到了一個問題,若是我想要在公司寫博客怎麼辦,或者說若是我換電腦了怎麼辦,由於在github中的咱們github.io項目是隻有編譯後的文件的,沒有源文件的,也就是說,若是咱們的電腦壞了,打不開了,咱們的博客就不能進行更新了,因此咱們要把咱們的源文件也上傳到github上,這道題的解題思路(哈哈,忽然想到這個詞了)是,將咱們的源文件上傳至username.github.io的Hexo分支,而且設置爲默認分支(分支須要本身建立),而後對咱們的源文件進行版本管理,這樣咱們就能夠在另外一臺電腦上pull咱們的源碼,而後編譯完以後push上去。
更爲優雅的方式是使用travis-ci,而後用webhook自動部署。你只須要寫markdown,push到github就好了。根本不用關心deploy,只要維護你的markdown就行。詳情請參考:blog.bigruan.com/2015-03-09-…
建立兩個分支:master 與 Hexo,並將Hexo設置爲默認分支(這個Hexo分支就是存放咱們源文件的分支,咱們只須要更新Hexo分支上的內容據就好,master上的分支hexo編譯的時候會更新的)
由於有些主題是從git上clone過來的,因此咱們要先刪除.git緩存文件,不然會和blog倉庫衝突(.git默認是隱藏文件夾,須要先開啓顯示隱藏文件夾。.git文件夾被刪除後整個文件對應的git倉庫狀態也會被清空)
.gitignore文件做用是聲明不被git記錄的文件,blog根目錄下的.gitignore是hexo初始化帶來的,能夠先刪除或者直接編輯,對hexo不會有影響。建議.gitignore內添加如下內容:
/.deploy_git
/public
/_config.yml複製代碼
.deploy_git是hexo默認的.git配置文件夾,不須要同步
public內文件是根據source文件夾內容自動生成,不須要備份,否則每次改動內容太多
即便是私有倉庫,除去在線服務商員工能夠看到的風險外,還有云服務商被攻擊形成泄漏等可能,因此不建議將配置文件傳上去
而後咱們再初始化倉庫,從新對咱們的代碼進行版本控制
git init
git remote add origin <server>複製代碼
<server>
是指在線倉庫的地址。origin是本地分支,remote add操做會將本地倉庫映射到雲端
依次執行
git add .
git commit -m "..."
git push origin hexo複製代碼
提交網站相關的文件;
假設B電腦如今沒有咱們的源文件
git init
git remote add origin <server> #將本地文件和雲端倉庫映射起來。
git fetch --all
git reset --hard origin/master複製代碼
平時咱們對源文件有修改的時候記得先pull一遍代碼,再將代碼push到Hexo分支,就和平常的使用git同樣~
當你在你的博客頁面右鍵查看源代碼的時候,你會發現你的html頁面中會有大段大段的空白,這個時候咱們就要使用壓縮工具對咱們的代碼進行壓縮,在前一段時間參見的前端開發者大會(FDCon2017)中,攜程的框架式就有講到,在攜程,線上的資源是須要申請的(單位具體到k),因此說咱們的代碼不壓縮實在是太奢侈~
在2017年的前端中,gulp彷佛不是最流行的自動化工具,可是誰讓咱們公司用的是gulp呢。爲了能和公司用同樣的構建工具,因此我本身的博客也是使用的gulp。
gulp是前端開發過程當中對代碼進行構建的工具,是自動化項目的構建利器。不只能對網站的資源進行優化,而且能在開發過程當中可以對不少重複的任務使其自動完成。
能自動化地完成 javascript/coffee/sass/less/html/image/css 等文件的的測試、檢查、合併、壓縮、格式化、瀏覽器自動刷新、部署文件生成,並監聽文件在改動後重復指定的這些步驟。在實現上,她借鑑了Unix操做系統的管道(pipe)思想,前一級的輸出,直接變成後一級的輸入,使得在操做上很是簡單。
既然gulp是基於node,因此咱們就要先有node環境,不過咱們自己就是使用hexo構建咱們的博客,就已是基於node環境了~
npm(node package manager)nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等)
####使用npm安裝插件:npm install <name> [g] [--save -dev]
<name>
:node 插件名稱-g
:全局安裝,會在node安裝的根目錄下載對應的包,在計算機的任何文件均可以使用該插件,默認的node安裝目錄是:C:\Users\Administrator\AppData\Roaming\npm
;若是不帶該屬性,將會安裝在當前目錄,下載安裝包的位置是當前目錄的node_modules
文件夾--save
:將配置信息保存在node項目配置文件package.json
中-dev
:保存至package.json
的devDependencies節點,若是沒有該屬性,該插件將會被保存至dependencies節點,devDependencies和dependencies有什麼區別呢?其實從名字就應該能夠看出來二者的區別,devDependencies中dev是development(開發)的縮寫,dependencies是依賴的意思。因此 dependencies 是程序正常運行所須要安裝的依賴,而devDependencies是開發所須要的依賴,好比一些單元測試的包~npm install
,就能夠下載package.json
下全部須要的包。npm install --production
則只下載dependencies下的包npm unstall <name> [-g] [--save-dev]
npm unstall <name> [-g] [--save-dev]
命令rimraf node_modules
(首先你須要先安裝rimraf 插件)npm update <name> [g] [--save-dev]
什麼是cnpm呢,你們都知道,因爲不可描述緣由,咱們訪問國外的資源有時候的速度,你們懂的,因此淘寶除了一個npm鏡像,服務器就在中國。c能夠理解爲China(應該能夠這樣理解吧),cnpm使用方法和npm徹底相同,只需將npm所有換成cnpm就能夠。本文都是使用的npm,若是想要嘗試cnpmde的麻煩自行替換~
這是一個完整 npmjs.org 鏡像,你能夠用此代替官方版本(只讀),同步頻率目前爲 10分鐘 一次以保證儘可能與官方服務同步。
cnpm 官網地址:npm.taobao.org;
安裝命令爲npm install cnpm -g --registry=https://registry.npm.taobao.org
注意:安裝完後最好查看其版本號
cnpm -v
或關閉命令提示符從新打開,安裝完直接使用有可能會出現錯誤;
言歸正傳,簡單介紹了gulp和npm,咱們須要的是使用gulp壓縮咱們的代碼npm install gulp -g
,而後npm -v
查看版本號就能夠知道咱們是否是安裝成功了~★,°:.☆( ̄▽ ̄)/$:.°★。撒花!
使用npm init
就能夠建立package.json文件
{
"name": "hexo-site",
"version": "0.0.0",
"private": true,
"hexo": {
"version": "3.2.2"
},
"dependencies": {
"gulp": "^3.9.1",
"gulp-htmlclean": "^2.7.14",
"gulp-htmlmin": "^3.0.0",
"gulp-imagemin": "^3.2.0",
"gulp-minify-css": "^1.2.4",
"gulp-uglify": "^2.1.2",
"hexo": "^3.2.0",
"hexo-baidu-url-submit": "0.0.5",
"hexo-deployer-git": "^0.2.0",
"hexo-generator-archive": "^0.1.4",
"hexo-generator-baidu-sitemap": "^0.1.2",
"hexo-generator-category": "^0.1.3",
"hexo-generator-index": "^0.2.0",
"hexo-generator-sitemap": "^1.1.2",
"hexo-generator-tag": "^0.2.0",
"hexo-renderer-ejs": "^0.2.0",
"hexo-renderer-marked": "^0.2.10",
"hexo-renderer-stylus": "^0.3.1",
"hexo-server": "^0.2.0",
"hexo-util": "^0.6.0",
"hexo-wordcount": "^2.0.1"
},
"devDependencies": {
"gulp-babel": "^6.1.2",
"gulp-clean": "^0.3.2",
"hexo-generator-baidu-sitemap": "^0.1.2"
}
}複製代碼
在你的Hexo目錄下右鍵git bash here
而後執行npm install <name> --save
,和gulp有關的包名稱有如下幾個,只需將<name>
替換一下就好~
"gulp": "^3.9.1",
"gulp-htmlclean": "^2.7.14",
"gulp-htmlmin": "^3.0.0",
"gulp-imagemin": "^3.2.0",
"gulp-minify-css": "^1.2.4",
"gulp-uglify": "^2.1.2",複製代碼
聰明的你是否是以爲有些眼熟,對的,就是我po出來的package.json中dependencies
下面對應的包名稱和版本號~是否是和剛剛所講的npm的知識聯繫到了一塊呢~
gulp.js是gulp的配置文件,須要咱們手動建立(應該還會有更高級的方法T T )
個人gulp.js文件以下
var gulp = require('gulp');
var minifycss = require('gulp-minify-css');
var uglify = require('gulp-uglify');
var htmlmin = require('gulp-htmlmin');
var htmlclean = require('gulp-htmlclean');
// 獲取 gulp-imagemin 模塊
var imagemin = require('gulp-imagemin')
// 壓縮 public 目錄 css
gulp.task('minify-css', function() {
return gulp.src('./public/**/*.css')
.pipe(minifycss())
.pipe(gulp.dest('./public'));
});
// 壓縮 public 目錄 html
gulp.task('minify-html', function() {
return gulp.src('./public/**/*.html')
.pipe(htmlclean())
.pipe(htmlmin({
removeComments: true, //清除HTML註釋
collapseWhitespace: true, //壓縮HTML
collapseBooleanAttributes: true, //省略布爾屬性的值 <input checked="true"/> ==> <input checked />
removeEmptyAttributes: true, //刪除全部空格做屬性值 <input id="" /> ==> <input />
removeScriptTypeAttributes: true, //刪除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true, //刪除<style>和<link>的type="text/css"
minifyJS: true, //壓縮頁面JS
minifyCSS: true //壓縮頁面CSS
}))
.on('error', function(err) {
console.log('html Error!', err.message);
this.end();
})
.pipe(gulp.dest('./public'))
});
// 壓縮 public/js 目錄 js
gulp.task('minify-js', function() {
return gulp.src('./public/**/*.js')
.pipe(uglify())
.pipe(gulp.dest('./public'));
});
// 壓縮圖片任務
// 在命令行輸入 gulp images 啓動此任務
gulp.task('images', function () {
// 1. 找到圖片
gulp.src('./photos/*.*')
// 2. 壓縮圖片
.pipe(imagemin({
progressive: true
}))
// 3. 另存圖片
.pipe(gulp.dest('dist/images'))
});
// 執行 gulp 命令時執行的任務
gulp.task('build', [
'minify-html','minify-css','minify-js','images',
]);複製代碼
gulp build
在git bash中直接輸入命令gulp build
就能夠,這個gulp build
是你本身建立的任務,你建立的任務是什麼名的就在gulp後面跟什麼名字
webstorm真的太強大,已經幫咱們繼承了gulp,咱們只須要動動鼠標就能夠執行gulp
增長七牛圖牀就是要將咱們電腦上的圖片上傳至七牛,而後得到外鏈,在咱們使用md寫博客的時候直接插入外鏈,更方便的是能夠直接獲取帶水印、壓縮、剪裁事後的圖片~
萬年不變的第一步,註冊。官網:七牛雲
在登陸成功以後,點擊對象存儲
使用七牛圖牀最棒的地方在於能夠對圖片進行處理,我就只拿添加水印來舉例。
七牛能夠對上傳的圖片添加圖片樣式