首頁 >後端開發 >Golang >如何使用 Go 建立靜態網站產生器

如何使用 Go 建立靜態網站產生器

Susan Sarandon
Susan Sarandon原創
2024-12-16 04:51:13281瀏覽

靜態網站產生器是一種強大的工具,可以簡化輕量級、快速且可擴展的網站的創建。無論您是建立部落格、文件還是小型企業網站,它們都會將用 Markdown 編寫的內容轉換為高效的靜態 HTML 文件。

在本指南中,我們將使用Go 建立一個靜態網站產生器(SSG),Go 是一種以其效能、簡單性和並發性而聞名的程式設計語言.我們將建立一個 CLI 工具,它將 Markdown 文件作為輸入,使用預先定義的 HTML 模板對其進行處理,並輸出漂亮的靜態 HTML 頁面。


為什麼要建構這個?

靜態站點產生器可以滿足多種實際用途:

  • 文件網站:產生技術文件的快速載入網站。
  • 部落格:用 Markdown 寫內容並輕鬆部署。
  • 原型製作:快速啟動小型專案或展示的靜態網站。

為什麼在這個專案中使用 Go?

  • 速度:Go 編譯為本機機器碼,使得這類工具速度極快。
  • 併發:Go 可以輕鬆同時處理多個檔案。
  • 簡單:Go 的語法很簡單,建構 CLI 工具也很簡單。

建造這個專案我玩得很開心:)

項目設定

在深入程式碼之前,我們先概述一下專案的結構:

static-site-generator/
├── cmd/
│   └── ssg/
│       └── main.go           # Entry point
├── internal/
│   ├── generator/
│   │   └── html.go          # HTML generation logic
│   ├── parser/
│   │   ├── frontmatter.go   # YAML frontmatter parsing
│   │   └── markdown.go      # Markdown processing
│   └── watcher/
│       └── watcher.go       # File change detection
├── templates/
│   └── default.html         # HTML template
├── content/                 # Markdown files
└── output/

如果您想從頭開始構建,請執行此命令來初始化專案的 Go 模組

go mod init

主要特點:

  • 將 Markdown 轉換為 HTML ?

  • 用於元資料解析的 YAML frontmatter

  • 用於可自訂輸出的 HTML 範本

  • 使用觀察者即時檔案更改偵測?

建設項目

1. 克隆儲存庫

開始之前,將儲存庫複製到本機:

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator

How to Create a Static Site Generator with Go 塔賓特爾 / 靜態站點產生器

靜態站點產生器

用 Go 寫的快速、簡單的靜態網站產生器。




在 GitHub 上查看


這將為您提供建置和運行 SSG 所需的所有入門檔案和專案結構。


2.Markdown解析器

Markdown 解析器處理將 .md 檔案轉換為 HTML 內容。它還支援自動標題 ID 等擴充功能。

內部/解析器/markdown.go

static-site-generator/
├── cmd/
│   └── ssg/
│       └── main.go           # Entry point
├── internal/
│   ├── generator/
│   │   └── html.go          # HTML generation logic
│   ├── parser/
│   │   ├── frontmatter.go   # YAML frontmatter parsing
│   │   └── markdown.go      # Markdown processing
│   └── watcher/
│       └── watcher.go       # File change detection
├── templates/
│   └── default.html         # HTML template
├── content/                 # Markdown files
└── output/

✨將 Markdown 內容轉換為 HTML 格式,並提供擴充功能支援。


3. Frontmatter 解析器

frontmatter 解析器從 Markdown 文件中提取標題、日期、標籤和描述等元資料。

內部/解析器/frontmatter.go

go mod init

?提取並返回元資料以及 Markdown 文件的內容。


4. HTML 產生器

HTML 產生器使用 Go 的 html/template 套件基於模板建立靜態 HTML 頁面。

內部/generator/html.go

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator

?從模板和解析的 Markdown 內容產生 HTML 檔案。


5. 文件觀察器

我們的觀察者監視內容/目錄的變更並自動觸發重建。

這是使用 https://github.com/fsnotify/fsnotify

建構的

內部/watcher/watcher.go

package parser

import (
    "github.com/gomarkdown/markdown"
    "github.com/gomarkdown/markdown/parser"
)

type MarkdownContent struct {
    Content    string
    Title      string
    Date       string
    Tags       []string
    HTMLOutput string
}

func ParseMarkdown(content []byte) *MarkdownContent {
    extensions := parser.CommonExtensions | parser.AutoHeadingIDs
    parser := parser.NewWithExtensions(extensions)
    html := markdown.ToHTML(content, parser, nil)

    return &MarkdownContent{
        Content:    string(content),
        HTMLOutput: string(html),
    }
}

?偵測文件變更並自動重新產生靜態文件。


六、主要用途

入口點將所有元件連結在一起,並提供自訂的 CLI 選項。

cmd/ssg/main.go

package parser

import (
    "bytes"
    "gopkg.in/yaml.v2"
)

type Frontmatter struct {
    Title       string   `yaml:"title"`
    Date        string   `yaml:"date"`
    Tags        []string `yaml:"tags"`
    Description string   `yaml:"description"`
}

func ParseFrontmatter(content []byte) (*Frontmatter, []byte, error) {
    parts := bytes.Split(content, []byte("---"))
    if len(parts) < 3 {
        return nil, content, nil
    }

    var meta Frontmatter
    err := yaml.Unmarshal(parts[1], &meta)
    if err != nil {
        return nil, content, err
    }

    return &meta, bytes.Join(parts[2:], []byte("---")), nil
}

用法

在執行應用程式之前,使用 .md 建立一個 markdown 檔案並將其保存在內容目錄中

How to Create a Static Site Generator with Go

然後運行生成器:

package generator

import (
    "html/template"
    "os"
    "path/filepath"
)

type Generator struct {
    TemplateDir string
    OutputDir   string
}

func NewGenerator(templateDir, outputDir string) *Generator {
    return &Generator{
        TemplateDir: templateDir,
        OutputDir:   outputDir,
    }
}

func (g *Generator) Generate(data interface{}, outputFile string) error {
    if err := os.MkdirAll(g.OutputDir, 0755); err != nil {
        return err
    }

    tmpl, err := template.ParseFiles(filepath.Join(g.TemplateDir, "default.html"))
    if err != nil {
        return err
    }

    out, err := os.Create(filepath.Join(g.OutputDir, outputFile))
    if err != nil {
        return err
    }
    defer out.Close()

    return tmpl.Execute(out, data)
}

它將 markdown 檔案轉換為 HTML 檔案並將其保存在輸出目錄中

如您所見,它添加了格式以使其具有視覺吸引力:)

How to Create a Static Site Generator with Go

留意變化

啟用觀察者:

package watcher

import (
    "fmt"
    "github.com/fsnotify/fsnotify"
    "log"
    "os"
    "path/filepath"
)

type ProcessFn func() error

func Watch(dir string, process ProcessFn) error {
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        return err
    }
    defer watcher.Close()

    done := make(chan bool)
    go func() {
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                if event.Op&fsnotify.Write == fsnotify.Write {
                    fmt.Printf("Modified file: %s\n", event.Name)
                    if err := process(); err != nil {
                        log.Printf("Error processing: %v\n", err)
                    }
                }
            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Printf("Error: %v\n", err)
            }
        }
    }()

    err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if info.IsDir() {
            return watcher.Add(path)
        }
        return nil
    })
    if err != nil {
        return err
    }

    <-done
    return nil
}

How to Create a Static Site Generator with Go


就是這樣!

此 SSG 將 markdown 轉換為乾淨的 HTML,監視變更並保持您的內容井井有條。如果您用它建立了一些東西,請發表評論 - 我很想看看您創建的內容!

覺得這有幫助嗎?你可以請我喝杯咖啡來支持更多Go教學! ☕

編碼愉快! ?

How to Create a Static Site Generator with Go 塔賓特爾 / 靜態站點產生器

靜態站點產生器

用 Go 寫的快速、簡單的靜態網站產生器。




在 GitHub 上查看


以上是如何使用 Go 建立靜態網站產生器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn