Zest 模板系统全面指南

Zest 支持四种互补的模板方式,覆盖从简单到复杂的全部场景。

四种模板方式

1. .zpage.fsx — F# 脚本模板

类型安全的 HTML DSL + Markdown,适合需要动态计算的页面:

// @title 文章列表
// @layout default

let posts = recent_pages 5

render [
    h1 [ text "最新文章" ]
    divC "post-grid" [
        for r in posts ->
            articleC "post-card" [
                h2 [ a r.url [ text r.title ] ]
                p  [ text r.description ]
            ]
    ]
]

2. .znjk — ZestNjk 模板

Nunjucks 兼容语法,适合需要模板继承的布局场景:

{% extends "base.znjk" %}

{% block content %}
  <h1>{{ page.title }}</h1>
  <div class="content">{{ content }}</div>

  <h3>相关文章</h3>
  {% for p in pages | pages_by_tag("zest") | recent(3) %}
    <a href="{{ p.url }}">{{ p.title }}</a>
  {% endfor %}
{% endblock %}

3. .zhtml — 纯 HTML

构建速度最快,适合着陆页等静态场景:

<!-- @title 关于我们 -->
<!-- @layout default -->
<h1>关于我们</h1>
<p>纯 HTML 页面,不经 FSI 编译。</p>

4. .md — Markdown

标准 Markdown 格式,兼容任意编辑器:

---
title: Hello World
layout: default
---

# Hello World

This is a **Markdown** page.

Collections API

脚本中可直接调用以下 API:

let all     = site_pages ()           // 全部页面
let recent  = recent_pages 5          // 最新 5 篇
let tagged  = pages_by_tag "fsharp"   // 按标签过滤
let dir     = pages_by_dir "blog"     // 按目录过滤
let col     = pages_by_collection "blog"  // 按集合过滤
let tags    = all_tags ()             // 所有标签
let results = search_pages "query"    // 按标题搜索
let data    = site_data "key"         // 读取全局数据
let nav     = include_partial "nav.html"  // 引入局部模板
let byYear  = group_pages_by_year ()  // 按年分组
let sorted  = sort_pages_by "title" "asc"  // 排序

ZestNjk 过滤器

.znjk 模板中可使用的 Zest API 过滤器:

过滤器 用法 说明
pages_by_tag `pages \ pages_by_tag("zest")` 按标签筛选
recent `pages \ recent(5)` 最近 N 篇
by_collection `pages \ by_collection("blog")` 按集合筛选
search `pages \ search("Zest")` 全文搜索
where `pages \ where("draft", "false")` 属性筛选

了解更多: