🛠️

GoでSSG(静的サイトジェネレーター)を手作りしてみた

2024/01/27に公開

目的

この記事(Writing a Static Blog Generator in Go)を読んでから自分でもやってみたいなと思っていたのでゴリっと作ってみました。

既存のSSGの置き換え等々は全く考えておらず、あくまでも興味駆動の開発になります。

作ったもの

https://github.com/K-Sato1995/go-simple-ssg

↑を使用して作った静的サイト

https://go-simple-ssg.vercel.app/

構成

やった事としては大枠

  • マークダウン(記事のコンテンツ)+テンプレート(HTML)を元に静的なファイルを生成する部分
  • CLIで↑を利用して誰でもプロジェクトの骨組みができるようにする部分

だけなので大したことはしていないのですが全体感としては下記のようになりました。

./
├── parser/ (MarkdownをパースしてHTMLに変換する部分)
│   ├── mdToHTML.go
│   └── parseMetaData.go
├── builder/ (受け取ったコンテンツをテンプレートに合わせてビルドする部分)
│   ├── bundleCss.go
│   ├── copyStaticFiles.go
│   ├── generateDetail.go
│   └── generateList.go
├── simple-ssg-cli/ (projectの骨組みを作ってくれるCLI)
├─  example/ (CLIでコピーされるベースプロジェクト)
├── config/  (ユーザー側でカスタマイズできる設定ファイルとなる部分)
└── engine.go (↑の生成部分をまとめてパッケージとして使えるようにした部分)

使用するには↑のsimple-ssg-cliをインストールして、initコマンドを実行するようにしました。

$ go install github.com/K-Sato1995/go-simple-ssg/simple-ssg-cli@latest
$ simple-ssg-cli init

をすると手元に下記のような構成の新しいプロジェクトが作成されます。

./
├── contents/ (コンテンツとなるマークダウンファイルの置き場)
├── templates/ (テンプレートとなるHTML/CSSファイルの置き場)
├── generated/ (生成された静的コンテンツ)
├── go.mod
├── go.sum
└── main.go

ので下記のように手元に作成されたプロジェクトに移動し実行すると静的コンテンツのビルド等々を行うようになっています。

$ cd your_project && go run main.go

その他

  • 自分で作ってみて、HugoやらNext.js等々の既存のSSGは色々すごいな〜よくできてるな〜と改めて思いました😁
  • テンプレートの部分をReactやらSvelteやらにしたかったのですが、Goでやる意味感じなかったでやめました
    • plentico/plentiというSSGがテンプレート部分をSvelteを使っていましたが、内部的にはrogchap/v8goを使用してSvelteでコンパイルしていました。

参考にしたライブラリたち

既にSSGはGo製で素晴らしいライブラリが多く存在しているので、作成にあたってコードや構成等々を参考にしました。

tacomsテックブログ

Discussion