Maison développement back-end Golang Comment créer un générateur de site statique avec Go

Comment créer un générateur de site statique avec Go

Dec 16, 2024 am 04:51 AM

Les générateurs de sites statiques sont des outils puissants qui simplifient la création de sites Web légers, rapides et évolutifs. Que vous créiez des blogs, de la documentation ou des sites pour petites entreprises, ils transforment le contenu écrit en Markdown en fichiers HTML statiques et efficaces.

Dans ce guide, nous allons créer un Générateur de site statique (SSG) dans Go, un langage de programmation réputé pour ses performances, sa simplicité et sa concurrence. Nous allons créer un outil CLI qui prend les fichiers Markdown en entrée, les traite à l'aide d'un modèle HTML prédéfini et génère de belles pages HTML statiques.


Pourquoi construire ceci ?

Un générateur de site statique peut servir à plusieurs fins pratiques :

  • Sites de documentation : générez des sites à chargement rapide pour la documentation technique.
  • Blogs : rédigez votre contenu dans Markdown et déployez-le sans effort.
  • Prototypage : créez rapidement des sites statiques pour de petits projets ou des vitrines.

Pourquoi utiliser Go pour ce projet ?

  • Vitesse : Go compile en code machine natif, créant des outils comme celui-ci incroyablement rapides.
  • Concurrency : Go facilite le traitement simultané de plusieurs fichiers.
  • Simplicité : la syntaxe de Go est minimale et la création d'outils CLI est simple.

J'ai eu beaucoup de plaisir à construire ce projet :)

Configuration du projet

Avant de plonger dans le code, décrivons la structure du projet :

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/
Copier après la connexion
Copier après la connexion

Si vous souhaitez construire à partir de zéro, exécutez cette commande pour initialiser un module Go pour le projet

go mod init
Copier après la connexion
Copier après la connexion

Principales caractéristiques :

  • Convertir Markdown en HTML ?

  • Principe YAML pour l'analyse des métadonnées

  • Modèles HTML pour une sortie personnalisable

  • Détection des modifications de fichiers en temps réel avec un observateur ?

Construire le projet

1. Cloner le référentiel

Avant de commencer, clonez le référentiel sur votre machine locale :

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator
Copier après la connexion
Copier après la connexion

How to Create a Static Site Generator with Go Tabintel / générateur de site statique

Générateur de sites statiques

Un générateur de site statique rapide et simple écrit en Go.




Voir sur GitHub


Cela vous donnera tous les fichiers de démarrage et la structure du projet nécessaires pour créer et exécuter le SSG.


2. Analyseur de démarques

L'analyseur Markdown gère la conversion des fichiers .md en contenu HTML. Il permet également des fonctionnalités étendues telles que les identifiants de titre automatiques.

interne/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/
Copier après la connexion
Copier après la connexion

✨Convertit le contenu Markdown au format HTML avec prise en charge de fonctionnalités étendues.


3. Analyseur de frontmatière

L'analyseur de frontmatter extrait les métadonnées telles que le titre, la date, les balises et la description des fichiers Markdown.

interne/parser/frontmatter.go

go mod init
Copier après la connexion
Copier après la connexion

? Extrait et renvoie les métadonnées ainsi que le contenu du fichier Markdown.


4. Générateur HTML

Le générateur HTML utilise le package html/template de Go pour créer des pages HTML statiques basées sur un modèle.

interne/générateur/html.go

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator
Copier après la connexion
Copier après la connexion

? Génère des fichiers HTML à partir de modèles et de contenu Markdown analysé.


5. Observateur de fichiers

Notre observateur surveille le répertoire content/ pour détecter les modifications et déclenche automatiquement les reconstructions.

Ceci est construit en utilisant https://github.com/fsnotify/fsnotify

interne/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),
    }
}
Copier après la connexion

? Détecte les modifications de fichiers et automatise la régénération des fichiers statiques.


6. Application principale

Le point d'entrée relie tous les composants ensemble et fournit des options CLI pour la personnalisation.

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
}
Copier après la connexion

Usage

Avant d'exécuter l'application, créez un fichier markdown à l'aide de .md et enregistrez-le dans le répertoire de contenu

How to Create a Static Site Generator with Go

Ensuite, lancez le générateur :

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)
}
Copier après la connexion

Il convertit le fichier markdown en fichier HTML et l'enregistre dans le répertoire de sortie

Comme vous pouvez le voir, il ajoute une mise en forme pour le rendre visuellement attrayant :)

How to Create a Static Site Generator with Go

Surveillez les changements

Activer l'observateur :

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
}
Copier après la connexion

How to Create a Static Site Generator with Go


Et c'est tout !

Ce SSG convertit le markdown en HTML propre, surveille les changements et maintient votre contenu organisé. Déposez un commentaire si vous construisez quelque chose avec - j'aimerais voir ce que vous créez !

Vous avez trouvé cela utile ? Vous pouvez m'offrir un café pour soutenir davantage de tutoriels Go ! ☕

Bon codage ! ?

How to Create a Static Site Generator with Go Tabintel / générateur de site statique

Générateur de sites statiques

Un générateur de site statique rapide et simple écrit en Go.




Voir sur GitHub


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les vulnérabilités de Debian OpenSSL Quelles sont les vulnérabilités de Debian OpenSSL Apr 02, 2025 am 07:30 AM

OpenSSL, en tant que bibliothèque open source largement utilisée dans les communications sécurisées, fournit des algorithmes de chiffrement, des clés et des fonctions de gestion des certificats. Cependant, il existe des vulnérabilités de sécurité connues dans sa version historique, dont certaines sont extrêmement nocives. Cet article se concentrera sur les vulnérabilités et les mesures de réponse communes pour OpenSSL dans Debian Systems. DebianopenSSL CONNUTS Vulnérabilités: OpenSSL a connu plusieurs vulnérabilités graves, telles que: la vulnérabilité des saignements cardiaques (CVE-2014-0160): cette vulnérabilité affecte OpenSSL 1.0.1 à 1.0.1F et 1.0.2 à 1.0.2 Versions bêta. Un attaquant peut utiliser cette vulnérabilité à des informations sensibles en lecture non autorisées sur le serveur, y compris les clés de chiffrement, etc.

Comment spécifier la base de données associée au modèle de Beego ORM? Comment spécifier la base de données associée au modèle de Beego ORM? Apr 02, 2025 pm 03:54 PM

Dans le cadre du cadre de beegoorm, comment spécifier la base de données associée au modèle? De nombreux projets Beego nécessitent que plusieurs bases de données soient opérées simultanément. Lorsque vous utilisez Beego ...

Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Apr 02, 2025 am 09:12 AM

Chemin d'apprentissage du backend: le parcours d'exploration du front-end à l'arrière-end en tant que débutant back-end qui se transforme du développement frontal, vous avez déjà la base de Nodejs, ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Comment configurer l'expansion automatique de MongoDB sur Debian Comment configurer l'expansion automatique de MongoDB sur Debian Apr 02, 2025 am 07:36 AM

Cet article présente comment configurer MongoDB sur Debian System pour réaliser une expansion automatique. Les étapes principales incluent la configuration de l'ensemble de répliques MongoDB et de la surveillance de l'espace disque. 1. Installation de MongoDB Tout d'abord, assurez-vous que MongoDB est installé sur le système Debian. Installez à l'aide de la commande suivante: SudoaptupDaSudoaptInstall-myongoDB-Org 2. Configuration de la réplique MongoDB Ensemble de répliques MongoDB assure la haute disponibilité et la redondance des données, ce qui est la base de la réalisation d'une expansion de capacité automatique. Démarrer le service MongoDB: Sudosystemctlstartmongodsudosys

See all articles