Rumah pembangunan bahagian belakang Golang Cara Membuat Penjana Tapak Statik dengan Go

Cara Membuat Penjana Tapak Statik dengan Go

Dec 16, 2024 am 04:51 AM

Penjana tapak statik ialah alatan berkuasa yang memudahkan penciptaan tapak web yang ringan, pantas dan berskala. Sama ada anda membina blog, dokumentasi atau tapak perniagaan kecil, mereka mengubah kandungan yang ditulis dalam Markdown menjadi fail HTML statik yang cekap.

Dalam panduan ini, kami akan mencipta Penjana Tapak Statik (SSG) dalam Go, bahasa pengaturcaraan yang terkenal dengan prestasi, kesederhanaan dan keselarasannya. Kami akan membina alat CLI yang mengambil fail Markdown sebagai input, memprosesnya menggunakan templat HTML yang dipratentukan dan menghasilkan halaman HTML statik yang cantik.


Mengapa Membina Ini?

Penjana tapak statik boleh digunakan untuk beberapa tujuan praktikal:

  • Tapak Dokumentasi: Jana tapak pemuatan pantas untuk dokumentasi teknikal.
  • Blog: Tulis kandungan anda dalam Markdown dan gunakannya dengan mudah.
  • Prototaip: Putar tapak statik dengan pantas untuk projek kecil atau pameran.

Mengapa menggunakan Go untuk projek ini?

  • Kelajuan: Pergi kompilasi ke kod mesin asli, menjadikan alat seperti ini sangat pantas.
  • Concurrency: Go memudahkan untuk memproses berbilang fail serentak.
  • Kesederhanaan: Sintaks Go adalah minimum dan membina alatan CLI adalah mudah.

Saya seronok membina projek ini :)

Persediaan Projek

Sebelum menyelami kod, mari kita gariskan struktur projek:

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/
Salin selepas log masuk
Salin selepas log masuk

Jika anda ingin membina dari awal, jalankan arahan ini untuk memulakan modul Go untuk projek

go mod init
Salin selepas log masuk
Salin selepas log masuk

Ciri Utama:

  • Tukar Markdown kepada HTML ?

  • YAML frontmatter untuk penghuraian metadata

  • Templat HTML untuk output boleh disesuaikan

  • Pengesanan perubahan fail masa nyata dengan pemerhati ?

Membina Projek

1. Klon Repositori

Sebelum memulakan, klon repositori ke mesin tempatan anda:

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator
Salin selepas log masuk
Salin selepas log masuk

How to Create a Static Site Generator with Go Tabintel / penjana tapak statik

Penjana Tapak Statik

Penjana tapak statik yang pantas dan ringkas ditulis dalam Go.




Lihat di GitHub


Ini akan memberi anda semua fail permulaan dan struktur projek yang diperlukan untuk membina dan menjalankan SSG.


2. Penghurai Markdown

Penghurai Markdown mengendalikan penukaran fail .md kepada kandungan HTML. Ia juga mendayakan ciri lanjutan seperti ID pengepala automatik.

dalaman/penghuraikan/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/
Salin selepas log masuk
Salin selepas log masuk

✨Menukar kandungan Markdown ke dalam format HTML dengan sokongan ciri lanjutan.


3. Penghurai Frontmatter

Penghurai frontmatter mengekstrak metadata seperti tajuk, tarikh, teg dan penerangan daripada fail Markdown.

dalaman/penghuraikan/frontmatter.go

go mod init
Salin selepas log masuk
Salin selepas log masuk

? Mengekstrak dan mengembalikan metadata bersama-sama dengan kandungan fail Markdown.


4. Penjana HTML

Penjana HTML menggunakan pakej html/templat Go untuk membuat halaman HTML statik berdasarkan templat.

dalaman/generator/html.go

git clone https://github.com/Tabintel/static-site-generator.git
cd static-site-generator
Salin selepas log masuk
Salin selepas log masuk

? Menjana fail HTML daripada templat dan menghuraikan kandungan Markdown.


5. Pemerhati Fail

Pemerhati kami memantau kandungan/ direktori untuk perubahan dan mencetuskan pembinaan semula secara automatik.

Ini dibina menggunakan https://github.com/fsnotify/fsnotify

dalaman/pemerhati/pemerhati.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),
    }
}
Salin selepas log masuk

? Mengesan perubahan fail dan mengautomasikan penjanaan semula fail statik.


6. Aplikasi Utama

Titik masuk menghubungkan semua komponen bersama-sama dan menyediakan pilihan CLI untuk penyesuaian.

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
}
Salin selepas log masuk

Penggunaan

Sebelum anda menjalankan apl itu, cipta fail penurunan nilai menggunakan .md dan simpan dalam direktori kandungan

How to Create a Static Site Generator with Go

Kemudian jalankan penjana:

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)
}
Salin selepas log masuk

Ia menukarkan fail markdown kepada fail HTML dan menyimpannya dalam direktori output

Seperti yang anda lihat, ia menambahkan pemformatan untuk menjadikannya menarik secara visual :)

How to Create a Static Site Generator with Go

Perhatikan Perubahan

Dayakan pemerhati:

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
}
Salin selepas log masuk

How to Create a Static Site Generator with Go


Dan itu sahaja!

SSG ini menukar penurunan nilai kepada HTML yang bersih, melihat perubahan dan memastikan kandungan anda teratur. Lepaskan ulasan jika anda membina sesuatu dengannya - Saya ingin melihat apa yang anda buat!

Temui ini membantu? Anda boleh membelikan saya kopi untuk menyokong lebih banyak tutorial Go! ☕

Selamat pengekodan! ?

How to Create a Static Site Generator with Go Tabintel / penjana tapak statik

Penjana Tapak Statik

Penjana tapak statik yang pantas dan ringkas ditulis dalam Go.




Lihat di GitHub


Atas ialah kandungan terperinci Cara Membuat Penjana Tapak Statik dengan Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1672
14
Tutorial PHP
1277
29
Tutorial C#
1257
24
Golang vs Python: Prestasi dan Skala Golang vs Python: Prestasi dan Skala Apr 19, 2025 am 12:18 AM

Golang lebih baik daripada Python dari segi prestasi dan skalabiliti. 1) Ciri-ciri jenis kompilasi Golang dan model konkurensi yang cekap menjadikannya berfungsi dengan baik dalam senario konvensional yang tinggi. 2) Python, sebagai bahasa yang ditafsirkan, melaksanakan perlahan -lahan, tetapi dapat mengoptimumkan prestasi melalui alat seperti Cython.

Golang dan C: Konvensyen vs kelajuan mentah Golang dan C: Konvensyen vs kelajuan mentah Apr 21, 2025 am 12:16 AM

Golang lebih baik daripada C dalam kesesuaian, manakala C lebih baik daripada Golang dalam kelajuan mentah. 1) Golang mencapai kesesuaian yang cekap melalui goroutine dan saluran, yang sesuai untuk mengendalikan sejumlah besar tugas serentak. 2) C Melalui pengoptimuman pengkompil dan perpustakaan standard, ia menyediakan prestasi tinggi yang dekat dengan perkakasan, sesuai untuk aplikasi yang memerlukan pengoptimuman yang melampau.

Bermula dengan Go: Panduan Pemula Bermula dengan Go: Panduan Pemula Apr 26, 2025 am 12:21 AM

GoisidealforbeginnersandSuekableforcloudandnetworkservicesduetoitssimplicity, kecekapan, danconcurrencyfeatures.1) installgofromtheofficialwebsiteandverifywith'goversion'.2)

Golang vs C: Perbandingan Prestasi dan Kelajuan Golang vs C: Perbandingan Prestasi dan Kelajuan Apr 21, 2025 am 12:13 AM

Golang sesuai untuk pembangunan pesat dan senario serentak, dan C sesuai untuk senario di mana prestasi ekstrem dan kawalan peringkat rendah diperlukan. 1) Golang meningkatkan prestasi melalui pengumpulan sampah dan mekanisme konvensional, dan sesuai untuk pembangunan perkhidmatan web yang tinggi. 2) C mencapai prestasi muktamad melalui pengurusan memori manual dan pengoptimuman pengkompil, dan sesuai untuk pembangunan sistem tertanam.

Golang vs Python: Perbezaan dan Persamaan Utama Golang vs Python: Perbezaan dan Persamaan Utama Apr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Golang dan C: Perdagangan dalam prestasi Golang dan C: Perdagangan dalam prestasi Apr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Perlumbaan Prestasi: Golang vs C Perlumbaan Prestasi: Golang vs C Apr 16, 2025 am 12:07 AM

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golang vs Python: Kebaikan dan Kekejangan Golang vs Python: Kebaikan dan Kekejangan Apr 21, 2025 am 12:17 AM

Golangisidealforbuildingscalablesystemsduetoitseficiencyandcurrency, whilepythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.golang'sdesignencouragescouragescouragescouragescourageSlean, readablecodeanditsouragescouragescourscean,

See all articles