テーマを使わず、hugoでサイトを作る
調べた事などアウトプットしたいと思いブログを始めることにしました.
hugoを選んだのは,以前さわったことがあるのと,静的サイトジェネレータの中でも高速でストレスが少ないため.
最近は,jsの勢いがすごいので,Next.jsやGatsby,Nuxtあたりも候補になると思う.
手軽に始めるなら,このページに書いている内容よりも,無料のthemes(テーマ)を使った方が早いです. ただ,ちょっと手を加えようとすると以外と難しかったりする.
今回は,hugoを使って,小さなサイトを作ってみます.
記事ファイルの管理は,markdownです.
なお,hugoでサイトを作る方法はいろいろありますが,その中の1つです. 公式のドキュメントが詳しいので,目を通しておくといいです.
環境
- macOS catalina
- hugo v0.74.3
hugoの環境構築
コマンドをインストールして,ひな型を作ります.
hugoインストール
macであれば、Homebrewで一発です。
brew install hugo
hugo version
その他の環境は、こちらのリンクを参考にして下さい.
ひな型を作る
hugo new site <site_name>
<site_name>
のディレクトリができます.以下,myblog
の場合
myblog/
├── archetypes
│ └── default.md
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes
この中で最低限必要なのは,以下の4つ.(簡単な説明)
- config.toml (設定ファイル)
- content/ (記事を入れるディレクトリ)
- layouts/ (htmlファイルを入れるディレクトリ)
- static/ (js, cssを入れるディレクトリ)
公式のディレクトリ構成
TOPページを表示する
layouts/index.html
を作ります.普通のhtmlファイルです.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>site title</title>
</head>
<body>
<h1>Hello, World</h1>
</body>
</html>
ファイルを作ったら,サーバーを起動します
hugo server
ブラウザでhttp://localhost:1313/
を開いて,表示確認します.
「Hello, World」が表示されればOKです.

css, jsを扱う
static/
に入れます.
例えば,static/assets/style.css
であれば,パスはstatic以下を指定します.
<link rel='stylesheet' href='/assets/style.css'>
設定ファイルconfig.toml
設定ファイルをご自身の環境に合せて編集します.
baseURL = "http://example.org/"
languageCode = "en-us"
title = "My New Hugo Site"
languageCodeは,ja
orja-jp
のどっちでもいいようです.
index.html
のtitleを以下のようにすると,タイトル部分が変わります.
<title>{{ .Title }}</title>
htmlファイルを分割
hugoのテンプレートファイルは,ファイル名などルールが決っているので,それに合せて作ります.
全ページに共通部分 baseof
内容はほぼ,さきほど作ったindex.htmlですが,{{ block "main" . }}
と{{ end }}
部分が変っています.
baseof.htmlには,全ページに共通部分を書きます.
layouts/_default/baseof.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{ .Title }}</title>
<link rel='stylesheet' href='/assets/style.css'>
</head>
<body>
{{ block "main" . }}
{{ end }}
</body>
</html>
index.htmlでは,main部分を定義すると,baseof.htmlのmain blockで表示されます.
layouts/index.html
{{ define "main" }}
<h1>Hello World</h1>
{{ end }}
以降のファイルでも,ページごとにmain部分だけ定義すればいいです.
partialに分割
baseof.htmlのように,ページを読み込む時にhugoが自動で読むファイルは,layouts/_default/
におきます.
それ以外,複数のページで使用したり,分割するケースでは,layouts/partials
におき,読み込みます.
試しにheadタグを別ファイルで管理してみます.(baseofのhead部分)
layouts/partials/head.html
.
<head>
<meta charset="utf-8">
<title>{{ .Title }}</title>
<link rel='stylesheet' href='/assets/style.css'>
</head>
baseofでは{{ partial "head" . }}
で,partials/
にあるhead.htmlファイルを読み込みます.
layouts/_default/baseof.html
<!DOCTYPE html>
<html>
{{ partial "head" . }}
<body>
{{ block "main" . }}
{{ end }}
</body>
</html>
今回のケースでは,メリットを感じられませんが,まともなサイトを作るときはpartialは結構使うと思います.
記事ページを表示
記事ページのテンプレートを作る
記事ページを管理するために,layouts/_default/single.html
を作ります.
index.htmlと同じように,mainを定義します.
articleタグの中は,記事のコンテンツ(markdown)を表示します.
{{ define "main" }}
<article>
{{ .Content }}
</article>
{{ end }}
markdownを作る
hugoのコマンドで,markdownファイルを作るとFront Matterも作成してくれます.
hugo new posts/ファイル名.md
とすると,content/posts/ファイル名.md
ができる
---
で囲まれた部分がFront Matterで,タイトルや日付などを管理します.
デフォルトでは,draft: true
になっていますが,このままだと表示されません.
falseにするか,削除します.
Front Matterについて
あとは,markdownで記事を書けば,htmlに変換してレンダリングしてくれます.
例:sample.md
---
title: "Sample"
date: 2020-09-09T17:09:46+09:00
draft: false
---
# hugoでサイトを作る
go知らなくても作れるよ。
## ビルド早いよ
数十記事なら、たいして変らない
数千記事書いたら、ありがたみがを感じると思う
記事の一覧を表示
index.html
に最新記事を10ページ表示
{{ define "main" }}
<h1>記事一覧</h1>
{{ range first 10 .Site.RegularPages.ByDate.Reverse }}
<a href={{ .Permalink }}>{{ .Name }}</a>
{{ end }}
{{ end }}
こんな感じで作って,hugo server
で確認
