sebastienrousseau/static-site-generator

GitHub: sebastienrousseau/static-site-generator

一款用 Rust 构建的 AI 增强、无障碍优先的高性能静态站点生成器,支持大规模流式编译与安全加固。

Stars: 52 | Forks: 4

SSG logo

静态站点生成器 (SSG)

使用 Rust 构建的 AI 增强、无障碍优先的静态站点生成器。

Build Crates.io Docs.rs Coverage lib.rs

## 目录 - [安装](#install) -- Cargo, Homebrew, apt, AUR, 一键脚本 - [快速开始](#quick-start) -- 30秒搭建站点 - [概述](#overview) -- SSG 的功能 - [架构](#architecture) -- 构建 pipeline 图表 - [基准测试](#benchmarks) -- 性能与测试套件指标 - [功能](#features) -- v0.0.44 能力矩阵 - [命令行接口](#the-cli) -- 参数与用法 - [库用法](#library-usage) -- 插件、schema、AI pipeline - [示例](#examples) -- 8 个品牌示例 - [开发](#development) -- make 目标、CI 工作流 - [安全性](#security) -- 安全保证与合规性 - [许可证](#license) ## 安装 ``` [dependencies] ssg = "0.0.44" ``` ### 预编译二进制文件 ``` # macOS / Linux -- 单条命令 curl -fsSL https://raw.githubusercontent.com/sebastienrousseau/static-site-generator/main/scripts/install.sh | sh # Homebrew brew install --formula https://raw.githubusercontent.com/sebastienrousseau/static-site-generator/main/packaging/homebrew/ssg.rb # Cargo cargo install ssg # Debian / Ubuntu sudo dpkg -i ssg_0.0.44_amd64.deb # Arch Linux (AUR) yay -S ssg # Container docker pull ghcr.io/sebastienrousseau/static-site-generator:latest ``` ### 从源码构建 ``` git clone https://github.com/sebastienrousseau/static-site-generator.git cd static-site-generator make # check + clippy + test ``` 要求 **Rust 1.88.0+**。已在 Linux、macOS 和 Windows 上测试。 ## 快速开始 ``` # 1 -- 安装 cargo install ssg # 2 -- 搭建新站点 ssg -n mysite -c content -o build -t templates # 3 -- 构建 ssg -c content -o public -t templates # 4 -- 带有实时重载的开发服务器 ssg -c content -o public -t templates -s public -w # 5 -- 基于 AI 的可读性修复(需要 Ollama) ssg -c content -o public -t templates --ai-fix ``` ## 概述 SSG 从 Markdown 内容、YAML frontmatter 和 `MiniJinja` 模板生成静态网站。它将所有内容编译为可直接用于生产环境的 HTML,内置 SEO 元数据、WCAG 2.2 AA 无障碍合规性(包括在可自动化情况下的新增 2.5.8、2.4.13、3.2.6 标准)、多语言可读性评分以及 feed 生成。33 个插件的 pipeline 负责处理其余工作。 - **33 个插件的 pipeline** -- SEO、a11y、i18n、搜索、图像、AI、CSP、JSON-LD、RSS、站点地图 - **Agentic AI pipeline** -- 通过本地 LLM 审核、诊断、修复和验证内容可读性 - **多语言可读性** -- Flesch-Kincaid (EN), Kandel-Moles (FR), Wiener Sachtextformel (DE), Gulpease (IT), LIX (SV), Fernandez Huerta (ES) - **增量构建** -- 通过 FNV-1a 哈希和依赖图进行内容指纹识别 - **流式编译** -- 支持 10 万+ 页面站点的可配置内存预算 - **WCAG 2.2 AA** -- 每次构建时进行无障碍检查(默认不阻塞;报告写入 `accessibility-report.json` + `wcag-compliance.json`),并在 CI 中由 axe-core 进行门控。可通过 `STRICT_A11Y` 环境变量选择在出现 a11y 违规时导致构建失败(在 v0.0.40 中实现) - **零不安全代码** -- 整个代码库均遵循 `#![forbid(unsafe_code)]` ## 架构 ``` graph TD A[Content: Markdown + YAML] --> B{SSG CLI} B --> V[Content Schema Validation] V --> C[Incremental Cache + `DepGraph`] C --> D[Compile: staticdatagen] D --> E[Post-Processing Fixes] E --> F[Fused Transform Pipeline: 33 plugins] F --> G[Output: HTML + RSS + Atom + Sitemap + JSON-LD] B --> H[File Watcher + CSS HMR] H -->|changed files| C B -->|--serve| S[Dev Server + Live Reload + Error Overlay] B -->|--ai-fix| AI[Agentic LLM Pipeline] AI -->|audit + fix| A ``` ## 基准测试 | 指标 | 数值 | | :--- | :--- | | **源码** | 跨 38 个模块共 39,103 行代码 | | **测试套件** | 2,250 个单元测试 + 14 个集成测试套件 | | **覆盖率** | 95% 区域,95% 行,95% 函数 | | **插件 pipeline** | 33 个插件,使用 Rayon 并行化 | | **示例** | 8 个品牌示例 | | **依赖项** | 15 个运行时依赖 | | **MSRV** | Rust 1.88.0 | ### 构建性能 | 页面数 | 时间 | 内存 | |-------|------|--------| | 100 | < 5秒 (CI 门控) | < 100 MB | | 1,000 | < 10秒 | < 200 MB | | 10,000 | 流式批处理 | 512 MB 预算 | | 100,000+ | 流式编译 | 可通过 `--max-memory` 配置 | 重现:`cargo bench --bench bench -- scalability`。 ## 功能 | | | | :--- | :--- | | **性能** | 使用 Rayon 进行并行文件操作,融合的单遍 HTML 转换,内容寻址缓存 (FNV-1a),用于增量重建的依赖图,支持 10 万+ 页面的流式编译,`--jobs N` 线程控制,`--max-memory MB` 预算 | | **AI Pipeline** | Agentic LLM pipeline (`--ai-fix`):审核内容可读性,诊断失败文件,通过本地 LLM (Ollama) 生成修复,验证改进,生成 JSON 报告。试运行模式 (`--ai-fix-dry-run`)。通过 LLM 自动生成 alt 文本、meta 描述和 JSON-LD | | **可读性** | 多语言评分:Flesch-Kincaid (EN), Kandel-Moles (FR), Wiener Sachtextformel (DE), Gulpease (IT), LIX (SV/NO/DA), Fernandez Huerta (ES)。基于 frontmatter 的 BCP 47 语言检测。CI 可读性门控 | | **内容** | 支持 GFM 扩展(表格、删除线、任务列表)的 Markdown,YAML/TOML/JSON frontmatter,带有编译时验证的强类型内容 schema,短代码(youtube、gist、figure、admonition),编译时字数统计和预计阅读时间注入 `.meta.json` 附属文件 | | **SEO** | Meta 描述,Open Graph(标题、描述、类型、url、图像、区域设置),自动生成的 OG 社交卡片 (SVG),Twitter Cards,规范 URL,robots.txt,包含每页 lastmod 的站点地图,一流的主题集群分类法(hub + pillar 索引),通过 `Jaccard` 标签/分类重叠发现相关文章 | | **结构化数据** | 包含 datePublished、dateModified、author、image、inLanguage、`BreadcrumbList` 的 JSON-LD Article/WebPage | | **聚合分发** | 带有 enclosures 和 categories 的 RSS 2.0,Atom 1.0,Google News 站点地图 | | **无障碍** | 每次构建时进行 WCAG 2.2 AA 验证 (1.1.1, 1.3.1, 2.3.1, 2.4.4, 2.4.13, 2.5.8, 3.1.1, 3.2.6),基于 axe-core Playwright 的 CI,装饰性图像检测,标题层级,ARIA landmarks;输出 `wcag-compliance.json` 矩阵([WCAG 2.2 + EAA 指南](docs/guide/wcag-compliance.md)) | | **i18n** | Hreflang 注入,`x-default` 支持,特定于区域设置的站点地图,语言切换器 HTML | | **图像** | 支持 WebP 源的响应式 ``,320/640/1024/1440 处的 `srcset`,懒加载,CLS 预防,可选的 `cdn_prefix` 用于从 CDN 主机提供本地图像资源 | | **模板** | `MiniJinja` 引擎,支持继承、循环、条件判断、自定义过滤器 | | **搜索** | 带有模态 UI 的客户端全文搜索,28 种区域设置翻译,`Ctrl+K` / `Cmd+K` | | **安全性** | CSP 构建时提取(零 `unsafe-inline`),SRI 哈希生成,资源指纹识别,防止路径遍历,结构化的 `SsgError` 类型安全错误层级 | | **代码压缩** | 原生 HTML / JS / CSS 压缩(可选 `minify` 功能),通过 [`minify-html`](https://crates.io/crates/minify-html/0.15.0) `0.15`(HTML,保留 `
`),[`oxc_minifier`](https://crates.io/crates/oxc_minifier/0.95.0) `0.95`(JS,mangle + DCE)和 [`lightningcss`](https://crates.io/crates/lightningcss/1.0.0-alpha.71) `1.0.0-alpha.71`(CSS)。递归遍历会处理 `site_dir` 下所有深度的 `.html`、`.css` 和 `.js` 文件。 |

| **供应链** | 每次构建时通过 `SbomPlugin` 自动生成 `CycloneDX` 1.5 SBOM (`sbom.cdx.json`),列出编译器版本、依赖树和许可证元数据 |

| **开发者体验** | CSS 热重载,通过 WebSocket 实现的浏览器错误覆盖层,带有更改分类的文件监视 |

| **WebAssembly** | ssg-core + ssg-wasm 使用 wasm-bindgen 编译为 `wasm32-unknown-unknown` |

| **Islands** | 支持延迟水合的 Web Components |

### 为什么选择 SSG?

| 能力 | SSG | Hugo | Zola | Astro |

|---|---|---|---|---|

| Agentic AI pipeline | 是 | 否 | 否 | 否 |

| 多语言可读性 | 是 | 否 | 否 | 否 |

| 自动生成 OG 图像 | 是 | 否 | 否 | 插件 |

| 内置 WCAG 验证 | 是 | 否 | 否 | 否 |

| CSP/SRI 自动提取 | 是 | 否 | 否 | 插件 |

| axe-core CI 门控 | 是 | 否 | 否 | 否 |

| WebAssembly 目标 | 是 | 否 | 否 | N/A |

| 95% CI 覆盖率下限 | 是 | 否 | 否 | 否 |

| 零不安全代码 | 是 | 是 | 是 | N/A |



## 命令行接口


```
Usage: ssg [OPTIONS]



Options:

  -f, --config       Configuration file path

  -n, --new          Create new project

  -c, --content       Content directory

  -o, --output        Output directory

  -t, --template      Template directory

  -s, --serve         Start development server

  -w, --watch              Watch for changes and rebuild

  -j, --jobs            Rayon thread count (default: num_cpus)

      --max-memory     Peak memory budget for streaming (default: 512)

      --ai-fix             Run agentic AI pipeline to fix content readability

      --ai-fix-dry-run     Preview AI fixes without writing changes

      --validate           Validate content schemas and exit

      --drafts             Include draft pages in the build

      --deploy     Generate deployment config (netlify, vercel, cloudflare, github)

  -q, --quiet              Suppress non-error output

      --verbose            Show detailed build information

  -h, --help               Print help

  -V, --version            Print version
```




## 库用法

最小化 pipeline ``` fn main() -> Result<(), ssg::error::SsgError> { ssg::run() } ```
自定义插件 ``` use ssg::plugin::{Plugin, PluginContext, PluginManager}; use ssg::error::SsgError; use std::path::Path; #[derive(Debug)] struct LogPlugin; impl Plugin for LogPlugin { fn name(&self) -> &str { "logger" } fn after_compile(&self, ctx: &PluginContext) -> Result<(), SsgError> { println!("Site compiled to {:?}", ctx.site_dir); Ok(()) } } fn main() -> Result<(), SsgError> { let mut pm = PluginManager::new(); pm.register(LogPlugin); pm.register(ssg::plugins::MinifyPlugin); let ctx = PluginContext::new( Path::new("content"), Path::new("build"), Path::new("public"), Path::new("templates"), ); pm.run_after_compile(&ctx)?; Ok(()) } ```
内容 schema 验证 创建 `content/content.schema.toml`: ``` [[schemas]] name = "post" [[schemas.fields]] name = "title" type = "string" required = true [[schemas.fields]] name = "date" type = "date" required = true [[schemas.fields]] name = "draft" type = "bool" default = "false" ``` 在 frontmatter 中带有 `schema = "post"` 的页面将在编译时进行验证。运行 `ssg --validate` 进行仅 schema 检查。
可读性审核 ``` use ssg::llm::{LlmPlugin, LlmConfig}; use std::path::Path; let report = LlmPlugin::audit_all(Path::new("content"), 8.0).unwrap(); println!("{}/{} files pass grade 8.0", report.passing, report.total_files); // Multilingual: French content uses Kandel-Moles automatically // when frontmatter contains `language: fr` ```
OG 图像生成 ``` use ssg::og_image::generate_og_svg; let svg = generate_og_svg("My Page Title", "My Site", "#1a1a2e", "#ffffff"); std::fs::write("og-card.svg", svg).unwrap(); // 1200x630 SVG social card ready for og:image ```
## 示例 运行任意示例: ``` cargo run --example basic cargo run --example blog ``` | 示例 | 用途 | | :--- | :--- | | `basic` | 包含 SEO、搜索和融合转换的最小站点 | | `quickstart` | 10 行代码实现脚手架和构建 | | `multilingual` | 包含 hreflang 和特定于区域设置站点地图的多语言站点 | | `plugins` | 带有 `DepGraph` API 的完整插件 pipeline 演示 | | `blog` | 符合 EAA 标准的、无障碍优先且带有双重 feed 的博客 | | `docs` | 带有 schema 验证和语法高亮的文档门户 | | `landing` | 带有 CSP 加固的零 JS 落地页 | | `portfolio` | 带有 JSON-LD 和 Atom feed 的开发者作品集 | ## 开发 ``` make # check + clippy + test make test # run all tests make bench # run Criterion benchmarks make lint # lint with Clippy make format # format with rustfmt make deny # supply-chain audit make doc # build API documentation make a11y # run pa11y accessibility audit make clean # remove build artifacts ``` ### CI | 工作流 | 触发条件 | 用途 | | :--- | :--- | :--- | | `ci.yml` | push, PR | fmt, clippy, test (3 OS), 覆盖率 (95% 下限), cargo-deny | | `document.yml` | push 到 main | 构建并将 API 文档部署到 GitHub Pages | | `release.yml` | tag `v*` | 跨平台二进制文件、GHCR 容器、crates.io、AUR | | `scheduled.yml` | 每周, tag | 多操作系统可移植性、pa11y a11y、`CycloneDX` SBOM、基准测试 | | `visual.yml` | PR | Playwright 屏幕截图(3 种视口)+ axe-core WCAG 2.2 AA | | `wasm.yml` | push, PR | 为 wasm32 构建并测试 ssg-core + ssg-wasm | | `readability-gate.yml` | PR | 对文档和内容进行 Flesch-Kincaid 审核 | 有关签名提交和 PR 指南,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 安全性
安全保证与合规性 - 整个代码库均遵循 `#![forbid(unsafe_code)]` - CSP 构建时提取:所有内联样式和脚本均至带有 SRI 哈希的外部文件中。零 `unsafe-inline` - 通过 `..` 检测和 symlink 拒绝来防止路径遍历 - 文件大小限制和目录深度边界 - `cargo audit` 零安全通报 - `cargo deny` -- 许可证、通报、禁令和来源检查 - 生成带有 Sigstore 证明的 `CycloneDX` SBOM 作为发布产物 - 所有源文件上的 SPDX 许可证头 - 通过 SSH ED25519 强制执行签名提交 有关完整的 CSP 安全架构,请参阅 [docs/whitepaper/csp-without-compromise.md](docs/whitepaper/csp-without-compromise.md)。
所有 38 个模块 | 模块 | 用途 | | :--- | :--- | | `accessibility` | WCAG 2.2 AA 检查器、ARIA 验证、装饰性图像检测、目标大小 + 焦点外观检查、合规性矩阵 | | `ai` | AI 就绪钩子、alt 文本验证、`llms.txt` / `llms-full.txt` 生成 | | `assets` | 资源指纹识别和 SRI 哈希生成 | | `cache` | 用于增量构建的内容指纹识别 (FNV-1a) | | `cmd` | CLI 参数解析、`SsgConfig`、输入验证 | | `content` | 内容 schema、`ContentValidationPlugin`、`--validate` | | `csp` | 将内联样式/脚本提取至外部文件的 CSP 构建时提取 | | `depgraph` | 用于增量重建的页面到模板依赖图 | | `deploy` | Netlify、Vercel、Cloudflare Pages、GitHub Pages 适配器 | | `drafts` | 草稿内容过滤 | | `frontmatter` | Frontmatter 提取和 `.meta.json` 附属文件 | | `fs_ops` | 带有遍历预防的安全文件操作 | | `highlight` | 代码块的语法高亮 | | `i18n` | Hreflang 注入、特定于区域设置的站点地图、语言切换器 | | `image_plugin` | 支持 WebP 的响应式 ``、srcset 生成 | | `islands` | 支持延迟水合的 Web Components | | `livereload` | WebSocket 实时重载、CSS HMR、浏览器错误覆盖层 | | `llm` | 本地 LLM pipeline (Ollama)、多语言可读性评分、agentic 修复 | | `logging` | 结构化日志配置 | | `markdown_ext` | GFM 表格、删除线、任务列表 | | `og_image` | 自动生成的 OG 社交卡片 SVG | | `pagination` | 用于列表页面的分页插件 | | `pipeline` | 构建编排、插件注册、`RunOptions` | | `plugin` | 带有生命周期钩子的 `Plugin` trait、`PluginManager`、`PluginCache` | | `plugins` | `MinifyPlugin`、`ImageOptiPlugin`、`DeployPlugin` | | `postprocess` | 站点地图、RSS、Atom、manifest、HTML 后处理修复 | | `process` | 目录创建和站点处理 | | `scaffold` | 项目脚手架 (`ssg --new`) | | `schema` | 用于配置的 JSON Schema 生成器 | | `search` | 全文搜索索引、模态 UI、28 种区域设置翻译 | | `seo` | `SeoPlugin`、`JsonLdPlugin`、`CanonicalPlugin`、`RobotsPlugin` | | `server` | 开发 HTTP 服务器 | | `shortcodes` | youtube、gist、figure、admonition 扩展 | | `stream` | 高性能流式文件处理器 | | `streaming` | 针对大型站点的内存预算流式编译 | | `taxonomy` | 标签和分类索引生成 | | `template_engine` | `MiniJinja` 模板引擎集成 | | `template_plugin` | `MiniJinja` 模板渲染插件 | | `walk` | 共享的有界目录遍历器 | | `watch` | 带有更改分类的基于轮询的文件监视器 |
## 许可证 根据您的选择,受 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 或 [MIT](https://opensource.org/licenses/MIT) 双重许可。 有关发布历史,请参阅 [CHANGELOG.md](CHANGELOG.md)。

返回顶部

标签:AI工具, AI风险缓解, Rust, WebAssembly, 可视化界面, 国际化, 无障碍访问, 本地大模型, 网络流量审计, 通知系统, 静态网站生成器