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.
Ein statischer Site-Generator kann mehreren praktischen Zwecken dienen:
Es hat mir viel Spaß gemacht, dieses Projekt zu erstellen :)
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/
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
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 ?
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
Ein schneller und einfacher statischer Site-Generator, geschrieben in Go.
Dadurch erhalten Sie alle Starterdateien und die Projektstruktur, die zum Erstellen und Ausführen des SSG erforderlich sind.
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/
✨Konvertiert Markdown-Inhalte in das HTML-Format mit erweiterter Funktionsunterstützung.
Der Frontmatter-Parser extrahiert Metadaten wie Titel, Datum, Tags und Beschreibung aus Markdown-Dateien.
internal/parser/frontmatter.go
go mod init
? Extrahiert und gibt Metadaten zusammen mit dem Inhalt der Markdown-Datei zurück.
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
? Erzeugt HTML-Dateien aus Vorlagen und geparsten Markdown-Inhalten.
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), } }
? Erkennt Dateiänderungen und automatisiert die Neugenerierung statischer Dateien.
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 }
Bevor Sie die App ausführen, erstellen Sie eine Markdown-Datei mit .md und speichern Sie sie im Inhaltsverzeichnis
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) }
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 :)
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 }
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! ?
Ein schneller und einfacher statischer Site-Generator, geschrieben in Go.
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!