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

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

Susan Sarandon
发布: 2024-12-16 04:51:13
原创
277 人浏览过

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

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板