跳到主要内容
Roitium 3G Lab Blog
返回

AstroPaper 模板速查手册

编辑此页

这个博客基于 AstroPaper v6,静态构建后部署在 Cloudflare Workers 上。下面按「配置 → 写作 → 功能 → 部署 → 排错」整理,方便随时回来查。

目录

展开目录

技术栈

部分用了什么
框架Astro 7(纯静态输出,无运行时)
样式Tailwind CSS 4 + @tailwindcss/typography
内容Markdown / MDX + Astro Content Collections
代码高亮Shiki(min-light / night-owl 双主题)
搜索Pagefind(构建时生成静态索引,无后端)
OG 图片Satori + Sharp + Astro Fonts(构建时生成 PNG)
类型/规范TypeScript、ESLint、Prettier
部署Cloudflare Workers 静态资源(Wrangler)
包管理pnpm 11.25.0(固定在 packageManager)

常用命令

命令作用
pnpm dev本地开发,http://localhost:4321
pnpm build类型检查 → 构建 → 生成 Pagefind 索引 → 注入 dist/_headers
pnpm preview预览 dist 构建结果
pnpm sync生成 Astro 类型(改了 content config 后跑一下)
pnpm lintESLint
pnpm formatPrettier 格式化(format:check 只检查)
pnpm deploypnpm build + wrangler deploy,一条命令发到 Cloudflare
pnpm cf:previewwrangler dev,用 Workers 运行时本地预览静态资源
说明

pnpm build 不是单纯的 astro build:它还包含 astro check、pagefind 索引生成和 _headers 复制。CI 和 Cloudflare 上都用这条命令。

目录结构

.
├── astro-paper.config.ts      # 站点配置(标题、域名、功能开关、社交链接…)
├── astro.config.ts            # Astro 配置(i18n、Markdown 插件、Shiki、字体)
├── wrangler.jsonc             # Cloudflare Workers 静态资源配置
├── cf/_headers                # 响应头(构建时复制到 dist)
├── scripts/cf-headers.mjs     # 把 cf/_headers 注入 dist
├── public/                    # 原样发布的静态文件(favicon、默认 OG 图)
└── src/
    ├── assets/
    │   ├── icons/             # 图标(含 socials/*.svg)
    │   └── images/            # 文章图片(走 Astro 图片管线)
    ├── components/            # Header、Footer、Card、分页、面包屑…
    ├── content/
    │   ├── pages/about.md     # 「关于」页
    │   └── posts/             # 文章
    ├── i18n/
    │   ├── index.ts           # useTranslations / tplStr
    │   ├── types.ts           # UIStrings 接口
    │   └── lang/{en,zh-CN}.ts # 界面文案
    ├── layouts/               # Layout(全站)、PostLayout(文章 SEO)
    ├── pages/                 # 路由
    ├── styles/                # global / theme / typography
    ├── types/config.ts        # 配置类型定义
    └── utils/                 # 排序、过滤、slug、OG 路径等

站点配置

全部在 astro-paper.config.ts 里,类型定义在 src/types/config.ts。

站点信息 site

字段说明默认值
url正式域名,影响 canonical、sitemap、RSS、OG 图必填
title博客名必填
descriptionSEO 描述、RSS 描述必填
author默认作者名必填
profile作者主页,用于结构化数据可选
ogImage默认 OG 图,必须是 public/ 下的单个文件名default-og.jpg
lang站点语言,必须出现在 astro.config.ts 的 i18n.localesen
timezoneIANA 时区,用于文章日期UTC
dir文本方向:ltr / rtl / autoltr
googleVerificationSearch Console 验证码可选

首页 home

字段说明默认值
greeting首页大标题site.title
intro首页简介段落site.description

文章与分页 posts

字段说明默认值
perPage/posts/ 每页文章数4
perIndex首页「最新文章」显示条数4
scheduledPostMargin定时发布提前量(毫秒)900000(15 分钟)

功能开关 features

字段说明默认值
lightAndDarkMode是否显示明暗切换true
dynamicOgImage构建时为每篇文章生成 OG 图true
showArchives是否启用 /archives/ 与导航入口true
showBackButton文章页是否显示返回按钮true
editPost「编辑此页」:{ enabled: true, url: "..." }关闭
search"pagefind" 或 false"pagefind"

name 必须对应 src/assets/icons/socials/ 下的 SVG 文件名。现成可用的有:github、x、linkedin、mail、facebook、pinterest、telegram、whatsapp。

socials: [{ name: "github", url: "https://github.com/you" }],
shareLinks: [{ name: "x", url: "https://x.com/intent/post?url=" }],

linkTitle 可以覆盖 aria-label,不填会自动生成。

写文章

文件位置与 URL

文章放在 src/content/posts/,支持 .md 和 .mdx。

文件路径URL
src/content/posts/hello.md/posts/hello/
src/content/posts/2026/hello.md/posts/2026/hello/
src/content/posts/_drafts/hello.md/posts/hello/(_ 目录不进 URL)
src/content/posts/_hello.md不构建(文件名以 _ 开头)

另外可以在 frontmatter 里用 slug 覆盖文件名带来的路径段,例如 slug: hello-world。改动 slug 或文件名会改变 URL,旧链接会 404,没有自动重定向。

Frontmatter

只有 title、description、pubDatetime 是必填的。

字段说明默认值
title文章标题(渲染成 h1)必填
description摘要,用于列表和 SEO必填
pubDatetime发布时间,ISO 8601必填
modDatetime修改时间,填了会显示「更新于」并影响排序空
author作者site.author
featured是否进首页「精选」false
draft草稿,永不构建false
tags标签数组["others"]
ogImage自定义 OG 图,相对路径或远程 URL动态生成
canonicalURL原文链接(文章同时发在别处时用)当前文章 URL
hideEditPost这篇文章隐藏「编辑此页」false
timezone单篇覆盖站点时区site.timezone
slug覆盖 URL 路径段(Astro glob loader 支持,未写进 schema)文件名
---
title: "文章标题"
pubDatetime: 2026-10-20T20:00:00+08:00
description: "一句话摘要。"
tags:
  - 随笔
draft: false
---

草稿与定时发布

注意

写完文章发现页面 404,先检查 pubDatetime 是不是未来时间。改成过去时间即可,不需要等。

图片

写法说明
![alt](@/assets/images/foo.png)推荐,走 Astro 图片管线,自动优化
![alt](../../assets/images/foo.png)相对路径,等价写法
![alt](/foo.png)public/ 下的文件,原样发布不优化

MDX 里可以 import 图片拿元数据,本项目的大小端示意图就是这么用的:

import diagram from "@/assets/images/endianness.svg";

<img
  src={diagram.src}
  width={diagram.width}
  height={diagram.height}
  alt="示意图"
/>

目录(TOC)

在文章里写一个二级标题 ## 目录(或 ## Table of contents),remark-toc 会把后面的标题自动生成目录列表,remark-collapse 把它折叠成「展开目录」。

代码块

```ts file="src/utils/foo.ts"
export const answer = 42;
```
写法效果
// [!code highlight]高亮这一行
// [!code highlight:3]高亮连续 3 行
// [!code ++]绿色 diff 新增行
// [!code --]红色 diff 删除行
// [!code word:foo]高亮代码里出现的 foo

代码主题是 min-light / night-owl,跟随明暗模式切换;wrap: false,超长代码横向滚动。

Callouts(提示块)

基于 rehype-callouts,用引用块语法:

> [!NOTE]
> 补充说明。

> [!WARNING]- 默认折叠的警告
> 点开才显示。

> [!TIP]+ 默认展开但可折叠
> 一开始是展开的。

支持的类型:NOTE、ABSTRACT、INFO、TODO、TIP、SUCCESS、QUESTION、WARNING、FAILURE、DANGER、BUG、EXAMPLE、QUOTE。

类型后面直接写文字可以自定义标题;加 - 默认折叠,加 + 默认展开。

表格

普通 Markdown 表格即可。内容较宽时,可以在 MDX 里套一层响应式容器:

import ResponsiveTable from "@/components/ResponsiveTable.astro";

<ResponsiveTable variant="striped-minimal">
  | 列 1 | 列 2 | | ---- | ---- | | 内容 | 内容 |
</ResponsiveTable>

variant 可选 minimal(无边框)、striped(斑马纹)、striped-minimal(斑马纹 + 无边框)。

数学公式(默认未启用)

需要自己加插件:

pnpm add remark-math rehype-katex katex

然后在 astro.config.ts 的 remarkPlugins 里加 remarkMath,rehypePlugins 里加 rehypeKatex,并在 Layout.astro 里引入 katex/dist/katex.min.css(或在页面里用 CDN 链接)。

页面与路由

路由来源说明
/src/pages/index.astro首页:问候、精选、最新文章
/posts/、/posts/2/src/pages/posts/[...page].astro文章列表与分页
/posts/<slug>/src/pages/posts/[...slug]/index.astro文章详情
/posts/<slug>/index.png.../index.png.ts动态 OG 图(每篇一张)
/tags/、/tags/<tag>/src/pages/tags/标签列表与标签文章页
/archives/src/pages/archives/index.astro按年份归档
/search/src/pages/search.astroPagefind 搜索页
/about/src/content/pages/about.md关于页
/404src/pages/404.astro自定义 404
/rss.xmlsrc/pages/rss.xml.tsRSS
/sitemap-index.xml@astrojs/sitemap站点地图
/robots.txtsrc/pages/robots.txt.ts带 sitemap 地址的 robots
/og.pngsrc/pages/og.png.ts默认动态 OG 图

主题与样式

颜色

src/styles/theme.css 定义设计令牌,并通过 Tailwind 的 @theme 暴露成工具类:

CSS 变量Tailwind 类用途
--backgroundbg-background页面背景
--foregroundtext-foreground正文颜色
--accentbg-accent / text-accent强调色
--accent-foregroundtext-accent-foreground强调色上的文字
--mutedbg-muted弱化背景
--muted-foregroundtext-muted-foreground次要文字
--borderborder-border边框

改配色只需要改 :root 和 [data-theme="dark"] 两组值。

字体

字体在 astro.config.ts 的 fonts 数组里声明(Astro Fonts API,构建时下载并自托管),当前用的是 Google Sans Code,并映射为 --font-app:

--font-app: var(--font-google-sans-code);

换字体:在 fonts 数组里加一项(name、cssVariable、provider、weights…),再把 theme.css 里的 --font-app 指向新的变量。

明暗模式与过渡

排版

文章容器用 .app-prose(@tailwindcss/typography 的 prose 加主题覆盖),相关样式在 src/styles/typography.css。

多语言(i18n)

SEO 与订阅

搜索

小提示

pnpm dev 下搜索依赖上一次构建生成的 public/pagefind/。新机器克隆后先跑一次 pnpm build,本地搜索才有索引。

部署到 Cloudflare

纯静态站点,不需要任何 adapter。配置在 wrangler.jsonc:

{
  "name": "lab-blog",
  "compatibility_date": "2026-10-20",
  "assets": {
    "directory": "./dist",
    "not_found_handling": "404-page",
  },
}

方式一:连接 Git 自动部署(推荐)

  1. Cloudflare Dashboard → Workers & Pages → Create application → Workers → Import a repository
  2. Build command:pnpm build
  3. Deploy command:npx wrangler deploy
  4. 环境变量:NODE_VERSION=24(Astro 7 要求 Node ≥ 22.12)
  5. 之后每次 push 到 main 自动构建,PR 会有预览部署

方式二:本地命令行

npx wrangler login
pnpm deploy

域名

Worker → Settings → Domains & Routes → Add custom domain。绑定后把 astro-paper.config.ts 的 site.url 改成新域名,再部署一次,否则 canonical / sitemap / RSS 还是旧地址。

响应头

cf/_headers 在构建时复制到 dist/_headers:/_astro/* 长缓存,其余加 X-Content-Type-Options、Referrer-Policy、X-Frame-Options。

注意

不要直接把 _headers 放进 public/。Astro 7 会把 public/_headers 当成 JS 模块解析,构建直接报 PARSE_ERROR。

配额

Workers 免费版静态资源上限约 25 MiB,目前构建产物约 8~9 MB,文章图片多了要留意体积。

排错清单

现象原因与处理
文章 404pubDatetime 是未来时间;改成过去时间,或等定时发布
构建报 MissingLocaleError: zh-CNsite.lang 不在 i18n.locales 里,两边保持一致
_headers 构建报 PARSE_ERROR文件放在了 public/,改放 cf/ 并靠脚本注入
搜索没有结果索引是构建产物,先跑 pnpm build
图片 404@/assets 用于 src/assets;public/ 下用 /xxx 直接引用
标签 URL 是一串 %E5...中文标签会被 URL 编码,属正常现象
pnpm install 被拒绝pnpm 版本低于 engines.pnpm 要求,用 11.25.0
Cloudflare 构建失败,提示 Node 版本低构建环境变量加 NODE_VERSION=24
OG 图没更新构建时生成;改标题后需要重新构建部署

快速索引

想改什么去哪里
站点名 / 域名 / 作者astro-paper.config.ts → site
首页问候和简介astro-paper.config.ts → home
功能开关 / 分享链接astro-paper.config.ts → features / shareLinks
导航项src/components/Header.astro + src/i18n/lang/zh-CN.ts
关于页src/content/pages/about.md
配色src/styles/theme.css
字体astro.config.ts → fonts + theme.css
中文界面文案src/i18n/lang/zh-CN.ts
日期格式src/components/Datetime.astro
代码高亮主题astro.config.ts → shikiConfig.themes
搜索开关features.search
部署配置wrangler.jsonc、package.json → deploy
响应头cf/_headers

编辑此页
分享这篇文章:

上一篇
大小端序:0x12345678 在内存里怎么放