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

So erstellen Sie einen statischen Site-Generator mit Go

Dec 16, 2024 am 04:51 AM

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!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Wie gibt ich die mit dem Modell in Beego Orm zugeordnete Datenbank an? Wie gibt ich die mit dem Modell in Beego Orm zugeordnete Datenbank an? Apr 02, 2025 pm 03:54 PM

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...

Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Apr 02, 2025 am 09:12 AM

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

So konfigurieren Sie die automatische Expansion von MongoDB auf Debian So konfigurieren Sie die automatische Expansion von MongoDB auf Debian Apr 02, 2025 am 07:36 AM

In diesem Artikel wird vorgestellt, wie MongoDB im Debian -System konfiguriert wird, um eine automatische Expansion zu erzielen. Die Hauptschritte umfassen das Einrichten der MongoDB -Replikat -Set und die Überwachung des Speicherplatzes. 1. MongoDB Installation Erstens stellen Sie sicher, dass MongoDB im Debian -System installiert ist. Installieren Sie den folgenden Befehl: sudoaptupdatesudoaptinstall-emongoDB-org 2. Konfigurieren von MongoDB Replika-Set MongoDB Replikate sorgt für eine hohe Verfügbarkeit und Datenreduktion, was die Grundlage für die Erreichung der automatischen Kapazitätserweiterung darstellt. Start MongoDB Service: SudosystemctlstartMongodsudosysys

See all articles