Foundation

Panini

一个平面文件编译器,为我们的原型模板提供支持。轻松创建具有一致布局的可重用部分的页面。

如果您曾经创建过静态网站,那么您可能会有五页共享相同的页眉和页脚。创建第一个页面,然后将公共元素复制并粘贴到下一个页面。但如果您现在需要对页眉进行更改,则需要在多个文件中进行更改。您也可以在活动中使用您的电子邮件来做到这一点!

Panini 是一个平面文件编译器,使用模板、页面和部分的概念,并由 Handlebars 模板语言提供支持,以简化创建静态原型的过程。

我们的 原型模板 使用 Panini 以及许多其他用于处理 Sass 和图像的工具,轻松创建经过优化的模板。已对其进行配置,以便利用以下所有功能,但是如果要了解如何配置库的具体内容,请访问 Panini GitHub 页面


基础知识:模板和页面

模板是设计中每个页面共享的公共布局。有可能有多个模板,但通常您只需要一个模板,并且一个页面只能使用一个模板。在原型模板中,默认布局位于 src/layouts/default.html 下。

基本模板可能如下所示

<html>
  <head>
    <title>Definitely an Email!</title>
  </head>
  <body>
    <header class="header"><!-- ... --></header>
    {{> body}}
    <footer class="footer"><!-- ... --></footer>
  </body>
</html>

在 HTML 中间是一些 Handlebars 代码:{{> body}}。在 Panini 运行时,您编写的页面会注入此处,最终为您提供一系列完整的 HTML 文件。

页面构成了布局的基础。这些文件将仅包含设计的中间部分,因为布局已经涵盖了顶部和底部。原型模板包含一个空白页面,供您开始使用,位于 src/pages/index.html 下。

基本页面可能如下所示

<h1>Page Title</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Praesentium ducimus eligendi, reiciendis corporis quam facere quaerat qui, aspernatur molestiae velit, vero ea quisquam laborum corrupti repudiandae totam, at aliquam esse.</p>

请注意,没有 <html><body> 标签,也没有页眉或页脚。当 Panini 组装您的页面时,此代码将被注入 {{> body}} 声明中。

在原型模板中,这些完成的文件被编译到一个名为 dist(代表“分发”)的独立文件夹中,其中还包括已处理的 CSS、JavaScript 和图像。此文件夹可以轻松上传到任何 ESP(电子邮件服务提供商)。


部分

部分是 Handlebars 的一个功能,允许您在页面或布局中的任何位置注入 HTML。当您需要在页面中重复某些代码块或防止单个文件因 HTML 而变得太混乱时,它们非常有用。

这是将主要分段划分为分块的布局文件的示例

<html>
  <head>
    <title>Definitely STILL an Email!</title>
  </head>
  <body>
    {{> header}}
    {{> body}}
    {{> footer}}
  </body>
</html>

{{> }} 语法指示 Handlebars 查找带该名称的 HTML 文件,并将其注入该位置。此示例中,我们有称为 header.htmlnavigation.htmlfooter.html 的文件。在原型模板中,这些文件均存在于 src/partials 中。


页面变量

页面具有几个内置变量,可在页面模板本身或与页面一起使用的布局或分块中使用。

page

打印当前页面的名称,不含其原始文件扩展名。在下例中,如果页面为 index.html,则 {{page}} 将变为 index

<p>You are here: {{page}}</p>

root

在文件路径之前使用 {{root}} 以确保无论当前页面位于哪个文件夹均有效。

例如,如果当前页面位于网站的根级别或子文件夹中,则指向外部 CSS 文件的路径将有所不同。

以下是如何将它与 <link> 标签配合使用

<link rel="stylesheet" href="{{root}}assets/css/app.css">

如果页面为 index.html,则路径看起来像这样

<link rel="stylesheet" href="assets/css/app.css">

如果页面为 folder/page.html,则路径看起来像这样

<link rel="stylesheet" href="../assets/css/app.css">

仅在子文件夹中的页面中添加 ../,这样才能正确加载 CSS。


助手

助手是操作页面内容的特殊函数。除了 Handlebars 的内置助手 之外,Panini 还包括一些自定义助手,您还可以添加自己的助手。

ifpage

仅在特定页面上显示助手内的 HTML。在下例中,助手内的 HTML 只会显示在 index.html 页面上。

{{#ifpage 'index'}}
  <p>This is definitely the Index page.</p>
{{/ifpage}}

您还可以检查多个页面。如果列表中的任何名称与当前页面匹配,则 HTML 将显示。

{{#ifpage 'index' 'about'}}
  <p>This is definitely either the Index or About page.</p>
{{/ifpage}}

unlesspage

#unlesspage#ifpage 相反,只有当当前页面不在参数中时,它才会显示其中的 HTML。

{{#unlesspage 'index'}}
  <p>This is definitely <em>not</em> the Index page.</p>
{{/unlesspage}}

repeat

重复内容 n 次。在原型中轻松打印大量重复的 HTML。

<ul>
  {{#repeat 5}}
  <li>Five hundred ninety-nine US dollars</li>
  {{/repeat}}
</ul>

markdown

将 Markdown 转换为 HTML。

{{#markdown}}
# Heading 1
Lorem ipsum [dolor sit amet](https://html5zombo.com), consectetur adipisicing elit. Nam dolor, perferendis. Mollitia aut dolorum, est amet libero eos ad facere pariatur, ullam dolorem similique fugit, debitis impedit, eligendi officiis dolores.
{{/markdown}}

自定义助手

如果您没有看到合适的助手,可以自己编写。将 javascript 文件添加到“src/helpers”,重新启动 npm,然后在模板中调用它。

// Example file src/helpers/bold.js
module.exports = function(options) {
  // options.fn(this) = Handlebars content between {{#bold}} HERE {{/bold}}
  var bolder = '<strong>' + options.fn(this) + '</strong>';
  return bolder;
}

然后在您的项目中调用自定义 {{#bold}} 助手

{{#bold}}ideas{{/bold}}

自定义数据

可以将自定义数据添加到您的页面。然后可通过 Handlebars 将此数据插入 HTML 中。有两种将数据添加到项目的方法。

若只向特定页面添加变量,则将其作为 页首信息 块添加到页面 HTML 的顶部。假设下述内容在 src/pages/index.html 内。

---
title: Page Title
description: Lorem ipsum.
---

<!-- The rest of your HTML is down here. -->

现在,您可以将这些变量的值插入 index.html 页面default.html 布局。要插入变量,请将变量名以双大括号括起来,格式如下

<h1>{{ title }}</h1>

还可通过创建外部 JSON 或 YML 文件并将其添加到项目中的 src/data 文件夹,将变量全局添加。让我们创建一个名为 breakfast.yml 的文件

- eggs
- bacon
- toast

Panini 会将此 YML 文件的内容加载为名为 {{ breakfast }} 的变量。由于它是一个数组,我们可以使用 Handlebars 的 {{#each}} 助手遍历它

<ul class="breakfast-items">
  {{#each breakfast}}
    <li>{{ this }}</li>
  {{/each}}
</ul>

此代码会打印三个 <li>,每个列表项一个。

教程

利用 Panini 保持 DRYPanini 提供大量内置的 Handlebars 帮助器,其中包括 repeat 帮助器或 Markdown 解析器,但在此课程中,我们将学习如何为 HTML 邮件创建自定义月/年帮助器。