(※この記事は 別媒体に投稿した記事 のバックアップです。 canonical も設定しています)
2018-09-12
GitHub Pages
を採用したSPA
で作成し、技術スタックは TypeScript + React + Webpack + ServiceWorker
で作った最終的にペライチのサイトに変更しました。
ブログとか他諸々のことは別サービスや別リポジトリのほうが良いという理由です。
という感じで思いたち、じゃあ作ろうと決めた感じです。
ちなみに、調べてみるとこういうのをポートフォリオサイトと言うらしいです。
お金がかかったり、公開やメンテナンスに手間がかかる方法だと怠惰な自分には続かないので、公開が容易な方法を調べました。
その中で GitHub Pages は、無料で使える上に、 GitHub
にプッシュするだけで公開できるので、採用しました。
今回の目的は、自分の技術を公開するものなので、なるべく自分で作るのが良いと思いました。
よって、以下のような方針で作ることに決めました。
Markdown
で手軽に書けるようにするSPA
が得意なので、動的なページは SPA
で作るTypeScript + React + Webpack
の(多分)ベーシックな構成にする。デザイナーじゃないので凝ったことはしたくないけど、 Bootstrap
とかのCSSフレームワークを使うのは「自分の技術の公開」とはなにか違う気がするし、何より面白味がない😏
基本は自分で全部作り、以下のような方針でやることに決めました。
Markdown
を変換するので、基本的なHTMLタグを書くだけである程度デザインが整ったページを作れるような構成にする( GitHub
のMarkdownプレビューのようなイメージ)Macbook
と iPhone
の両方でちゃんと表示できることを目標)そんなにコンテンツはないですが、ちょっとだけ考えました。
IP アドレスと CNAME で設定する2つの方法があるようですが、 CNAME の方が管理が楽そうなので、そちらを採用しました。
AWS Route53 での設定は以下のようになります。
設定ページで以下の箇所に独自ドメインを設定するだけで OK です。
Let's Encrypt
で生成された証明書が使われるようです。
あと CNAME
というファイルが自動的に追加され、独自ドメインの設定が保存されるているようです。
間違ってこのファイルを消したら、アクセスできなくなって焦った・・。
とりあえず GitHub Pages
で採用されている Jekyll を当初使おうと思いました。
最初は問題なかったのですが、使っている内に細かい不満が出てきて Jekyll
の採用はやめました。
で、他の静的サイトジェネレーターを探してみたのですが、世の中にはたくさんのジェネレーターがあるんですね・・・。
一つ一つ試してみるのも大変ですし、やりたいことは Markdown
を HTML
に変換することと、 SCSS
を CSS
にできれば大体のことができるので、自作することにしました。
JavaScript
にしました。
自分の得意言語であること以外、特に理由はないです。node
と npm
にガッツリ依存しますが、まぁこの2つが潰れることはないでしょう。
以下のライブラリを使用しました。
Markdown
-> HTML
の変換SCSS
-> CSS
の変換marked
を使って変換します。
次にテンプレートエンジンに渡すので、テキストデータを受け取っておきます。
const fs = require('fs.js');
const marked = require('marked');
const htmlText = marked(fs.readFileSync('Markdownファイルのパス'))
テンプレート用のHTMLファイルに、Markdown のコンテンツを埋め込みます。
<%- JSのコード %> というような形で埋め込みができます。
詳細は 公式サイト を参照してください。
const ejs = require('ejs');
ejs.renderFile('テンプレートファイルのパス', { content: htmlText }, {}, (error, html) => {
if (error) {
throw new Error(error);
}
fs.writeFileSync('出力先のパス', html);
});
テンプレート内に書かれた <%- content %> に Markdown から変換した HTML データが埋め込まれます。
普通の CSS
を書いても良いのですが、最低限として色を変数で管理はしたいので、 SCSS
で書くことにしました。
const fs = require('fs');
const sass = require('node-sass');
sass.render({ file: '変換元の SCSS ファイルパス' }, (error, result) => {
if (error) {
throw new Error(error);
}
fs.writeFileSync('出力先の CSS ファイルパス', result.css.toString());
});
レポジトリにプッシュするだけなので、特に何も要らない(笑)
https://mryhryki.com/ に公開しています。
自分で考えて実装して公開するのは、やっぱり楽しいですね!
実際に公開してみて「どんなものが作れるか」と聞かれたらこれを見せれば良い、という安心感が凄いありますね。
とはいえ、今は積極的に転職活動をしているわけではないので、今のところは単なる自己満足😓
あと、静的サイトジェネレーターは、作るよりも選定する時間の方が長かった・・・。
最初から作っとけば良かった。