Markdown 博客 frontmatter 写法规范与常见坑

ShuaiQi
#建站#Markdown#SEO

用 Markdown 存文章是静态博客最常见的方式,文章顶部的 YAML 块叫 frontmatter。写法看着简单,但几个细节会直接影响构建、URL 和 SEO。

最小可用示例

markdown
---
title: "用 Cloudflare 反代 Supabase"
slug: cloudflare-supabase-proxy
date: "2026-11-14"
tags: ["建站", "Cloudflare", "Supabase"]
description: "Supabase 国内访问慢,用 Cloudflare Worker 做一层反代即可显著改善,本文给出完整配置。"
---

正文从这里开始。

字段约定

字段必填说明
title是页面标题,尽量含关键词,不要堆砌
slug建议URL 路径,英文短横线,不填则用文件名
date是发布日期,用于排序和 sitemap 的 lastmod
tags建议数组,影响「相关文章」推荐
description是meta description,60–120 字

坑一:日期不加引号会变成对象

yaml
date: 2026-11-14

YAML 会把这种写法解析成 Date 对象,而不是字符串。如果代码里直接用 post.date 渲染,可能得到一长串带时区的字符串,甚至构建报错。

两种处理方式,任选其一:

yaml
date: "2026-11-14"

或者代码里统一归一化:

ts
const date = data.date instanceof Date
  ? data.date.toISOString().split("T")[0]
  : String(data.date);

本站用的是后者,同时在 frontmatter 里也加引号,双保险。

坑二:中文 slug 会让 URL 变成乱码

yaml
slug: 什么是Root

生成的是 /blog/什么是Root/,浏览器地址栏里复制出来会变成一长串 %E4%BB%80%E4%B9%88...,分享、统计、日志里都不好看。

新文章建议用英文短横线:

yaml
slug: what-is-android-root

已经发布的中文 slug 不建议随便改——改了旧链接就 404,需要配 301,得不偿失。

坑三:description 超长被截断

搜索结果里 description 只显示约 80 个汉字。写太长会被截断,写太短(少于 25 字)又容易被判为无效描述。

建议 60–120 字,包含核心关键词,用一句话说清「这篇解决什么问题」。不要复制正文第一段,那是模板化做法。

坑四:tags 写成字符串

yaml
tags: 建站, Next.js

解析出来是一个字符串 "建站, Next.js",按标签匹配时永远匹配不到。正确写法是数组:

yaml
tags: ["建站", "Next.js"]

代码侧最好做兼容:

ts
const tags = Array.isArray(data.tags)
  ? data.tags.map(String)
  : typeof data.tags === "string"
    ? [data.tags]
    : [];

坑五:正文第一行就写 H1

markdown
---
title: "标题"
---

# 标题

页面模板通常已经渲染了 <h1>{title}</h1>,正文再写一次 H1 就会出现两个一级标题,不利于 SEO 结构。

正文从 ## 开始,把 H1 交给模板。

坑六:空文件或只有 frontmatter

只有 frontmatter、没有正文的文章会被判为「薄内容」,不但没有流量,还会拉低整站质量评分。写之前先想清楚这篇文章解决什么问题,写不出 800 字就先别发。

推荐的写作结构

markdown
---
title: "..."
slug: "..."
date: "..."
tags: [...]
description: "..."
---

一句话说明解决什么问题。

## 问题现象

## 原因

## 解决步骤

### 步骤 1

### 步骤 2

## 常见问题

### 问句 1?

### 问句 2?

## 相关阅读

- [站内另一篇](/blog/xxx/)

这种结构对用户友好,对搜索引擎也友好:有明确的问题描述、分步解答和 FAQ,容易被识别为教程类内容。

常见问题

frontmatter 用 TOML 还是 YAML?

绝大多数静态站点生成器默认 YAML(--- 包裹),这是通用性最好的选择。

能不能在 frontmatter 里写自定义字段?

可以。gray-matter 会把所有字段放进 data,自定义字段如 author、cover、draft 都能读出来,用于控制是否发布或渲染封面。

草稿怎么隐藏?

加 draft: true,然后在读取文章时过滤掉。静态站点最好把草稿放在单独分支,避免误发布。

修改文章日期会影响排序吗?

会。日期既用于列表排序,也用于 sitemap 的 lastmod。小幅修改不建议改日期,大改可以更新。

相关阅读

评论