首页 后端开发 Golang 如何使用 Go 创建静态站点生成器

如何使用 Go 创建静态站点生成器

Dec 16, 2024 am 04:51 AM

静态站点生成器是功能强大的工具,可以简化轻量级、快速且可扩展的网站的创建。无论您是构建博客、文档还是小型企业网站,它们都会将用 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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Debian OpenSSL有哪些漏洞 Debian OpenSSL有哪些漏洞 Apr 02, 2025 am 07:30 AM

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Beego ORM中如何指定模型关联的数据库? Beego ORM中如何指定模型关联的数据库? Apr 02, 2025 pm 03:54 PM

在BeegoORM框架下,如何指定模型关联的数据库?许多Beego项目需要同时操作多个数据库。当使用Beego...

从前端转型后端开发,学习Java还是Golang更有前景? 从前端转型后端开发,学习Java还是Golang更有前景? Apr 02, 2025 am 09:12 AM

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...

在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? 在Go语言中使用Redis Stream实现消息队列时,如何解决user_id类型转换问题? Apr 02, 2025 pm 04:54 PM

Go语言中使用RedisStream实现消息队列时类型转换问题在使用Go语言与Redis...

GoLand中自定义结构体标签不显示怎么办? GoLand中自定义结构体标签不显示怎么办? Apr 02, 2025 pm 05:09 PM

GoLand中自定义结构体标签不显示怎么办?在使用GoLand进行Go语言开发时,很多开发者会遇到自定义结构体标签在�...

Go语言中用于浮点数运算的库有哪些? Go语言中用于浮点数运算的库有哪些? Apr 02, 2025 pm 02:06 PM

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go的爬虫Colly中Queue线程的问题是什么? Go的爬虫Colly中Queue线程的问题是什么? Apr 02, 2025 pm 02:09 PM

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

如何在Debian上配置MongoDB自动扩容 如何在Debian上配置MongoDB自动扩容 Apr 02, 2025 am 07:36 AM

本文介绍如何在Debian系统上配置MongoDB实现自动扩容,主要步骤包括MongoDB副本集的设置和磁盘空间监控。一、MongoDB安装首先,确保已在Debian系统上安装MongoDB。使用以下命令安装:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集确保高可用性和数据冗余,是实现自动扩容的基础。启动MongoDB服务:sudosystemctlstartmongodsudosys

See all articles