在 Eleventy 博客模板中编写文章:以 fourthpost.md 为例解析 Front Matter、标签体系与布局渲染链路
2026/9/18 16:05:05 网站建设 项目流程

在 Eleventy 博客模板中编写文章:以 fourthpost.md 为例解析 Front Matter、标签体系与布局渲染链路

【免费下载链接】examplesEnjoy our curated collection of examples and solutions. Use these patterns to build your own robust and scalable applications.项目地址: https://gitcode.com/GitHub_Trending/examples1/examples

Eleventy(11ty)是一个以"零配置起步、模板引擎自由组合"著称的静态站点生成器。本仓库 framework-boilerplates/eleventy 是基于官方eleventy-base-blog模板改造的博客脚手架,而fourthpost.md正是其中一篇结构完整的示例文章,集中展示了博客文章在 front matter、标签集合与 Nunjucks 布局三层体系下的编写规范。读完本文,你将掌握在该模板中新建一篇文章所需的全部知识:front matter 每个字段的语义与写法、标签如何驱动归档与分页、Markdown 内容如何经布局链渲染成最终 HTML,以及如何在本仓库中直接构建、调试与部署整站。

一、fourthpost.md:一篇 Eleventy 博客文章的完整形态

在 posts/fourthpost.md 中,整篇文章只有两部分:位于文件顶部的 YAML front matter,以及紧随其后的 Markdown 正文。

--- title: This is my fourth post. description: This is a post on My Blog about touchpoints and circling wagons. date: 2018-09-30 tags: second tag layout: layouts/post.njk ---

正文部分则是一段示例性质的占位文案(placeholder copy),并带有一个## Section Header二级标题。这段占位文本说明:正文就是标准 Markdown,Eleventy 会原样解析并注入布局模板的{{ content | safe }}插槽中(见下文第三节)。当你实际使用该模板时,只需把占位文本替换成自己的真实内容即可。

需要特别指出的是,front matter 才是这篇文章的"技术骨架"——它决定了文章的标题、描述、发布日期、所属标签和使用的布局,是整篇文档最有价值的部分,下面逐字段拆解。

二、Front Matter 逐字段解析:标题、描述、日期、标签与布局

Eleventy 会把 Markdown 文件顶部---包裹的 YAML 解析为该页面的数据对象,这些字段既可在模板中通过{{ title }}{{ description }}等形式访问,也会被布局层与集合系统消费。

字段示例值作用与说明
titleThis is my fourth post.文章标题,渲染为布局中的<h1>,同时用于导航、归档列表与 RSS 订阅源
descriptionThis is a post on My Blog about touchpoints and circling wagons.页面描述,写入<meta name="description">,对 SEO 与社交分享摘要友好
date2018-09-30文章发布日期,驱动归档列表的时间排序与<time>标签渲染
tagssecond tag文章所属标签。可写单个字符串,也可写 YAML 列表(多标签)
layoutlayouts/post.njk指定布局模板,路径相对于_includes目录

2.1 布局字段:显式指定与继承约定

fourthpost.md显式声明了layout: layouts/post.njk,指向 layouts/post.njk。该模板本身又通过自身的 front matter 声明了layout: layouts/base.njk,形成"文章 → post 布局 → base 布局"的链式嵌套(详见第三节)。这种显式声明的好处是灵活——你可以在_includes/layouts/下新增其他布局(如首页用的layouts/home.njk),并按文章类型自由切换。

2.2 标签字段:单标签与多标签两种写法

对比本仓库的几篇示例文章可以确认标签字段的两种合法形态:

  • 单标签字符串fourthpost.mdfirstpost.mdtags: another tag)采用tags: second tag这种字符串写法;
  • 多标签列表thirdpost.mdtags: [second tag, posts with two tags])采用 YAML 列表写法,secondpost.mdtags: [number 2])同理。

注意标签名允许包含空格(如second tag),Eleventy 会在生成/tags/归档页时通过slug过滤器把空格转换为 URL 友好的形式。second tag同时出现在第四篇与第三篇文章中,这正是模板演示"同标签文章聚合"的方式。

2.3 目录级默认数据:posts.json 与全局标签

fourthpost.md所在的 posts/ 目录下,还藏着一个关键文件 posts.json:

{ "tags": [ "posts" ] }

这是 Eleventy 的**目录数据文件(directory data file)**机制:posts/下所有文件(包括第四篇文章)都会自动继承这个posts标签,无需在每篇文章里重复声明。正是这个全局标签,把所有文章聚合进collections.posts集合,供首页最新文章列表、归档页与"上一篇/下一篇"导航使用。README 也明确说明:文章可以放在任意目录,只需保证带有post标签即可进入该集合。而文章自身声明的second tag等个性化标签,则用于构建/tags/专题页。

三、布局渲染链路:Markdown 正文如何变成完整 HTML 页面

fourthpost.md声明使用layouts/post.njk,其完整实现位于 _includes/layouts/post.njk:

--- layout: layouts/base.njk templateClass: tmpl-post --- <h1>{{ title }}</h1> <time datetime="{{ page.date | htmlDateString }}">{{ page.date | readableDate }}</time> {%- for tag in tags | filterTagList -%} {%- set tagUrl %}/tags/{{ tag | slug }}/{% endset -%} <a href="{{ tagUrl | url }}" class="post-tag">{{ tag }}</a> {%- endfor %} {{ content | safe }}

可以看到,front matter 中的titledatetags在这里被逐一消费:标题渲染为<h1>,日期经htmlDateString/readableDate过滤器输出为规范化的<time>标签,每个标签生成一个指向/tags/归档页的链接,最后{{ content | safe }}将 Markdown 解析后的正文注入页面。

post.njk再通过自己的 front matter 嵌套进 _includes/layouts/base.njk。base.njk是整站最外层的 HTML 骨架,提供<head>元信息(title/description、CSS、Atom 与 JSON Feed 的<link rel="alternate">)、顶部导航栏与<main>内容区,并通过{{ content | safe }}接收内层布局的输出。

因此,一篇文章的完整渲染流水线是:

fourthpost.md(front matter + Markdown 正文) ↓ markdown-it 解析 layouts/post.njk(文章专属结构:标题/日期/标签/正文) ↓ 嵌套 layouts/base.njk(全局 HTML 骨架:head/导航/页脚) ↓ 输出为 /posts/fourthpost/ 目录下的 index.html

除了正文流水线,post.njk末尾还利用collections.posts集合与getNextCollectionItem/getPreviousCollectionItem过滤器自动生成"上一篇 / 下一篇"文章链接,这是集合数据驱动导航的典型用法。

四、标签如何驱动归档、标签页与首页最新列表

标签体系是理解fourthpost.mdtags: second tag一文价值的关键,仓库中有多处实现相互印证:

  • 归档页 archive.njk:基于collections.posts输出全部文章的倒序列表;
  • 标签分页模板 tags.njk:通过pagination遍历collections,把allnavpostpoststagList之外的每个标签生成一个/tags/<标签名>/分页页面,页内通过collections[ tag ]取出该标签下的全部文章;
  • 标签索引 tags-list.njk:汇总站内所有标签;
  • 可复用组件 _includes/postslist.njk:以postslist为输入渲染文章列表(标题 + 日期 + 标签链接),首页、归档页、标签页均复用它;
  • 首页 index.njk:通过collections.posts | head(-3)取最新 3 篇文章并传入postslist.njk渲染。

这意味着你只需在文章 front matter 中声明标签,Eleventy 构建时就会自动为second tag这类标签生成独立的归档页面,无需手工维护任何列表——这正是静态博客"数据驱动生成"的典型范式。

五、从示例文章到整站发布:构建、调试与部署

本仓库的 README.md 提供了完整的启动流程,与 package.json 中预置的脚本一一对应:

命令package.json 脚本用途
npm install安装依赖(@11ty/eleventy@11ty/eleventy-navigation@11ty/eleventy-plugin-rssluxonmarkdown-it等)
npx eleventy/npm run buildbuild: eleventy一次构建,输出静态站点
npx eleventy --serve/npm run serveserve: eleventy --serve本地开发服务器,带热重载
npx eleventy --watch/npm run watchwatch: eleventy --watch模板变更时自动重新构建
DEBUG=* npx eleventy/npm run debugdebug: DEBUG=* eleventy调试模式,输出详细构建日志

按照 README 的步骤,克隆仓库后依次执行npm install→ 编辑 _data/metadata.json(替换站点标题、URL、作者等全局元数据,RSS 与 JSON Feed 路径均从此读取)→npx eleventy --serve即可在本地预览。metadata.json中的全局数据与每篇文章 front matter 的局部数据共同构成了模板的数据层:base.njk{{ title or metadata.title }}{{ description or metadata.description }}这种写法正是"页面数据优先、全局数据兜底"的合并策略。

需要留意的是,base.njk第 27~36 行包含一段.warning引导提示(提醒你编辑metadata.json、可选配置.eleventy.js并删除该提示),正式发布前建议按注释移除。此外,当前模板的构建产物由@11ty/eleventy(^1.0.0)生成,命令执行前提是本地 Node.js 环境已就绪且依赖安装成功。

六、基于 fourthpost.md 的二次创作清单

结合以上分析,在fourthpost.md的基础上编写你自己的文章,只需完成四步:

  1. 复制文件:将fourthpost.md复制为posts/你的文章名.md(文件会因目录数据文件自动获得posts标签,无需额外声明);
  2. 重写 front matter:按第二节的字段表替换titledescriptiondate,按需保留或修改tags(多标签用 YAML 列表),layout: layouts/post.njk通常保持不变;
  3. 替换正文:把占位文本替换为真实 Markdown 内容,可用##组织小节;若需展示代码,可参照firstpost.md/thirdpost.md```js/2/4这类语法高亮围栏的写法(对应@11ty/eleventy-plugin-syntaxhighlight插件);
  4. 构建预览:执行npx eleventy --serve,访问本地开发服务器确认文章出现在首页最新列表、归档页与对应标签页中,且"上一篇/下一篇"导航正确衔接其他文章。

七、小结

fourthpost.md虽然只是一篇示例文章,却是理解整个 Eleventy 博客模板的绝佳切片:front matter 承载页面数据,posts.json目录数据文件提供集合入口,tags字段经tags.njk分页驱动标签归档,Markdown 正文经post.njkbase.njk两级布局渲染为完整页面。掌握这条从"写一篇文章"到"生成整个静态站点"的链路,你就能在此基础上搭建完全属于自己的博客——这也是本仓库作为 boilerplate 的核心价值所在。

【免费下载链接】examplesEnjoy our curated collection of examples and solutions. Use these patterns to build your own robust and scalable applications.项目地址: https://gitcode.com/GitHub_Trending/examples1/examples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询