專題概述
本文是個人建站系列的第一篇文章,最終有多少篇文章筆者現在也説不好,因為是一邊創建個人站,一邊沉澱這個過程。每一步都是實操後再總結文檔,文檔是以章為單位總結的,每一章都會有幾篇文章,在發文前也都經過至少3次的大綱、文案的調整和校對,目的是為了儘量讓您能看明白,內容包括但不限於教程、實操、最佳實踐等,相對系統化,不過真的非常耗費時間。
- 本地環境要求:node、git,高級用户可選裝nvm進行node管理;
- 本文檔面向:MacOS用户
專題目標
個人建站其實並不簡單,但沒啥技術門檻,看下Hexo和theme插件的文檔,那麼代碼層面基本就可以無憂了(主題插件一定要在建站之初選定,因為每個主題的使用方法都不一樣,決定了網站的風格。後期更換主題需要修改很多配置),但要真正上線的話您還要了解,比如域名、雲主機、備案、流量、安全、網站運營、成本控制等等知識。好在筆者這幾年工作下來對上述知識多少還是有經驗積累的。
<font color=green size=4>本教程終極目標:</font>
對Hexo和Butterfly主題的技術講解只是初始目標,除hexo和butterlfy外還會涉及其它很多內容,包括運營和成本控制等知識,這將有助於幫您構建自己的技術體系提供參考思路(不侷限於個人建立領域)。So,如果您能掌握本系列教程的知識,至少能豐富您個人的技術圖譜,也會重新審視技術發展路線以及對未來的規劃,而後者是筆者最希望看到的。因為本專題是以建站這個事來開展的,hexo等框架的存技術使用只是做成這個事的充分但不必要條件。
面向對象
本教程即可以做為教程系統的學習也可以做為字典手冊來查詢使用。
<font color=green size=4>本教程的目標人羣:</font>
首先要説的一點就是知識的積累沒有捷徑可走,全是無數個不眠夜和時間堆出來的。但個體由於目的的不同,其選擇的過程和方法也不一樣,所以筆者就目的和教程的用法做下簡單總結:
- 如果您只是想
瞭解此方面的內容,那麼建議您只需要詳讀建站流程相關的章節瞭解下建站的大至內容,然後再按興趣選讀;- 如果您想系統
掌握這方面的技能,但不做任何與商業化相關的事,建議您每個章節都實操下但不必每個章節都一點不落的操作,一是比較耗時間,二是如果沒有明確的目的性很難有所收穫,因為本教程很多部分是圍繞如何後期商業化運營展開的;- 如果您想
打造個人技術品牌甚至實現商業化運營,那麼我建議您按章節順序一字不落的實操下。但我還是要先潑盆冷水,要達到這一目的一點也不容易甚至可能會失敗,單時間上對於普通人可能需要1-2年的時間甚至更長。建站只是其中一步,本系列教程雖不能帶給您全部內容,但一定可以帶給您更多的思考以及選擇。但慶幸的是我個人認為這是值得的,因為這件事一旦成功其帶來的長尾效益和衍生空間是您無法想象的,技術積累和金錢收益只是其中一部分。
<font color=green size=4>本章目標:</font>
掌握hexo的安裝、命令使用,並能在本地成功運行網站;也可參考基於hexo和aws雲搭建個人博客,0基礎0費用,有點豪橫(2W字超詳細圖文教程)一文中描述發佈博客到github或雲主機上。
一、搭建博客站點
暫定我們的博客的源碼所在的根目錄的文件夾名為blog,這個文件夾不需要手工創建,在hexo init則初始化時會自動生成,如下;
$npm install hexo-cli -g
$hexo init blog # 創建博客源碼目錄
$cd blog
$npm install # npm install hexo@7.0.0-rc1 安裝指定的版本
#安裝butterfly主題,推薦下載源碼包。
$npm install hexo-theme-butterfly
$npm install hexo-renderer-pug hexo-renderer-stylus --save
修改_config.yml文件中的theme屬性值為bufferfly
在_config.yml文件所在的目錄下創建一個名為_config.buffterlfy.yml的主題文件
$ npm install hexo-server --save #選裝單獨的服務器模塊
#服務器啓動
$hexo server --debug #--debug參數也可以不寫
bufferfly建議用源碼安裝:
1、下載源碼:github bufferfly
2、拷貝源碼包中 buffery主題一節中代碼示例中的文件 到/themes/bufferfly/下面。1、hexo源碼
2、hexo landspace theme源碼 ,安裝方式同butterfly。
npm view hexo //查看信息
npm view hexo versions //查看所有版本
npm info hexo //查看依賴信息
project説明
上述操作完成後,我們的項目代碼大概如下圖所示:
.
├── _config.butterfly.yml
├── _config.yml
├── package.json
├── package-lock.json #鎖定安裝時的包的版本號
├── scaffolds #Hexo的模板是指在新建的文章文件中默認填充的內容。
├── source
| ├── _drafts
| └── _posts
└── themes
└── bufferfly
- package-lock.json:文件鎖定版本號,當執行npm install的時候,node不會自動更新package.json文件中的模塊,方便多人開發環境的統一;
- source:資源文件夾,於用存放用户資源的地方。除 posts 文件夾之外,開頭命名為 (下劃線)的文件 / 文件夾和隱藏的文件將會被忽略。Markdown 和 HTML 文件會被解析並放到 public 文件夾,而其他文件會被拷貝過去。
theme配置
_config.butterfly.yml是主題配置文件,和主配置文件_config.yml都放在根目錄下,主題配置文件的內容優先級會高於主配置文件,如果是下載的butterfly主題源碼,那麼目錄結構如下,這些內容是需要拷貝到/themes/butterfly/文件夾下的:
.
├── _config.yml
├── package.json
├── plugins.yml
├── languages
├── layout
├── scripts
└── source
/themes/bufferfly/_config.yml文件建議保留,做為參考文檔,如不需要建議刪除掉;
scaffolds模版
Hexo 的模板是指在新建的文章文件中默認填充的內容,每創建一個頁面都要指定其使用的layout,默認值是post,以下是各頁面相對應的模板名稱。
| 模板 | 用途 | 回退 |
|---|---|---|
index |
首頁 | |
post |
文章(發博客文章時用到) | index |
page |
分頁 | index |
archive |
歸檔 | index |
category |
分類歸檔 | archive |
tag |
標籤歸檔 | archive |
layout自定義佈局
如果頁面結構類似,例如兩個模板都有頁首(Header)和頁腳(Footer),可考慮通過「佈局」讓兩個模板共享相同的結構。您可在 front-matter 指定其他佈局,或是設為 false 來關閉佈局功能。
全局佈局的寫法
//在layout文件下新建一個名為index.ejs的文件,內容如下:
index
// 然後再創建一個名為layout.ejs的文件,內容如下:
<!DOCTYPE html>
<html>
<body><%- body %></body>
</html>
// 最終會生成
<!DOCTYPE html>
<html>
<body>index</body>
</html>
// 局部模版的寫法(Partial),比如partial/header.ejs
<h1 id="logo"><%= config.title %></h1>
//index.ejs
<%- partial('partial/header') %>
<div id="content">Home page</div>
//生成
<h1 id="logo">My Site</h1>
<div id="content">Home page</div>
// 局部變量的定義,比如partial/header.ejs
<h1 id="logo"><%= title %></h1>
//index.ejs
<%- partial('partial/header', {title: 'Hello World'}) %>
<div id="content">Home page</div>
//生成
<h1 id="logo">Hello World</h1>
<div id="content">Home page</div>
//優化:新增的局部緩存(Fragment Caching) 功能,,它可用於頁首、頁腳、側邊欄等文件不常變動的位置
<%- fragment_cache('header', function(){
return '<header></header>';
});
//如果您使用局部模板的話
<%- partial('header', {}, {cache: true});
二、Hexo常用插件
您可以使用 Hexo 提供的官方工具插件來加速開發,如果功能不太複雜建議編寫.js腳本,並把其放到 scripts 文件夾中,在啓動時就會自動載入。
- [hexo-fs]:文件 IO
- [hexo-util]:工具包
- [hexo-i18n]:本地化(i18n)
- [hexo-pagination]:分頁
三、Hexo命令詳解
這些命令在開發時會經常使用,需要完全掌握。
全局參數
$hexo server --debug #參數舉例
--config Specify config file instead of using _config.yml
--debug Display all verbose messages in the terminal
--draft Display draft posts, source/_drafts
--safe Disable all plugins and scripts
--silent Hide output on console
命令列表
clean Remove generated files and cache.
config Get or set configurations.
deploy Deploy your website.
generate Generate static files.
help Get help on a command.
init Create a new Hexo folder.
list List the information of the site
migrate Migrate your site from other system to Hexo.
new Create a new post.
publish Moves a draft post from _drafts to _posts folder.
render Render files with renderer plugins.
server Start the server.
version Display version information.
命令詳解
hexo init,新建一個網站
$ hexo init [folder]
hexo new,新建一篇文章
$ hexo new [layout] <title>
如果沒有設置 layout 的話,默認使用 _config.yml 中的 default_layout 參數代替。如果標題包含空格的話,請使用引號括起來,示例如下:
#創建文件:/source/tags/index.md
$ hexo new page tags
#創建文件: /source/_posts/post-title-with-whitespace.md
$ hexo new "post title with whitespace"
#創建文件: /source/about/me.md
$ hexo new page --path about/me "About me"
#創建文件: source/_posts/about/me.md
$ hexo new page --path about/me
hexo publish, 發佈草稿
這個命令不太常用,在用hexo new 創建文章時,如果layout指定為draft則會認為是創建一篇了草稿,這個命令就是把創建好的草稿移到post文件夾中,這裏的publish是指文章的publish,而不是網站的deploy。
$ hexo publish [layout] <filename>
hexo g , 生成網站
網站部署的其實是.html等靜態文件,此命令就是用於生成這些待部署的靜態文件的,本地開發時直接用hexo server命令即可,不需要生成靜態文件。
$ hexo g
$ hexo g -w #動態生成文件,改一個生成一個
# 使用 custom.yml 和 custom2.json,其中 custom2.json 優先級更高
$ hexo g --config custom.yml,custom2.json,custom3.yml
hexo server, 啓動服務器
# 可選參數:-p 重設端口, -l 啓動日記記錄,使用覆蓋記錄格式
$ hexo server
$ hexo server -p 5000
# 使用 custom.yml 代替默認的 _config.yml
$ hexo server --config custom.yml
hexo deploy,部署網站
需要配置_config.xml中的deploy參數,此命令才會生效。發佈配置可查看,其實筆者並不建議用此命令來部署網站,做為練習使用還可以。即使是個人站點後期維護時此命令不但不會提效還會帶來很多麻煩
$ hexo d
hexo render,渲染文件(不太常用)
$ hexo render <file1> [file2] ...
hexo clean,清除緩存文件
這條命令主要會清除緩存文件 (db.json) 和已生成的靜態文件 (public),如果發現修改源碼後UI樣式未更新,可用此命令清除下緩存。
$ hexo clean
hexo list, 列出網站資料
types有以下類型可選page, post, route, tag, category
$ hexo list <type>
四、博客站點發布
github
先安裝插件 $ npm install hexo-deployer-git --save ,然後執行以下命令:
- 建立名為 <你的 GitHub 用户名>.github.io 的儲存庫;
- 在 _config.yml 中添加以下配置
deploy:
type: git
repo: https://github.com/<username>/<project> # example, https://github.com/hexojs/hexojs.github.io
branch: gh-pages //分支名稱
message: [message] //自定義提交信息
######或
deploy:
type: git
repo: <repository url>
branch: [branch]
token: ''
message: [message]
name: [git user]
email: [git email]
extend_dirs: [extend directory]
ignore_hidden: false # default is true
ignore_pattern: regexp # whatever file that matches the regexp will be ignored when deploying
#######也可以配置多個type一次發佈到多個網站上
deploy:
- type: git
repo:
- type: heroku
repo:
- 執行
hexo clean && hexo deploy。 - 瀏覽 <GitHub 用户名>.github.io 檢查你的網站能否運作。
rsync
rsync是linux系統下的數據鏡像備份工具。使用快速增量備份工具Remote Sync可以遠程同步,支持本地複製,或者與其他SSH、rsync主機同步。
- 安裝插件:
$ npm install hexo-deployer-rsync --save - 修改配置
deploy:
type: rsync
host: <host>
user: <user>
root: <root>
port: [port]
delete: [true|false] 刪除遠程主機上的舊文件,默認值true
verbose: [true|false] 顯示調試信息,默認值true
ignore_errors: [true|false],默認值false
sftp
- 安裝插件:
$ npm install hexo-deployer-sftp --save -
修改配置
deploy: type: sftp host: <host> user: <user> pass: <password> remotePath: [remote path] port: [port] privateKey: [path/to/privateKey] ssh私鑰的目錄地址 passphrase: [passphrase] (可省略)ssh私鑰的密碼短語 agent: [path/to/agent/socket],ssh套接字的目錄地址, 默認值 $SSH_AUTH_SOCK
五、I18N國際化(可選)
先在 _config.yml 中調整 language 設定,這代表的是預設語言,您也可設定多個語言來調整預設語言的順位。
language: zh-tw
language:
- zh-tw
- en
語言文件編寫
語言文件可以使用 YAML 或 JSON 編寫,放在主題文件夾中的 languages 文件夾下,可以在語言文件中使用 printf 格式。
語言文件使用
在模板中,通過 __ 或 _p 輔助函數,即可取得翻譯後的字符串,前者用於一般使用;而後者用於複數字符串。例如:
index:
title: Home
add: Add
video:
zero: No videos
one: One video
other: %d videos
<%= __('index.title') %>
// Home
<%= _p('index.video', 3) %>
// 3 videos
語言文件存放路徑
可在 front-matter 中指定該頁面的語言,也可在 _config.yml 中修改 i18n_dir 設定,讓 Hexo 自動偵測。
i18n_dir: :lang
i18n_dir 的預設值是 :lang,也就是説 Hexo 會捕獲網址中的第一段以檢測語言,舉例來説:
/index.html => en
/archives/index.html => en
/zh-tw/index.html => zh-tw
捕獲到的字符串唯有在語言文件存在的情況下,才會被當作是語言,因此例二 /archives/index.html 中的 archives 就不被當成是語言。