六维教程

Hexo Post对象

在使用 Hexo 进行主题开发或编写高级插件时,我们不可避免地要与 post(文章)对象打交道。无论是在 layout/*.ejs 模板中,还是在 hexo.extend.helper 注册的辅助函数里,post 对象都是承载内容的核心。本文将分级拆解每一个属性的真实含义、数据类型和实际运用场景。

结构

在 Hexo 的 renderrouter 阶段,每一篇 Markdown 文件都会被解析为如下的 JavaScript 对象(基于我们调试的 _Document 实例):

// 这是一个简化后的 Hexo Post 对象结构
const post = {
  // 基础元数据
  title: 'Bootstrap5 位置',
  date: Moment('2026-07-21 11:11:14'),
  updated: Moment('2026-07-22 19:57:56'),
  photos: [],

  // 内容载体
  _content: '...Markdown 源码...',
  content: '...渲染后的 HTML...',
  more: '...文章摘要 HTML...',
  raw: '---\ntitle: ...\n---\n...完整源文件...',

  // 路径与资源
  source: '_posts/01 Web开发/.../01 Bootstrap5 位置.md',
  slug: '01 Web开发/.../01 Bootstrap5 位置',
  path: '2026/07/21/01-Bootstrap5-位置/',
  permalink: 'https://your.site.com/2026/07/21/01-Bootstrap5-位置/',
  full_source: '/User/.../source/_posts/.../01.md',
  asset_dir: '/User/.../source/_posts/.../01/',

  // 状态与配置
  published: true,
  comments: true,
  layout: 'post',
  __post: true,
  _id: 'cuidhTTsyWZ25SfYrxxqbJZMU',

  // 分类与导航
  categories: [CategoryObject, CategoryObject],
  tags: [TagObject],
  prev: _Document | null,
  next: _Document | null
};

属性

为了便于记忆,我们将上述属性分为五大类

元数据层

这部分数据主要来源于 Markdown 文件顶部的 Front-matter 区域。

  • title(String):文章标题。是生成 <title> 标签和页面大标题的核心字段。
  • date(Moment.js 对象):文章创建日期。Hexo 默认按此字段降序排列文章。
  • updated(Moment.js 对象):文章最后修改日期。通常由 Hexo 自动读取文件的 mtime 或手动指定,用于 sitemap 和“最近更新”模块。
  • photos(Array):文章关联的图片数组。在相册主题或 opengraph 元标签中用于展示预览图。

数据层

这是 Hexo 处理最复杂的部分,涉及 Markdown 解析前后的三种状态。

  • _content(String):纯粹的文章 Markdown 源码,不包含 Front-matter,适合用于关键词检索、全文搜索插件的索引源。
  • content(String):渲染后的 HTML 字符串,这是最终呈现给用户的内容,并应用了代码高亮(如 highlight.js)。
  • more(String):文章摘要的 HTML 字符串,对应源码中 <!--more--> 标签之前的内容,首页列表通常渲染此字段而非完整的 content,以提升加载速度。
  • raw(String):包含 Front-matter 的完整源文件字符串,相当于硬盘上的 .md 文件全文,在编写“备份/导出”功能时非常有用。

物理与虚拟层

  • source(String):源文件相对于 source 文件夹的相对路径。例如 _posts/xxx.md,用于定位文件。
  • slug(String):基于 source 路径解析出的唯一标识符。通常用于生成 URL 的一部分。
  • path(String | Getter):渲染后的 HTML 文件在站点输出目录(public)中的相对路径。例如 2026/07/21/hello-world/index.html(不包含域名)。
  • permalink(String | Getter):文章的完整绝对访问 URL,由 Hexo 配置文件的 url 参数与 path 拼接而成。
  • full_source(String | Getter):源文件在操作系统中的绝对物理路径,包含根目录盘符,如 /Users/xxx/blog/source/...,常用于 Node.js 的 fs 文件操作。
  • asset_dir(String | Getter):文章对应资源文件夹的绝对路径,当启用 post_asset_folder 配置项后,用于存放该文章专属的图片、附件,以便在 Markdown 中通过相对路径引用。

功能层

这些字段控制 Hexo 的生成逻辑和主题的行为。

  • published(Boolean):发布状态。true 表示生成静态页面,false 则视为草稿,hexo generate 时会跳过。
  • comments(Boolean):评论开关。主题模板(如 themes/next/layout/post.ejs)通过判断此字段来决定是否加载评论插件(Valine/Giscus)。
  • layout(String):布局模板名称。默认是 post,可改为 page 或自定义布局,实现不同类型页面的差异化渲染。
  • __post(Boolean):内部硬编码标志位,恒为 true。供主题或插件在遍历所有数据时快速筛分出文章对象(区别于 page 对象)。
  • _id(String):Hexo 数据库存储层的主键 ID。多见于 hexo.locals.get('posts') 返回的数据中,用于缓存或关联查询。

关联层

这部分涉及站点内容的结构化组织。

  • categories(Array | Getter):分类对象数组。由于 Hexo 支持树形层级分类,直接遍历时建议使用 post.categories.datapost.categories.toArray() 来获取扁平列表。
  • tags(Array | Getter):标签对象数组。包含 name(名称)和 slug(URL 别名),在模板中经常配合 tags.map(t => t.name) 使用。
  • prev(_Document | Getter):上一篇文章对象。按 date 降序排列,当前文章的上一位。如果是第一篇(最新),则值为 null
  • next(_Document | Getter):下一篇文章对象。按 date 降序排列,当前文章的下一位。如果是最后一篇(最旧),则值为 nullprevnext 常用于页面底部的“上一篇/下一篇”翻页组件。
上一篇
Hexo 安装
下一篇
Hexo [Getter]