配置参考
站点配置通过 absolutePress(defineSiteConfig({...})) 传入,类型定义在 src/shared/types.ts(SiteConfig)与 src/node/config.ts(AbsolutePressConfig,构建层扩展)。本文按字段逐一说明,全部以实现为准。
基础字段
contentDir(必填,string):默认 locale 的内容根目录,相对项目根title(必填,string):站点名,进入<title>、RSS、sitemapdescription(必填,string):站点描述,进入 SEO meta 与 RSS channelhostname(必填,string):规范 origin(不带尾斜杠),用于 SEO og、sitemap 与 RSS 的绝对链接,如https://absolute-docs.pages.devfavicon(可选,string):站点 favicon,相对站点 public 根解析(语义同nav.logo),如/favicon.svg;构建期输出<link rel="icon">,type按扩展名推导(ico/png/svg/webp,其余扩展名不带type),href 随页面深度加相对前缀,子路径部署不断链
locales
locales: {
en: { lang: 'en', label: 'English' },
}- 默认 locale 固定占 contentDir 根,
<html lang>默认zh-CN、切换器文案默认简体中文,可用顶层lang/label覆盖 - 其余 locale 的内容放
<contentDir>/<key>/,路由加/en前缀 - 详见多语言
iconProvider
iconProvider: 'fontawesome',内置图标源,注册表叠加在自定义 icons 之下(同名时 icons 优先)。'fontawesome' 把 Font Awesome 全部免费字形按 <pack>/<name> 注册(solid / regular / brands 三组,如 solid/rocket、brands/github),frontmatter icon 直接引用,无需逐个登记。未配置时不注册任何图标。
icons
icons: {
'my-logo': '<svg xmlns="..." viewBox="0 0 16 16" fill="currentColor">...</svg>',
}自定义图标 kv:key 是 frontmatter icon 的合法取值(构建期校验,未注册的 key 报错);value 是完整 <svg>...</svg> 字符串,或裸 SVG 内部标记(客户端会包一层 24x24 svg)。navbar/sidebar/文章卡片消费这些图标。与 iconProvider 的 key 同名时此处优先。
islands
islands: {
Counter: 'docs/islands/Counter.tsx',
}站点追加的自定义 island:PascalCase 标签名 → 相对项目根的模块路径。内置名单(Giscus/PasswordGate/ZoomedImg/Mermaid/G2Plot/ExpandableList)之外的能力入口,详见Islands。
buildComponents
buildComponents: {
disable: ['RecentArticles'],
}内置构建组件的总开关:构建组件是构建期渲染为最终静态 HTML 的 markdown 标签(清单与用法见 Markdown 扩展)。disable 按标签名关闭内置组件——被关闭的标签渲染为空并输出构建警告;未知名字在配置解析时报错并列出全部可用名。
refs
refs: ['reference', '../glossary'],术语库根目录列表(可选,单项可直接写字符串):[[id]] 术语引用语法的数据源,详见 Markdown 扩展。
- 每个条目相对各 locale 的内容根解析(默认 locale 在
<contentDir>/<条目>,其余在<contentDir>/<key>/<条目>,未命中回退默认 locale);条目可含..指向内容树之外(例如项目根旁的独立仓) - 根内
.md不参与路由;id 是相对该根、去扩展名的 posix 路径,frontmatter 只认title(缺省用 id 末段做术语文字) - 多根按配置顺序收集,id 跨根必须唯一,重复则构建报错
- 术语库常独立成仓(git 嵌套仓):根目录不存在时只打一次 warning,
[[...]]全部降级为纯文本,构建照常通过 - 术语文章内的相对链接按 locale 内容根解析(与页面同语义),任意页面深度引用都不断链
encrypt
encrypt: [
{
match: '/guide/secret', // 字符串全等匹配路由,或 RegExp.test
passwords: ['docs-demo'],
hint: '可选提示文案',
},
];客户端密码门规则数组:match 命中(字符串精确匹配或正则,避免 /g 标志)的页面正文被 PasswordGate island 包裹,输入 sha256 命中的密码后解锁,sessionStorage 按路由记住。中文等非 ASCII 路由直接写明文路径(构建期按解码后的路由匹配,正则看到的也是解码形式),不要写百分号编码。明文密码不会进入页面 payload(只输出 sha256 hex)。详见加密。
algolia
algolia: {
appId: 'XXX',
apiKey: 'xxx',
indexName: 'xxx',
}配置后主题 chrome 挂载 Algolia DocSearch 搜索框,凭证进入页面 payload。
giscus
giscus: {
repo: 'owner/repo',
repoId: 'R_xxx',
category: 'General',
categoryId: 'DIC_xxx',
}配置后文章页尾部自动挂载 Giscus 评论 island(无需在 markdown 手写标签);评论 iframe 主题随站点亮暗切换,不重载 iframe。
googleAnalytics
googleAnalytics: 'G-XXXXXXX',测量 ID 字符串,构建期注入 GA 脚本。框架会在 SPA 软导航后补发 page_view(首次加载由 GA 自身统计);请在 GA4 数据流的增强衡量里关闭「基于浏览器历史事件的页面浏览」,否则软导航会被重复计数。
nav
nav: {
exclude: ['/hide'], // 从 navbar/sidebar 排除的路由前缀(页面仍会构建)
logo: '/logo.jpg', // navbar(与移动端抽屉)的品牌图
align: 'center', // 顶层导航条对齐:'left'(默认)| 'center'
order: ['coding', 'hobbies'], // 顶层条目按内容目录名排序
tweaks: { /* 按顶层内容目录名微调 navbar 条目,见下 */ },
social: [
{ icon: 'github', url: 'https://github.com/owner/repo', title: 'GitHub' },
],
}navbar 相关配置的归拢入口:导航树由内容目录自动生成,nav.* 只对生成结果整形。
exclude: string[]:从 navbar/sidebar 排除的路由前缀(页面仍会构建);frontmatter 契约里没有 hide 键,"存在但不进导航"是站点配置的事logo: string:navbar(与移动端抽屉)的品牌图,相对站点 public 根解析('/logo.jpg'->public/logo.jpg),客户端按页面深度拼接相对前缀order: string[]:navbar 顶层条目按内容目录名排序(与tweaks同一套 key);未列出的目录与根级散页保持生成顺序,未知名字忽略align: 'left' | 'center':navbar 顶层导航条的对齐方式,'center'时在品牌区与右侧图标区之间自动等分剩余空间(默认'left')tweaks: Record<string, NavbarDirTweak>:按顶层内容目录名微调 navbar 条目。label改写导航文字(sidebar 分组标题同步沿用);groups按组排版下拉面板(带text的组渲染为静态小标题,无text的组只固定成员顺序,未列出的成员保持生成顺序追加在后面);items整体指定面板条目(如从站点数据模块派生的分区树),构建期校验每个站内链接必须指向该目录下的页面,未被任何条目链接覆盖的生成成员仍会追加在后,优先级高于groups;未显式给icon的条目回填所链页面的 frontmatter 图标。文件夹行(任意层级)导航到目录 index 页(板块名即总览):带index标记的总览行渲染在面板首行(客户端打ap-nav-index-row钩子,样式归站点 CSS)——顶层面板的总览行由构建生成,二级 folder 的总览行由客户端在其面板首行合成,folder 行本身只负责展开;index 页 frontmatteroverview: false可退出总览行(folder 行仍指向该页,sidebar 不受影响)social: { icon, url, title }[]:导航栏右侧的社交图标按钮数组,渲染在 RSS 按钮之前,固定新标签页打开。icon取已注册的图标 key(iconProvider/icons),或内建品牌 key(github/telegram/bilibili),同名时注册表优先;title用作 aria-label 与悬停提示
导航栏还固定渲染一个 RSS 按钮(链接 /rss.xml,base 自适应,title 走 i18n nav.rss);RSS 始终生成,无需配置开关。
sidebar
sidebar: {
order: ['blog', 'guide'], // 顶层分组按内容目录名排序
tweaks: {
guide: ['getting-started', 'writing', 'markdown'], // 目录内成员顺序
'guide/advanced': ['deep'], // 嵌套目录用相对内容根的路径做 key
},
}sidebar 由内容目录树完整生成,sidebar.* 只调整生成结果的顺序——条目可以重排,不能增删(隐藏页面走 nav.exclude)。
order: string[]:顶层分组按内容目录名排序,语义与nav.order相同;散页与目录都在可排之列(散页取文件名 stem)。列出的排前(按配置顺序),未知名字忽略,未列出的保持生成顺序追加在后tweaks: Record<string, string[]>:单个目录内的成员顺序。key 是目录相对内容根的路径——顶层目录就是目录名,嵌套目录用/连接(如guide/advanced);value 是成员名的有序数组,成员名不带扩展名、相对该目录(页面取文件名 stem,子目录取目录名;目录 index 页不是成员——文件夹行本身链到它)。列出的成员排前(按配置顺序),未知名字忽略,未列出的成员保持生成顺序追加在后——顺序表只重排,不会让任何条目消失
seo
seo: {
image: '/og.png', // 分享卡片图,相对站点 public 根解析或绝对 URL
author: { name: 'Alice', url: 'https://example.com/about' }, // JSON-LD 作者,url 可选
exclude: ['/hide'], // 不进入 sitemap 且 robots.txt 追加 Disallow 的路由前缀
}SEO head 选项:image 是分享卡片图,构建期输出 og:image(相对值如 '/og.png' 解析到站点 public 根,拼上 hostname 成绝对地址,与 nav.logo 同语义;https:// 开头的绝对 URL 原样透传)并把 twitter:card 升级为 summary_large_image。未配置时输出 twitter:card: summary(无图卡片),不输出 og:image。author 是文章页 BlogPosting JSON-LD 的作者(schema.org Person),未配置或 name 为空则不输出 author 字段。exclude 让若干路由前缀保持不被抓取:不进 sitemap.xml,robots.txt 各追加一条 Disallow;页面仍会构建。加密页用 encrypt 即可,无需重复列在这里。每页的 meta description 取正文摘要(见 SEO),无需逐页配置。
head
head: ['<meta name="algolia-site-verification" content="ADD39C0998F22200">'],注入每个页面 <head> 的原始 HTML 片段数组,原样输出、保持配置顺序,位于框架自身标签之后(speculation rules 脚本之前),空字符串条目被丢弃。面向站点所有权验证 meta(Algolia DocSearch、Google Search Console、Bing…)、第三方统计代码片段、额外的 <link>/<script> 等场景。片段内的资源 URL 必须写绝对地址(https:// 开头):页面按部署深度生成相对前缀,裸路径在不同深度的页面会指向错误位置。
related
related: {
depth: 1, // 1 | 2 | 3,默认 1
maxNodes: 60, // 每页图的节点上限(含当前页),默认 60
maxEdges: 240, // 每页成员连边上限,默认 240
twoHopNodeLimit: 48, // 枢纽页回退阈值,默认 48
}关联文章图的聚合范围:depth 是文章互引图的 BFS 层数——1 只收互引的一度邻居(默认),2/3 把两跳/三跳内的文章连同它们之间的真实连边一起收进来。非 1/2/3 的值构建期直接报错。
- 互引指文章之间存在任一方向的站内链接,同一对文章的多次互链会累加成
refs,决定边的粗细与邻居排序 - 载荷有上限保护(每页默认 60 节点、240 条成员连边,可用
maxNodes/maxEdges调整,须为不小于 2/1 的整数),超出时按引用强度截断,depth 调大不会撑爆 payload;站点大、互链密时把两个上限一起调大 twoHopNodeLimit是多跳图的枢纽回退阈值:某页关联节点数(含自身)超过它时只渲染一度邻居,不再展开depth跳;一度星型本身超限时只保留互引最强的前若干个——密集枢纽页的画布标签会挤成一团,回退成可读的星型(它就是关联图的渲染节点数上限)- 客户端图支持缩放/平移/拖节点/点击跳转,初始化自动 fit(有缩放上限,保证默认视图的文字紧凑可读),缩小时自动隐藏标签;交互见Islands
code
code: {
lineNumbers: true, // 代码块行号,默认 true
collapsedLines: 15, // 超过 N 行折叠;null 显式禁用折叠,默认 15
wrap: true, // 软换行,默认 true
copyLabel: '复制代码', // 复制按钮的 aria-label/title,用于界面本地化
}代码块呈现的站点级默认值(markdown 管线消费):collapsedLines 用 ??= 语义区分「未配置」与「显式 null」,写 null 才是关闭折叠。每个代码块可用围栏 meta 覆盖站点默认:{1,3-5} 行高亮、title="..."、:collapsed-lines[=N]、:no-collapsed-lines、:wrap=true|false,语法与演示见Markdown 扩展。
xlist
xlist: {
externalize: 16, // KiB 阈值;false 保持全部内联,默认 16
}ExpandableList(含内置名单内的同类 entry-list 岛屿)的条目正文外置阈值:单个列表渲染后的正文合计超过该值(KiB)时,正文离开页面 HTML,写入内容 hash 的资产模块(assets/xlist-<hash>.js),静态页只留标题行、meta 行与 data-ap-slot 槽位标记;客户端岛挂载后再拉取资产回填。条目多的列表页因此不再把全部折叠正文压进首屏文档。交换代价:无 JS 访客只能看到标题与 meta(锚点保留),正文不参与搜索索引。设 false 全部内联。
home
home: {
feed: true, // 默认 true
feedPerPage: 3, // 首页文章流每页篇数,默认 3
}首页选项:feed 控制是否在各 locale 首页顶部渲染分页文章流。博客首页保持默认;文档/landing 式首页可设 false,让正文介绍(hero/特性/阅读路线)成为视觉主体。feedPerPage 是文章流每页篇数(客户端分页,取值须为不小于 1 的整数);非默认值才写入页面 payload。
profile
profile: {
name: 'Alice', // 卡片显示名,默认站点 title
avatar: '/me.jpg', // 头像图,默认 nav.logo(都没有则不渲染头像)
link: '/about', // 头像+名称包裹的链接,可选
articlesLink: '/timeline/', // 「文章」统计数字的链接,可选;默认链接到时间轴内置页
exclude: ['/hide/'], // 计数排除的路由前缀(文章总数与分类/标签计数)
drawer: true, // 抽屉统计行计数开关,配了 profile 默认 true
}作者主页卡片,严格 opt-in:不配置时框架行为零变化。配置后每个 locale 首页在构建期于正文顶部注入一张静态卡片(头像 / 统计行 / 社交图标行 / 分类+标签 chips,最终 HTML、零客户端 JS,爬虫与 no-JS 直接可见),同时该首页不再输出 TOC 容器(卡片占位轮廓泳道,客户端软导航会自动补回/移除容器)。
- 统计行三项默认链接到内置列表页(文章→
/timeline/、分类→/categories/、标签→/tags/);pages关闭对应页后回退——分类/标签锚到卡片自己的分组锚点(:target闪烁一次),文章保持纯文本,除非配了articlesLink(始终优先) - 社交图标行复用
nav.social(含内建品牌字形),新标签页打开 - taxonomy 从该 locale 的文章列表派生(locale 首页已排除),再过滤
exclude前缀;分组与排序同归档页(大小写合并、小写排序),chips 链接/category/<name>、/tag/<name>,路由经 encodeURIComponent 并按页面深度加相对前缀 - 响应式:
<1024px卡片隐藏,改由移动端抽屉承接:抽屉社交行下是「文章 / 分类 / 标签」三格统计行(数字在上、标签在下,与卡片统计同形态),每格点击直达内置列表页(见 pages);配了profile时格内显示计数(与卡片同源,恒与归档一致),drawer: false只去掉数字、留纯标签入口。1024–1280px卡片流入正文顶端;≥1280px站点 CSS 可自行把卡片 skin 进 TOC 泳道
archive
archive: {
perPage: 10, // 分类/标签归档页每页篇数,默认 10
}归档页选项:每个分类/标签归档页(/category/*、/tag/*)的文章分页大小,客户端分页,取值须为不小于 1 的整数;非默认值才写入页面 payload。
pages
pages: {
timeline: true, // 时间轴页(/timeline/),默认 true
categories: true, // 分类总览页(/categories/),默认 true
tags: true, // 标签总览页(/tags/),默认 true
}框架内置列表页开关。三个页面都是每 locale 一张的合成静态页(最终 HTML、零客户端 JS,爬虫与 no-JS 直接可读),URL 固定为 <locale>/timeline、<locale>/categories、<locale>/tags(canonical 形态遵循 urls.directoryIndex),由框架在构建期生成,永不出现在 navbar/sidebar。
- 时间轴:全站文章按日期倒序、按年份分组的「日期 · 标题」行;数据集与 profile 卡的文章计数同源(
profile.exclude同步排除,未配置 profile 即全量,locale 首页除外),所以卡片「文章」计数恒等于时间轴行数;无日期文章归入「未注明日期」组排在最后 - 分类 / 标签总览:chips 云,列出该 locale 的全部分类/标签(大小写合并、计数徽章,与归档页同派生),点击进入对应归档页
- 入口:移动端抽屉社交行下的「文章 / 分类 / 标签」三格统计行(配了
profile时格内带计数);home 的 profile 卡统计数字默认链接到这三个页面;桌面端经 profile 卡或直达 URL 访问 - 关闭:设为
false后页面不产出(URL 落 404),抽屉统计格与卡片统计链接一并消失,sitemap 同步移除 - 内容页面占用同一路由(如
timeline/index.md对/timeline/)构建期直接报错——删除内容页或关闭对应内置页
文档 / landing 站不需要这些页面时逐项设 false 即可。
urls
urls: {
directoryIndex: 'slash', // 'slash' | 'bare',默认 'slash'
}URL 形态选项。目前只有一个键:目录索引页(guide/index.md)的 canonical 路由。
'slash'(默认):/guide/。GitHub Pages 的原生形态,零重定向'bare':/guide。Cloudflare Pages 的原生形态(CF 会把/guide/308 到/guide)
两个平台对对方形态都会补一次重定向(GH 把 /guide 301 到 /guide/,CF 反向),没有通吃的零跳转形态,按部署平台选即可。落盘文件名不受影响,永远是 guide/index.html。
feed
feed: {
rssLimit: 20, // rss.xml 收录的最新文章数,默认 20
}订阅源选项:rss.xml 收录各 locale 最新文章的总数上限(feed: false 的页面始终排除),取值须为不小于 1 的整数。全文输出 RSS 需要把站内资源链接改写为绝对 URL,框架刻意不做(摘要 + 链接是订阅源的实用形态),可调的只有收录条数。
footer
footer: {
credit: '© 2026 Someone',
}页脚:桌面端一行两栏,右侧固定「Powered by absolute-press」链接指向框架仓库。左侧署名行(桌面页脚与移动端抽屉底部共用)默认是 CC 图标 + 框架名;配置后整段替换为自定义纯文本(组件不解析 HTML,需要图标请走站点 CSS 或自定义 island)。留白字符串视为未配置。
strictLinks
strictLinks: 'warn', // 'off' | 'warn' | 'error',默认 'warn'裸相对链接策略:正文里不带 ./ ../ 前缀的站内 markdown 链接(如 guide/a.md)既不会被改写为站内路由,也不参与死链检查,会原样产出指向 .md 的链接——几乎总是漏写前缀的笔误。
'warn'(默认):构建时列出文件、行号与链接,构建继续通过'error':与死链同样直接构建报错,适合 CI 严格把关'off':完全不提示
只影响构建期报告;dev 服务器不检查。语法细节见Markdown 扩展。
readingTime
readingTime: true, // 默认 true阅读时长统计:构建期按正文估算——中文按字数(300 字/分钟)、英文按词数(200 词/分钟),混合文本线性合并;frontmatter、代码围栏与行内代码不计入。结果写入页面 payload 的 page.readingTime(整数分钟,向上取整,最小 1),供归档卡片等展示处选用;文章顶部 meta 行当前不渲染该值。设为 false 后 payload 不携带该字段。
onScan
import type { SiteScanContext } from 'absolute-press';
onScan: (ctx: SiteScanContext) => ({
pages: ctx.pages.map(page => ({
route: page.route,
date: page.createdAt,
tags: page.frontmatter.tag ?? [],
})),
}),站点数据钩子:框架单遍扫描内容树,每轮扫描完成后、渲染前运行一次——dev 启动、构建、dev 结构变更 resync 与内容编辑都会触发。参数 SiteScanContext 是 { config, pages }:config 是全量解析后的站点配置(ResolvedConfig),pages 是全部 locale 的页面清单,按配置 locale 顺序排列,类型可从 absolute-press 导入。
返回值会被 JSON 序列化进 virtual:absolute-press/site-data 虚拟模块(default export 即返回值),供站点 island 消费,消费方式见Islands。因此返回值必须 JSON 可序列化(rawFrontmatter 里的裸日期是 Date 对象,需要字符串时先自行 toISOString);返回 Promise 会被 await。
动机:locale 目录归属、README/index 语义、frontmatter 规范化与未知键告警、git 时间都以框架扫描为准。消费方不必再自己 walk 目录、parse frontmatter、查 git 时间——在 onScan 里从 pages 派生站点数据,语义与框架天然一致;dev 下内容编辑触发新一轮扫描,数据自动刷新,无需重启 dev server(在 vite.config.ts 里自扫内容的老做法需要重启才能拿到新数据)。
SiteScanPage 字段(import type { SiteScanPage } from 'absolute-press'):
filePath: string:markdown 源文件的绝对路径route: string:带 locale 前缀的 clean 路由——叶子页/guide/a、目录索引/guide/(urls.directoryIndex: 'bare'时为/guide)、locale 首页/en/、站点首页/relPath: string:相对 locale 内容根的路径,posix 分隔符locale: LocaleInfo:页面所属 locale(key/lang/label/prefix)frontmatter: PageFrontmatter:框架识别键的规范化结果(六个键,语义见页面级配置)rawFrontmatter: Record<string, unknown>:yaml 原生解析结果,自定义键在这里;裸日期是Date对象createdAt: string | null:frontmatterdate的 ISO 字符串,缺失或不可解析为nullupdatedAt: string | null:git 最后提交时间的 ISO 字符串,不可用(如不在 git 仓库)为null
构建层扩展字段(AbsolutePressConfig)
nav:见上文profile:见上文onScan:见上文entryListIslands: string[]:复用@@@条目管线的站点 island 名单(名字必须已在islands注册)——构建期把这些 island 的 children 按 ExpandableList 同款规则拆成「标题 + meta + 正文」静态表格骨架,island 客户端接childrenHtml填充数据,见Islandscode/xlist/readingTime:见上文islands/lang/label:见上文
vite 层
absolutePress() 之外仍是标准 vite 配置:build.target 建议 esnext;产物目录用 build.outDir 控制(本站输出到 dist)。UnoCSS 与 vite-plugin-solid 需要显式接入,模板见快速开始。
页面级配置(frontmatter)
frontmatter 只认六个键:date / category / tag / icon / feed / overview,语义见写作指南。feed: false 的页面退出 RSS(文章流仍收录)。