Jekyll 是静态博客生成器,只能生成静态页面,原则上是没法创建一个动态的 API。但灵活利用 Liquid 的语法,还是可以创建一个简单的静态的 API,也就是说传参无效的,直接返回 JSON 数据的 API。

Jekyll 可以生成静态的 HTML 页面,也可以生成其他文本格式的文件。只要稍微一改,便可生成一个包含 JSON 数据的文件,这也就是 API。

下面以一个简单的例子来看看是怎么实现的。

确定需求

Jekyll 有分页功能,这是由一个官方的插件 jekyll-paginate 提供的[1]。这个插件会给文章列表分页,并生成页数相应的页面文件。

我们想要实现不刷新的分页,可以直接在一个页面输出所有文章列表,经 CSS 实现显隐,并通过 JS 来进行 DOM 操作即可。这样是不完美的,如果文章够多,列表项足够复杂,页面会很大,若带上图,那就更加酸爽了。

这时候,若有个简单的 API 就好了,这个 API 一般是这样的:传入页数输出相应的文章数据。前面已经说过,Jekyll 实现的 API 没法实现传参,那么这个 API,只能是返回所有文章数据。

实现需求

那么,应该如何创建这样一个 API 呢?这才是关键,我们很懒,遇到问题第一时间不是自己苦想怎么实现,而是进行 Google 搜索,这不,随便一搜有不少答案[2][3]

以下代码将创建一个文件,包含所有文章的数组,每篇文章有标题、链接、分类、时间、标签等属性。

---
layout: null
permalink: /post.json
---
[{% for post in site.posts %}
    {
        "title": {{ post.title | jsonify }},
        "url": {{ post.url | jsonify }},
        "category": {{ post.category | jsonify }},
        "date": {{ post.date | jsonify }},
        "tags": {{ post.tags | jsonify }}
    }{% unless forloop.last %},{% endunless %}
{% endfor %}]

其中所用到的 Liquid 语法主要有标签 forunless 以及过滤器 jsonify

参考资料

本文历史

  • 2017 年 05 月 14 日 完成初稿