Heim > Backend-Entwicklung > Golang > So erstellen Sie einen statischen Site-Generator mit Go

So erstellen Sie einen statischen Site-Generator mit Go

Susan Sarandon
Freigeben: 2024-12-16 04:51:13
Original
277 Leute haben es durchsucht

Statische Site-Generatoren sind leistungsstarke Tools, die die Erstellung schlanker, schneller und skalierbarer Websites vereinfachen. Egal, ob Sie Blogs, Dokumentationen oder Websites für kleine Unternehmen erstellen, sie wandeln in Markdown geschriebene Inhalte in effiziente, statische HTML-Dateien um.

In diesem Leitfaden erstellen wir einen Static Site Generator (SSG) in Go, einer Programmiersprache, die für ihre Leistung, Einfachheit und Parallelität bekannt ist. Wir erstellen ein CLI-Tool, das Markdown-Dateien als Eingabe verwendet, sie mithilfe einer vordefinierten HTML-Vorlage verarbeitet und schöne, statische HTML-Seiten ausgibt.


Warum das bauen?

Ein statischer Site-Generator kann mehreren praktischen Zwecken dienen:

  • Dokumentationsseiten: Generieren Sie schnell ladende Websites für die technische Dokumentation.
  • Blogs: Schreiben Sie Ihre Inhalte in Markdown und stellen Sie sie mühelos bereit.
  • Prototyping: Erstellen Sie schnell statische Websites für kleine Projekte oder Präsentationen.

Warum Go für dieses Projekt verwenden?

  • Geschwindigkeit: Go kompiliert mit nativem Maschinencode und macht Tools wie dieses unglaublich schnell.
  • Parallelität: Go erleichtert die gleichzeitige Verarbeitung mehrerer Dateien.
  • Einfachheit: Die Syntax von Go ist minimal und die Erstellung von CLI-Tools ist unkompliziert.

Es hat mir viel Spaß gemacht, dieses Projekt zu erstellen :)

Projekt-Setup

Bevor wir uns mit dem Code befassen, skizzieren wir die Struktur des Projekts:

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/
Nach dem Login kopieren
Nach dem Login kopieren

Wenn Sie von Grund auf neu erstellen möchten, führen Sie diesen Befehl aus, um ein Go-Modul für das Projekt zu initialisieren

go mod init
Nach dem Login kopieren
Nach dem Login kopieren

Hauptmerkmale:

  • Markdown in HTML konvertieren?

  • YAML-Frontmatter für das Parsen von Metadaten

  • HTML-Vorlagen für anpassbare Ausgabe

  • Dateiänderungserkennung in Echtzeit mit einem Watcher ?

Aufbau des Projekts

1. Klonen Sie das Repository

Bevor Sie beginnen, klonen Sie das Repository auf Ihren lokalen Computer:

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator
Nach dem Login kopieren
Nach dem Login kopieren

How to Create a Static Site Generator with Go Tabintel / Static-Site-Generator

Statischer Site-Generator

Ein schneller und einfacher statischer Site-Generator, geschrieben in Go.




Auf GitHub ansehen


Dadurch erhalten Sie alle Starterdateien und die Projektstruktur, die zum Erstellen und Ausführen des SSG erforderlich sind.


2. Markdown-Parser

Der Markdown-Parser übernimmt die Konvertierung von .md-Dateien in HTML-Inhalte. Es ermöglicht auch erweiterte Funktionen wie automatische Überschriften-IDs.

internal/parser/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/
Nach dem Login kopieren
Nach dem Login kopieren

✨Konvertiert Markdown-Inhalte in das HTML-Format mit erweiterter Funktionsunterstützung.


3. Frontmatter-Parser

Der Frontmatter-Parser extrahiert Metadaten wie Titel, Datum, Tags und Beschreibung aus Markdown-Dateien.

internal/parser/frontmatter.go

go mod init
Nach dem Login kopieren
Nach dem Login kopieren

? Extrahiert und gibt Metadaten zusammen mit dem Inhalt der Markdown-Datei zurück.


4. HTML-Generator

Der HTML-Generator verwendet das HTML/Template-Paket von Go, um statische HTML-Seiten basierend auf einer Vorlage zu erstellen.

internal/generator/html.go

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator
Nach dem Login kopieren
Nach dem Login kopieren

? Erzeugt HTML-Dateien aus Vorlagen und geparsten Markdown-Inhalten.


5. Dateibeobachter

Unser Watcher überwacht den Inhalt/das Verzeichnis auf Änderungen und löst automatisch Neuerstellungen aus.

Dies wird mit https://github.com/fsnotify/fsnotify erstellt

internal/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),
    }
}
Nach dem Login kopieren

? Erkennt Dateiänderungen und automatisiert die Neugenerierung statischer Dateien.


6. Hauptanwendung

Der Einstiegspunkt verbindet alle Komponenten miteinander und bietet CLI-Optionen zur Anpassung.

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
}
Nach dem Login kopieren

Verwendung

Bevor Sie die App ausführen, erstellen Sie eine Markdown-Datei mit .md und speichern Sie sie im Inhaltsverzeichnis

How to Create a Static Site Generator with Go

Dann starten Sie den Generator:

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)
}
Nach dem Login kopieren

Es konvertiert die Markdown-Datei in eine HTML-Datei und speichert sie im Ausgabeverzeichnis

Wie Sie sehen können, werden Formatierungen hinzugefügt, um es optisch ansprechend zu gestalten :)

How to Create a Static Site Generator with Go

Achten Sie auf Änderungen

Beobachter aktivieren:

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
}
Nach dem Login kopieren

How to Create a Static Site Generator with Go


Und das ist es!

Diese SSG konvertiert Markdown in sauberes HTML, überwacht Änderungen und sorgt für die Organisation Ihrer Inhalte. Schreiben Sie einen Kommentar, wenn Sie damit etwas bauen – ich würde gerne sehen, was Sie schaffen!

Fanden Sie das hilfreich? Sie können mir einen Kaffee spendieren, um weitere Go-Tutorials zu unterstützen! ☕

Viel Spaß beim Codieren! ?

How to Create a Static Site Generator with Go Tabintel / Static-Site-Generator

Statischer Site-Generator

Ein schneller und einfacher statischer Site-Generator, geschrieben in Go.




Auf GitHub ansehen


Das obige ist der detaillierte Inhalt vonSo erstellen Sie einen statischen Site-Generator mit Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage