3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

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

Last updated at Posted at 2024-01-26

目的

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

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

作ったもの

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

構成

やった事としては大枠

  • マークダウン(記事のコンテンツ)+テンプレート(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製で素晴らしいライブラリが多く存在しているので、作成にあたってコードや構成等々を参考にしました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?