このブログを構築した方法
きっかけ
昨日(2020/9/3)、ツイッターで、「githubにmarkdownの原稿を上げたら、記事がホームページ(ブログ)に公開される仕組みを、簡単に作る方法」について質問をしたら「GitHub PagesとかNetlifyがいいんじゃない?」というお返事を頂きました。
githubにmarkdownの原稿を上げたら、記事がホームページ(ブログ)に公開される仕組みを、簡単に作る方法ってあるんでしょうか?
— はけた@経理のExcel仕事術 8/27発売 (@excelspeedup) September 3, 2020
ということで、せっかくなので、ブログを作ってみました。
技術選定
最近、Reactを勉強していることもあり、とりあえずGatsbyを使おう、ということは決めていました。
あとは、それで生成したデータを、どこで公開するかを検討し、最終的には「Netlify」に決定しました。
Github Pages
調べてみると、GitHub Pagesに上げるためには、下記のような制約があるようでした。
- Publicフォルダ以下だけをMasterブランチにPushしないといけない
- 1つのGitHubアカウントごとに、1つのGitHub Pagesしか使えない
Gitの設定も面倒そうですし、GitHub Pagesは、昔、別用途で使っていたので、どちらにしても、無理ということで却下。
Netlify
こちらは、単に、MasterブランチにGatsbyのプロジェクトをPushすれば、ブログが公開できるらしい、ということで、Netlifyで公開することに決定。
Gatsbyの設定
ということで、Gatsbyの設定を始めます。
チュートリアルの実施。Netlifyで試しに公開
まずは、適当にチュートリアルを実行。ある程度まで進めたところで、いったん、Netlifyに転送。まずは、簡単に公開できることは確認できました。
テンプレートの選定
ということで、本腰を入れて構築を開始します。
まずは、公式サイトのstarters(ブログなどのテンプレートが公開されているページ)から、適当なGatsbyのテンプレートを探してダウンロードします。
最終的に選んだのはgatsby-markdown-blog-starterです。
このテンプレートに行きつくまで、いくつか試してみたのですが、なかなかうまくいかず難航しました。
デザインが気に入らない
シンプルな、カテゴリページ・記事ページが作れるブログテンプレートを探したのですが、意外とそういうテンプレートがありません。
ソースコードが複雑すぎる
当然、テンプレートのソースコードは、テンプレートごとに変わります。
ダウンロードしたものの中には、テンプレートがどういう構造になっているのか、(今の私のレベルでは)ぱっと見でわからないものもありました。なので、そういうものは、候補から除外しました。
ダウンロードしても動かない
ダウンロードしても、うまく動かせない、というものも結構ありました。
あるいは、うまく動いたとしても、使っているnpmパッケージが古くて脆弱性だらけ。なので、パッケージをアップデートしたら動かなくなる、というようなものもチラホラ。
特に、ソースコードが複雑すぎて、どう見たらいいかわからないもので、こうなってしまうとお手上げです。
テンプレートを設定・改変する
テンプレートを選んだら、個別の設定をしていきます。
Linterを入れる
まず、Linterの設定を自分の好みに変えて、ソースコードをそれに合わせて自動修正します。
npmパッケージのアップデート
npmパッケージが古いのでアップデート。それに合わせて、動かない箇所が出てきたので微修正をします。
今回は、「LinkedIn」関連のコンポーネント(いいねをする機能か、いいねの数を拾う機能?)がアップデートに伴い、うまく動かなくなっていたようです。LinkedInは不要なので削除しました。
日付処理のローカライズ
ブログ記事の投稿日が「2020/9/1」なのに、実際の表示が「2020/8/31」になる、など、日付関連に不具合がありました。
どうやら、タイムゾーンの処理に起因するトラブルのようなので、テンプレートに修正を入れました。
Add option to get date in local or specified time zone
※参考にした記事がもう1つあったんですが。忘れました。
具体的には、次のように処理を変えています。
Markdownのデータを取得するクエリ部分で書式を整えない
query BlogPostBySlug($slug: String!) {
markdownRemark(fields: { slug: { eq: $slug } }) {
html
timeToRead
excerpt
frontmatter {
title
cover
date
categories
tags
}
fields {
slug
date(formatString: "MMMM DD, YYYY") }
}
}
↓
query BlogPostBySlug($slug: String!) {
markdownRemark(fields: { slug: { eq: $slug } }) {
html
timeToRead
excerpt
frontmatter {
title
cover
date
categories
tags
}
fields {
slug
date }
}
}
実際の出力時に日付を整える処理を入れる
//(略)
<p className={styles.postMeta}>
{date} — {postNode.timeToRead} Min Read{' '}</p>
↓
const f = (date) => moment(date).format(`YYYY-MM-DD`);//(略)
<p className={styles.postMeta}>
{f(date)} — この記事は{postNode.timeToRead}分で読めます{' '}</p>
その他細かい調整
その他、出力されたHTMLで、いくつか、怪しげなところがあったので微調整をして、一応は設定が完了です。
まとめ
ということで、記事を投稿してみましたが。
見出し・画像が見にくいなど、まだまだ、レイアウトに調整が必要そうですね。
追々調整をしていきます。