靜態網站產生器是一種強大的工具,可以簡化輕量級、快速且可擴展的網站的創建。無論您是建立部落格、文件還是小型企業網站,它們都會將用 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中文網其他相關文章!