提前聲明:Jekyll並不簡單,必須要正確的看待它。把它和PHP,JSP和Django等放在一起討論會減少很多失落感。它的學習曲線幾乎相當於Wordpress,工作流程和結構也幾乎一樣。
Jekyll與Wordpress最大不同的就是,沒有數據庫。但是體驗上來説也算不上什麼大差別。
徹底摒棄數據庫,這算是一種Jekyll式的新思路。
因為你需要的只是定期更新一些Markdown格式的文章,然後讓它顯示成網頁,並放在一起成為網站而已。沒必要大動干戈的設計數據庫什麼的。
簡單的説,Jekyll是一個基於Ruby語言的靜態博客網站製作工具,它可以把Markdown轉換成HTML網頁。
不過對於一個HTML網頁來説,它得有標題、樣式、日期什麼的,甚至一些根據文章的不同而動態改變的內容等。這些就不僅是把Markdown轉換成HTML而已了。很多內容需要你在Markdown文件裏面就寫明指定。
另注:Jekyll雖然和Github Pages搭配免費,但其實是完全獨立的產品。可以在任何地方使用,像Wordpress一樣。
安裝Jekyll
安裝Jekyll需要用Ruby的包管理器gem下載,像Python的pip一樣:
$ gem install jekyll
但是如果本機的gem版本不夠新,是裝不了jekyll的,所以就依照官網從ruby從頭開始安裝:
sudo apt-get install ruby ruby-dev build-essential
echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
echo 'export GEM_HOME=$HOME/gems' >> ~/.bashrc
echo 'export PATH=$HOME/gems/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
gem install jekyll bundler
用Jekyll創建一個網站(自動生成名為test_blog的文件夾和一個完整的Demo網站):
$ jekyll new test_blog
目錄裏面內容如下:
這裏面是完整的一個網站,可以直接運行瀏覽。
然後你就可以根據自己的主頁、其它網頁什麼的,在這個基礎上修改了。
Jekyll new時發送錯誤:Bundler: ruby: No such file or directory
我的Mac機上從來沒做過任何Ruby項目,也不懂gem使用方法。全部原始配置後,使用gem install jekyll沒問題,但是在jekyll new ..時,就發送這個錯誤:
Bundler: ruby: No such file or directory -- /usr/local/lib/ruby/gems/2.5.0/gems/bundler-1.16.1/exe/bundle (LoadError)
發生錯誤後,項目文件夾是生成了,但是不完整,也不能執行。
問題在於本機的gem和bundler都不是很新,需要更新一下。
參考:https://github.com/rubygems/r...
更新如下:
# Install latest version of Rubygems
gem update --system
# Install latest version of bundler system-wide
gem install bundler
更新時間會很長,等全部安裝好後,就可以正常的使用jekyll了。
生成網站
渲染網站
$ cd test_blog
$ jekyll serve
或實時渲染網站:
$ jekyll server --watch
如果加上了--watch參數,jekyll就會實時監控你的文件,只要那個文件有變動了,比如新增了markdown文件,或修改了layout模板,它都會即時渲染生成網站,總保持更新。
運行渲染的命令後,jekyll就會把你的Markdown根據指定的模板渲染為靜態網站,
同時還會把網站映射到本機的一個端口,你可以打開命令行裏提示的url鏈接察看網站效果。
允許公網訪問
如果jekyll部署在了公網上的服務器上,那麼很輕鬆就可以公開給所有人訪問了。
語法如下:
$ jekyll serve --detach --host 0.0.0.0
# 或
$ jekyll serve --force_polling -H 0.0.0.0 -P 4000
然後就會顯示如下:
也就是説公網運行jekyll的話,程序就轉到後台了,需要退出的話需要手動關閉進程。
然後根據網站設計時候指定的端口,相應的在服務器防火牆上開放這個端口,比如4000。
然後用http://服務器IP:4000這樣的就能訪問了。
如果要不帶端口號訪問,就在_config.yml中把端口號設計為80。(但是經常有衝突,需要解決)
Jekyll Workflow 工作流程
使用Jekyll,主要難就在一開始,需要設計網頁樣式,設置全站的規則等等。
但是一旦這些基本設置都完成了,以後更新就只需要專注的寫Markdown文件即可。
Jekyll自定義網站
Jekyll new命令新建一個網站結構後,文件夾裏面有很多文件。這些文件結構都是什麼作用,是我們必須要學習的。
Jekyll文件夾結構
_config.yml文件:這是你第一個需要修改的東西。全網站的通用設置都保存在這裏,比如網站主題,名稱,介紹,域名,Github用户名等。.yml是像.ini一樣的配置文件類型。_site文件夾:這個存放你的完整靜態網站的文件夾,但是這是不需要你去碰的文件夾,它是Jekyll根據你的設置和模板之類的內容,自動生成的靜態網站。_layout文件夾:是存放各種網頁模板的地方,主頁什麼樣子,列表頁什麼樣子,博客內容頁面什麼樣子,這些分別的頁面模板都是放在這裏的。_includes文件夾:存放所有重複使用的、比較固定的頁面模塊。比如每個網頁都一樣的頁頭、頁腳,導航欄,側邊欄等等。這裏面的HTML文件,都不是完整的HTML網頁,都只是模塊,可能只是一個<div>標籤。_posts文件夾:存放所有的Markdown格式文件。你所有的Markdown博客內容,都放在這裏。文件命名也是有規定的,比如必須是data-filename.markdown這種。
注意:
_site文件夾需要你在.gitignore中加入屏蔽,因為這個動態生成的東西,完全不需要在git裏面進行追蹤。而且放在Github Pages上的話,Github引擎也不會在你的目錄裏面生成這個文件夾,而是在後台直接給你生成頁面。之所以會有它,主要是本地設計時候用。
Front-Matter 文件頭信息
文件頭信息在這裏被叫做front-matter,或yml-header,它是寫在每個Markdown文件頭部的設置信息。主要是指明這篇文章標題、日期、使用的模板、樣式、標籤、分類等,這樣Jekyll就可以根據這些設置把markdown文件轉換成你想要的最終HTML網頁了。
頭信息的常用參數如下:
layout: 指明模板名稱,即指定使用_layout文件夾中哪個HTML網頁做為模板。title: 這篇文章的標題。data: 這篇文章的日期。categories: 這篇文章的分類。
“真正的”拿到Jekyll生成的靜態網站
Jekyll的最終目標和整個存在意義都是生成靜態網站。
但是,
默認情況下,所謂生成出來的靜態HTML頁面,你也不能直接打開看到效果!必須要運行jekyll serve才行,或者把它放到Github的Repo裏。
那還叫什麼靜態網站?!
真正的靜態網站不是生成HTML就行了,而是讓你雙擊打開HTML就能在瀏覽器看到效果。
避開這個有點矛盾的邏輯不説了,我們有比較方便的外部工具來做到這點。
那就是最常用的wget下載命令。
wget可以把網頁或整個網站下載下來,並且能自動轉換各種文件裏的路徑。
命令如下:
$ wget -r --convert-links <URL>
所以當你運行Jekyll serve成功編譯生成_site目錄後,就可以用wget下載本地的這個網站了。
Jekyll的體驗
目前體驗極其糟糕:
- 不能真正生成靜態網站,必須開着Jekyll服務才能展示出網頁
- Macbook air上運行jekyll服務器不到一會兒,CPU温度就極速增高
- 大概幾十篇文章,就需要10s+的生成時間
- 各個主題安裝極其不同,每個主題都需要單獨學習其內在邏輯、變量、結構、生成方法,學習成本非常高
- 依賴性極高,很容易導致gem或nodejs依賴過期無效或出錯
- Jekyll對配置文件的tokens(比如指定變量名)經常改變和更新,很快你寫的配置文件就不管用老報錯了。