静态站点生成器是功能强大的工具,可以简化轻量级、快速且可扩展的网站的创建。无论您是构建博客、文档还是小型企业网站,它们都会将用 Markdown 编写的内容转换为高效的静态 HTML 文件。
在本指南中,我们将使用 Go 创建一个 静态站点生成器 (SSG),Go 是一种以其性能、简单性和并发性而闻名的编程语言。我们将构建一个 CLI 工具,它将 Markdown 文件作为输入,使用预定义的 HTML 模板对其进行处理,并输出漂亮的静态 HTML 页面。
静态站点生成器可以满足多种实际用途:
构建这个项目我玩得很开心:)
在深入代码之前,我们先概述一下项目的结构:
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 模板
使用观察者实时文件更改检测?
开始之前,将存储库克隆到本地计算机:
git clone https://github.com/Tabintel/static-site-generator.git cd static-site-generator
用 Go 编写的快速、简单的静态站点生成器。
这将为您提供构建和运行 SSG 所需的所有入门文件和项目结构。
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 格式,并提供扩展功能支持。
frontmatter 解析器从 Markdown 文件中提取标题、日期、标签和描述等元数据。
内部/解析器/frontmatter.go
go mod init
?提取并返回元数据以及 Markdown 文件的内容。
HTML 生成器使用 Go 的 html/template 包基于模板创建静态 HTML 页面。
内部/generator/html.go
git clone https://github.com/Tabintel/static-site-generator.git cd static-site-generator
?从模板和解析的 Markdown 内容生成 HTML 文件。
我们的观察者监视内容/目录的更改并自动触发重建。
这是使用 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 文件并将其保存在内容目录中
然后运行生成器:
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 文件并将其保存在输出目录中
如您所见,它添加了格式以使其具有视觉吸引力:)
启用观察者:
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 }
就是这样!
此 SSG 将 markdown 转换为干净的 HTML,监视更改并保持您的内容井井有条。如果您用它构建了一些东西,请发表评论 - 我很想看看您创建的内容!
觉得这有帮助吗?你可以请我喝杯咖啡来支持更多Go教程! ☕
编码愉快! ?
用 Go 编写的快速、简单的静态站点生成器。
以上是如何使用 Go 创建静态站点生成器的详细内容。更多信息请关注PHP中文网其他相关文章!