# Starlight 与 Htmlpress 对比

> 单一二进制文件构建的纯 HTML 页面与面向文档的 Astro Islands。

[Starlight](https://starlight.astro.build) 是 Astro 官方的文档主题，由 Astro 团队维护。它采用 Astro 的孤岛架构（默认零 JavaScript，交互组件按需启用），并支持 MDX 内容。

## 概览

| 维度       | Htmlpress                            | Starlight                                      |
| -------- | ------------------------------------ | ---------------------------------------------- |
| 语言 / 运行时 | Rust（单一二进制文件，无运行时）                   | TypeScript / Node 18+                          |
| UI 框架    | 无（纯 HTML + CSS，`htmlpress-*` Web 组件） | Astro 组件（HTML 优先），可选 React/Vue/Svelte/Solid 孤岛 |
| 构建工具     | htmlpress 二进制文件                      | Astro（底层基于 Vite）                               |
| 内容格式     | HTML 和 Markdown 页面                   | Markdown + MDX + MDoc                          |
| 许可证      | MIT，自托管                              | MIT，自托管                                        |
| 输出模式     | 预渲染静态页面                              | 预渲染静态页面（可通过适配器实现 SSR）                          |

## 架构

htmlpress 是一个 Rust 二进制文件，可从 npm（`gethtmlpress`）、PyPI 或 crates.io 安装。它用一个布局包裹每个 HTML 页面，并配上导航和主题；没有打包器、没有 UI 框架，也没有插件 API。每个内置文件——布局、样式、脚本以及每个组件——都可以被覆盖：在 `.htmlpress/` 下的相同路径放一个文件即可替换它。

htmlpress 页面在构建时渲染为 HTML，不进行任何水合：交互式的 `htmlpress-*` 组件是自定义元素，各自带一个小巧的原生脚本，只会链接到使用它们的页面。

Starlight 采用 Astro 的孤岛模型：页面在构建时渲染为 HTML，默认零 JavaScript。交互组件是显式声明的“孤岛”，按需进行水合。Starlight 的默认主题主要由 Astro 组件构成（没有客户端 JS）；使用 React/Vue/Svelte 需要主动启用。Astro 的组件模型是 Astro 自有的 `.astro` 语法（HTML + JS frontmatter，经静态分析）。

在 htmlpress 这边，内容布局不受约束：它按 glob 扫描（`htmlpress.yaml` 中的 `include`/`exclude`，默认扫描所有 `.html` 文件），页面的 URL 取决于它在 glob 基础目录下的文件路径，因此 `docs/**/*.html` 会把 `docs/guide.html` 发布在 `/guide/`。不要求存在 `docs/` 文件夹。导航由文件夹结构和每个页面的 `<meta name="order">` 构建；文件夹的 `index.html` 为其分组命名。Starlight 要求内容放在 `src/content/docs/`（Astro 的内容集合目录）中，路由由该根目录下的文件路径推导而来。

## 内容层面

Starlight 接受带 frontmatter 的 Markdown + MDX，另外还支持 MDoc（Markdoc），用于带自定义标签的结构化、可校验内容。`.mdx` 文件中的组件默认是 Astro 组件；框架组件（React 等）需要显式的 `client:*` 指令才能水合。

htmlpress 页面是纯语义化 HTML，主题直接根据元素本身设置样式。更丰富的区块是 `htmlpress-*` 自定义元素（`htmlpress-callout`、`htmlpress-tabs`、`htmlpress-filetree`、`htmlpress-cards` 等），其 CSS 和 JS 只会链接到使用该标签的页面。项目可以通过 `.htmlpress/components/<name>/<name>.html` 添加自己的标签，它会在构建时替换该标签。

htmlpress 没有 frontmatter：页面的元数据就是它自己的 `<head>`——`<title>`、`<meta name="description">`、`<meta name="order">`、`<meta name="layout">` 和 `<meta name="image">`；其他 `<head>` 标签会原样保留。Starlight 使用 frontmatter：`title`、`description`、`sidebar`、`tableOfContents`、`editUrl`、`lastUpdated`。

## 功能矩阵

| 功能        | Htmlpress                                  | Starlight                  |
| --------- | ------------------------------------------ | -------------------------- |
| 版本管理      | 部分支持（每个版本一个分区或一次部署）                        | 否（社区插件）                    |
| 国际化（i18n） | 是（翻译、语言选择器、内置 7 种界面语言）                     | 是（内置）                      |
| 搜索        | 是（内置，客户端）                                  | 是（Pagefind，内置）             |
| 默认零 JS    | 否（小巧的原生脚本，无框架）                             | 是（孤岛架构）                    |
| 博客        | 否                                          | 否（使用 Astro 的内容集合）          |
| 更新日志      | 否                                          | 否                          |
| 站点地图      | 是（需设置 `site`）                              | 是                          |
| RSS       | 否                                          | 通过 `@astrojs/rss` 集成       |
| 主题        | `.htmlpress/` 中的覆盖文件 + `--htmlpress-*` 令牌  | 通过 Starlight 插槽覆盖组件        |
| 插件        | 否（使用 `.htmlpress/components/` 中的项目组件）      | Astro 集成 + Starlight 插件    |
| 自定义路由     | 任意 `.html` 文件；额外布局放在 `.htmlpress/layouts/` | 与 Starlight 内容并存的 Astro 页面 |

## 输出与部署

两者都会生成一个包含静态 HTML 和资源文件的目录。Starlight 默认输出到 `dist/`；htmlpress 输出到 `.htmlpress/build/`。

htmlpress 会把每个页面写成 `.htmlpress/build/` 中的静态 HTML，同时生成 `robots.txt`、设置了 `site` 时的 `sitemap.xml`、每个页面的 Markdown 副本、`llms.txt`，以及 `.well-known/agent-skills/` 下的智能体技能。`base` 键可让站点在子路径下提供服务。各托管平台的指南见[部署](/zh/deployment/)。

Starlight 沿用 Astro 的适配器体系，支持在 Cloudflare、Netlify、Vercel、Node 和 Deno 上进行 SSR。htmlpress 没有服务端模式：构建结果只能是静态的。

## 另请参阅

- [编写](/zh/authoring/)——htmlpress 的 HTML 编写方式。
- [自定义](/zh/customization/)——htmlpress 的配置键与覆盖文件。
- [对比](/zh/comparison/)——返回索引。
