静的サイトはデータをそのまま配信するため,セキュリティと速度に優れます.
静的サイトジェネレータは記事となるファイルから静的サイトを生成するソフトウェアです.
多くのジェネレータは,執筆が簡単かつ記事の再利用が容易であるという特長があるMarkdown形式で執筆された記事からサイトを生成することができます.
このページでは,静的サイトジェネレータの1つであるHexoについて説明します.

目次

  1. インストール
    1. macOS 11の場合
    2. CentOS 8の場合
    3. CentOS 7の場合
  2. ブログ作成
  3. 設定
    1. 設定ファイル
    2. 生成時に.htaccessを含める
  4. 記事作成
    1. 新規作成
    2. フロントマター
    3. WordPressからHexoに記事を移行する場合
  5. ブログの生成
  6. デプロイ
    1. SFTP
    2. 自サーバー
    3. GitHub + Netlify
  7. テーマ
    1. Tranquilpeak
    2. Book
  8. プラグイン
    1. サイトマップ生成
    2. カテゴリーの自動分類
    3. 記法の拡張
    4. 記事を隠す

インストール

macOS 11の場合

Macでターミナルを開き,パッケージマネージャーのHomebrewを用意します.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewを用いて,Node.jsとgitをインストールします.

brew install nodebrew
brew install git

以上の準備ができたら,Hexoをインストールします.

npm install -g hexo-cli

CentOS 8の場合

Node.jsとgitをインストールします.

dnf install nodejs
dnf install git-core

準備ができたら,Hexoをインストールします.

npm install -g hexo-cli

CentOS 7の場合

Node.jsとgitをインストールします.

yum -y remove npm
curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
yum install nodejs
yum install git-core

準備ができたら,Hexoをインストールします.

npm install -g hexo-cli

ブログ作成

hexoコマンドのinitサブコマンドでブログを作ることができます.

hexo init "ブログ名"

ブログを作成したら,このディレクトリに入って初期化してください.

cd "ブログ名"
npm install

設定

設定ファイル

ディレクトリ内にある_config.ymlで各種設定を行えます.
各テーマ内にも_config.ymlがあり,テーマごとの設定ができます.

生成時に.htaccessを含める

Hexoのブログのsourceフォルダに.htaccessを置いていても,そのままではpublicフォルダに生成されません.
そこで,_config.ymlincludeに次を書き足します.

include:
- .htaccess

記事作成

新規作成

固定ページ作成は

hexo new page "filename"

で行います.
記事投稿は

hexo new post "filename"

で行います.

固定ページはsource/直下,記事はsource/_posts/以下に作られます.

フロントマター

各記事ではフロントマター(YAMLヘッダ)においてタイトル等の情報を入れます.

---
title:
date:
updated:
category:
tag:
excerpt:
---

上から順に ,以下の意味です.

  • タイトル
  • 作成日
  • 更新日
  • カテゴリー
  • タグ
  • 抜粋

テーマやプラグインによっては固有の項目を持つ場合もあります.
また,通常必須なのはタイトルと作成日のみです.

WordPressからHexoに記事を移行する場合

  1. WordPressの管理メニューにあるツールで記事をエクスポートします.(XMLファイルが手に入る.)
  2. ブログをカレントディレクトリにして,hexo-migrator-wordpressプラグインをインストールします.
npm install hexo-migrator-wordpress --save
3. Hexoのブログへ投稿を移行します。
hexo migrate wordpress XMLファイルのパス

ブログの生成

ブログ全体のフォルダをカレントディレクトリにした状態で,過去に生成したブログ(既存のpublicディレクトリ)を消すために,

hexo clean

して,生成するために,

hexo g

します.
デプロイも一緒に行うならhexo g -dとします.
デプロイの挙動は「ディレクトリごと上書きする」です.

PCであれば,

hexo s

とすることでローカルサーバーを立ち上げることができるので,ブラウザでブログの様子をすぐ確認できます.
終了はctrl + cです.

デプロイ

SFTP

SFTPでデプロイするには,hexo-deployer-sftpが必要です.
このため,ブログのディレクトリで,

npm install hexo-deployer-sftp --save

としてインストールします.

_config.ymlには次を追記します.

deploy:
type: sftp
host: <host>
user: <user>
pass: <password>
remotePath: [remote path]
port: [port]
privateKey: [path/to/privateKey]
passphrase: [passphrase]
agent: [path/to/agent/socket]

各項目は適宜設定してください.

設定が終われば,次の通常のデプロイのコマンド

hexo deploy

で,SFTPによるデプロイができるようになります.

自サーバー

自サーバー内で出力する場合には,上のような設定は必要ありません.
_config.ymlの出力先フォルダpublicを出力先の絶対パスにすることによりhexo deployコマンドで直接デプロイすることができます.
この場合にも,hexo cleanhexo deployの出力先と同じ場所からサイトを削除します.

GitHub + Netlify

Netlifyでサイトを公開するにはまず,NetlifyからGitHub上にあるプロジェクトのリポジトリを選択します.
git pushされたとき自動でビルド・デプロイされるようになるが,そのビルドコマンドとしてはhexo generateを指定し,サイト出力先フォルダは(_config.ymlで変更していない限り)public/とします.

独自ドメインからサブドメインを利用したい場合,まずDomain Management > Custom Domains > Add domain aliasと進み,独自ドメインにおいて利用したいサブドメインを登録します.
そして,DNSサーバーにて,対象のサブドメインのCNAMEで値をNetlifyのサブドメインに設定します.

テーマ

Tranquilpeak

Tranquilpeakはサイドバー付きのレスポンシブ対応テーマです.

次のmarkdownファイルを作ると,それから生成されるhtmlがカテゴリー別の記事一覧となります.

---
title: "ページのタイトル"
layout: "all-categories"
comments: false
---

同様にして,layout: "all-tags"とすればタグ別の記事一覧,layout: "all-archives"とすることでアーカイブページを作成できます.

記事で<!-- toc -->と書いておくと,そこに目次を作ってくれます.

テーマのコンフィグファイルはテーマのディレクトリにある_config.ymlと,日本語設定に関するlanguages/ja.ymlの2つです.

記事作成時刻だけでなく更新時刻も表示したい場合は,テーマ内のlayout/_partial/post/meta.ejsを加工します.

<time datetime= 中略
</time>

<% if (post.updated) { %>
<i class="fas fa-redo"></i>
<time datetime="<%= post.updated.format() %>">
<% if (post.lang) { %>
<%= post.updated.locale(post.lang).format(__('date_format')) %>
<% } else { %>
<%= post.updated.locale(page.lang).format(__('date_format')) %>
<% } %>
</time>
<% } %>

<% if ((post.categories) 以下略

記事中では文章の強調に特殊なタグを用いることができます。
例えば、囲み文字の強調スタイルを使うなら、

{% alert danger %}
Here is a danger alert
{% endalert %}

とします.
infosuccesswarningdangerを使用可能です.

テキストにマーカーをつけるには

{% hl_text danger %}
your highlighted text
{% endhl_text %}

とします.
primarysuccesswarningdangerやいくつかの色名(例えば,green)を使用可能です.

Book

Bookテーマを使用すると,本のようなデザインになります.
_postディレクトリにhome.mdmenu.mdを入れてブログを生成します.
home.mdindex.htmlになり,menu.mdは左カラムになります.
テーマのコンフィグで指定すれば,home.mdmenu.md以外のファイル名も使用可能です.

menu.mdでは,#奇数個で始めた表示ありの見出し,偶数個の折り畳み見出し,*等の箇条書きによって項目を列挙します.
たとえば,

# 大見出し1
## 折り畳まれる見出し1
* 項目1a
* 項目1b
## 折り畳まれる見出し2
* 項目2a
* 項目2b

# 大見出し2
(以下略)

です。
なお、右カラムには各記事ページの目次が自動生成されます。

メタディスクリプションを使用するため、テーマbook/layout/_partial/head.ejsで、以下を追加します。

<% if (page.excerpt) { %>
<meta name="description" content="<%= page.excerpt %>">
<% } else if(config.description) { %>
<meta name="description" content="<%= config.description %>">
<% } %>

これにより,投稿記事のフロントマターでexcerptによって記述した内容がメタディスクリプションとなります.

プラグイン

サイトマップ生成

hexo-generator-sitemapでサイトマップを作ることができます.

プラグインのインストールは次で行います.

npm install hexo-generator-sitemap --save

_config.ymlには次を加えます.

sitemap:
path: sitemap.xml
template: ./sitemap_template.xml
rel: false
tags: true
categories: true

上から順に,

  • 出力されるサイトマップのファイルパス
  • カスタムテンプレートの在処
  • ヘッダーにrel-sitemapを含めるかどうか
  • タグを含めるかどうか
  • カテゴリーを含めるかどうか

です.
また,上述のリストはデフォルトの値の通りです.

特定の記事をサイトマップから除外したい場合,個別の記事のフロントマターに以下を加えます.

sitemap: false

カテゴリーの自動分類

Hexoのカテゴリーを毎回書かなくても済むようにするために,ディレクトリによってカテゴリーが決まるプラグインhexo-directory-categoryをインストールするには,自分のブログのフォルダで

npm install --save hexo-directory-category

とします.

_config.ymlには次を追記します.

auto_dir_categorize:
enable: true # options:true, false; default is true
force: false # options:true, false; default is false

forceオプションがtrueなら,各記事でフロントマターに書かれている既存のカテゴリーを無視して,フォルダに従ってカテゴリーを付け直します.

hexo-auto-categoryというプラグインが記事原本のフロントマターを書き直してしまうのに対し,hexo-directory-categoryは生成されるファイルのみが書き換えられる点が優れています.

記法の拡張

hexo-renderer-markdown-itを使い,markdown-itによる記法拡張を行うことができます.

既存のレンダラーをアンインストールして,hexo-renderer-markdown-itをインストールするには,

npm un hexo-renderer-marked --save
npm i hexo-renderer-markdown-it --save

とします.

次は,github上のドキュメントに書かれた_config.ymlに書く内容の例です.

# Markdown-it config
## Docs: https://github.com/celsomiranda/hexo-renderer-markdown-it/wiki
markdown:
render:
html: true
xhtmlOut: false
breaks: true
linkify: true
typographer: true
quotes: '“”‘’'
plugins:
- markdown-it-abbr
- markdown-it-footnote
- markdown-it-ins
- markdown-it-sub
- markdown-it-sup
anchors:
level: 2
collisionSuffix: 'v'
permalink: true
permalinkClass: header-anchor
permalinkSymbol:

例えば,markdown-it-supとmarkdown-it-subプラグインは添字を有効にします.

テキスト^上付き添字^
テキスト~下付き添字~

markdown-it-footnoteプラグインは脚注を有効にします.

ただのテキスト[^ラベル]
[^ラベル]: 脚注の文章

markdown-it-deflistプラグインは定義リストを有効にします.

専門用語
: 定義

記事を隠す

古くなった記事を非表示かつnoindexするには,hexo-hide-postsプラグインを使用します.

インストールは

npm install hexo-hide-posts --save

で行えます.

記事のフロントマターにhidden: trueを加えると,そのページにプラグインが適用されます.

プラグインが適用されると,カテゴリー,タグ,アーカイブ,サイトマップなどからページが隠され,デフォルトではnoindexメタタグも埋め込まれます.
ただし,ページのURLを直打ちすればアクセスすることができます.

_config.ymlの諸設定は以下のとおりです.

# hexo-hide-posts
hide_posts:
# フロントマターのオプション名を「hidden」以外の名称にしたい場合
filter: hidden
# 全記事を表示するジェネレータ。
# 共通のジェネレータには、index, tag, category, archive, sitemap, feedなどがある。
public_generators: []
# noindexメタタグを加えるかどうか
noindex: true

ブログ内でhexo hidden:listとコマンドを打つと,隠した記事の一覧を取得することができます.