amp-mustache
说明
允许呈现 Mustache 模板。
所需脚本
<script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js"></script>
示例
版本说明
版本 | 说明 |
---|---|
0.2 | 支持 SVG 元素,减小捆绑大小(12.2KB 对比 20.5KB,已压缩)。 迁移到更现代的 HTML 清理库(从 Caja 到 DOMPurify)。由于标签和属性允许列表的不同,这可能会导致一些轻微的破坏性更改。我们建议在推送到生产环境之前先测试您的页面,以确保生成的标记中的更改不会影响功能。 |
0.1 | 初始实现。 |
语法
Mustache 是一种无逻辑的模板语法。有关更多详细信息,请参阅 Mustache 规范。一些核心的 Mustache 标签是
{{variable}}
:变量标签。它输出变量的 HTML 转义值。{{#section}} {{/section}}
:节标签。它可以测试变量是否存在,如果它是一个数组,则可以对其进行迭代。{{^section}} {{/section}}
:反向标签。它可以测试变量不存在。{{{unescaped}}}
:未转义的 HTML。它对其可能输出的标记有限制(请参阅下面的“限制”)。
用法
amp-mustache
模板必须根据 AMP 模板规范 进行定义和使用。
首先,必须像这样声明/加载 amp-mustache
<script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js" ></script>
然后,可以在 script
或 template
标签中定义 Mustache 模板,如下所示
<!-- Using template tag. --> <template type="amp-mustache"> Hello {{world}}! </template>
或
<script type="text/plain" template="amp-mustache"> Hello {{world}}! </script>
尽可能使用 template
标签,因为 AMP 验证提供了有用的 dev-x 提示。对于极端情况和表格上下文中模板化的问题,请使用 script
模板。请参阅下面的“表格”部分。
如何发现模板、何时呈现模板、如何提供数据,所有这些都由使用此模板呈现其内容的目标 AMP 元素决定(例如,在 amp-list、amp-form 等中)。
限制
验证
与所有 AMP 模板一样,amp-mustache
模板也必须是格式良好的 DOM 片段。这意味着除其他事项外,您不能使用 amp-mustache
来
- 计算标签名称。例如,不允许
<{{tagName}}>
。 - 计算属性名称。例如,不允许
<div {{attrName}}=something>
。
“三重小胡子”的输出被清理,只允许以下标签
清理
出于安全原因以及为了维护 AMP 的有效性,Mustache 输出已过消毒处理。这可能会导致某些元素和属性被静默移除。
陷阱
嵌套模板
根据 AMP 验证,<template>
元素不得作为其他 <template>
元素的子元素。当嵌套使用模板的两个组件(例如 amp-list
和 amp-form
)时,可能会出现这种情况。
为解决此问题,还可以通过组件上的 template
属性通过 id
引用 <template>
元素。例如
<amp-list id="myList" src="https://foo.com/list.json"> <template type="amp-mustache"> <div>{{title}}</div> </template> </amp-list>
也可以表示为
<!-- Externalize templates to avoid nesting. --> <template type="amp-mustache" id="myTemplate"> <div>{{title}}</div> </template> <amp-list id="myList" src="https://foo.com/list.json" template="myTemplate"> </amp-list>
表格
由于 AMP 模板字符串必须在 <template>
元素中指定,因此这可能会由于浏览器解析而导致意外行为。例如,<table>
元素可能会导致文本的 寄养。在以下示例中
<template type="amp-mustache"> <table> <tr> {{#foo}} <td></td> {{/foo}} </tr> </table> </template>
浏览器会将文本节点 {{#foo}}
和 {{/foo}}
寄养为父元素
{{#foo}} {{/foo}}<table> <tr> <td></td> </tr> </table>
解决方法包括用 HTML 注释包装 Mustache 部分(例如 <!-- {{#bar}} -->
),改用非表格元素(如 <div>
),或使用 <script type="text/plain">
标记来定义模板。
<script type="text/plain" template="amp-mustache"> <table> <tr> {{#foo}}<td></td>{{/foo}} </tr> </table> </script>
引用转义
在使用 amp-mustache
计算属性值时,引用转义可能是一个问题。例如
<template type="amp-mustache"> <!-- A double-quote (") in foo will cause malformed HTML. --> <amp-img alt="{{foo}}" src="example.jpg" width="100" height="100"></amp-img> <!-- A single-quote (') or double-quote (") in bar will cause an AMP runtime parse error. --> <button on="tap:AMP.setState({foo: '{{bar}}'})">Click me</button> </template>
在 {{foo}}
或 {{bar}}
变量中使用 HTML 字符代码不起作用,因为 Mustache 会对 &
字符进行 HTML 转义(例如 "
-> &quot;
)。一种解决方法是使用类似字符,例如 ′ (′
) 和 ″ (″
)。
HTML 实体
HTML 实体不会保留在 <template>
元素中。
如果你想在服务器端渲染包含用户生成文本的 <template>
,这可能是一个问题,因为包含 {{
、}}
、{{{
、}}}
的用户生成文本将被视为 Mustache 部分。例如,用 HTML 实体 {{
替换 {{
不起作用,因为当浏览器解析 <template>
时,它们不会被保留。
解决方法包括用不同的字符替换 {{
等字符串,或直接从用户生成的内容中删除它们。
验证
请参阅 AMP 验证规范中的 amp-mustache 规则。
你已经读过本文档十几次了,但它并没有真正涵盖你的所有问题?也许其他人也有同样的感觉:在 Stack Overflow 上联系他们。
转到 Stack Overflow 发现错误或缺少功能?AMP 项目强烈鼓励您参与和贡献!我们希望您成为我们开源社区的持续参与者,但我们也欢迎您对您特别热衷的问题进行一次性贡献。
转到 GitHub