部分模板解析查询顺序

部分模板–和 single page templates and list page templates类似, 具有特殊的 lookup order。不过,部分模板查询顺序简单些,仅仅检查两个位置:

  1. layouts/partials/*<PARTIALNAME>.html
  2. themes/<THEME>/layouts/partials/*<PARTIALNAME>.html

这允许主题的终端用户copy部分模板的内容到同名文件以进行更多的定制.

模板中使用部分模板

HUgo项目中所有的部分模板位于单一目录 layouts/partials中. 为文件组织方便,您也可以在此目录中创建多个子目录:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
.
└── layouts
    └── partials
        ├── footer
        │   ├── scripts.html
        │   └── site-footer.html
        ├── head
        │   ├── favicons.html
        │   ├── metadata.html
        │   ├── prerender.html
        │   └── twitter.html
        └── header
            ├── site-header.html
            └── site-nav.html

所有部分模板在您的模板内以下面模式调用:

1
{{ partial "<PATH>/<PARTIAL>.html" . }}

如上面例子目录结构中显示, 可以在partials目录中嵌套您的子目录以获得更好代码组织。 调用的时候使用嵌套的部分模板的相对路径即可:

1
2
{{ partial "header/site-header.html" . }}
{{ partial "footer/scripts.html" . }}

变量作用范围

部分模板调用的第二个参数是传递给它的变量。上面例子中传递的., 通知接受部分模板的模板应用当前的上下文context.

这意味着部分模板将 仅仅 可以访问传递的上下文的变量. 部分模板是隔离开的、不能访问外部范围. 在部分模板中,$.Var等同于 .Var

从部分模板返回值

输出标记以外, 部分模板可以被用来返回任何值。为返回一个值,部分模板必须包含一个独立的 return 语句.

内联的部分模板

可以在模板中定义内联的部分模板.不过,请注意模板命名空间是全局的,所以需要注意保证内联模板名称要唯一,避免冲突.

1
2
3
4
5
6
Value: {{ partial "my-inline-partial" . }}

{{ define "partials/my-inline-partial" }}
{{ $value := 32 }}
{{ return $value }}
{{ end }}

例子 获得具有特殊参数的页面

1
2
{{/* layouts/partials/GetFeatured.html */}}
{{ return first . (where site.RegularPages "Params.featured" true) }}
1
2
3
4
{{/* layouts/index.html */}}
{{ range partial "GetFeatured.html" 5 }}
  [...]
{{ end }}

例子 获取图片

1
2
3
4
5
6
7
8
9
{{/* layouts/partials/GetImage.html */}}
{{ $image := false }}
{{ with .Params.gallery }}
  {{ $image = index . 0 }}
{{ end }}
{{ with .Params.image }}
  {{ $image = . }}
{{ end }}
{{ return $image }}
1
2
3
4
{{/* layouts/_default/single.html */}}
{{ with partial "GetImage.html" . }}
  [...]
{{ end }}

缓存的部分模板

模板函数partialCached 对于并不需要每次调用都重新呈现的复杂模板, 可以提供很多的性能提升. 最简单的用法如下:

1
{{ partialCached "footer.html" . }}

也可以提供额外参数给 partialCached来创建缓存的部分模板的变体。

比如,可以通知Hugo仅为每个section部分的footer.html呈现一次.

1
{{ partialCached "footer.html" . .Section }}

如果需要传递更多参数来创建唯一的变体, 可以按需传递更多变体参数:

1
{{ partialCached "footer.html" . .Params.country .Params.province }}

请注意变体参数对底层的部分模板不可见。他们仅仅用于创建一个唯一的缓存键.

例子 header.html

下面的 header.html部分模板使用在spf13.com:

layouts/partials/header.html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16

<!DOCTYPE html>
<html class="no-js" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<head>
    <meta charset="utf-8">

    {{ partial "meta.html" . }}

    <base href="{{ .Site.BaseURL }}">
    <title> {{ .Title }} : spf13.com </title>
    <link rel="canonical" href="{{ .Permalink }}">
    {{ if .RSSLink }}<link href="{{ .RSSLink }}" rel="alternate" type="application/rss+xml" title="{{ .Title }}" />{{ end }}

    {{ partial "head_includes.html" . }}
</head>
<body lang="en">

例子 footer.html

下面的 footer.html 部分模板使用在spf13.com:

layouts/partials/footer.html
 1
 2
 3
 4
 5
 6
 7
 8
 9
10

<footer>
  <div>
    <p>
    &copy; 2013-14 Steve Francia.
    <a href="https://creativecommons.org/licenses/by/3.0/" title="Creative Commons Attribution">Some rights reserved</a>;
    please attribute properly and link back.
    </p>
  </div>
</footer>