AMP

amp-mustache

描述

允許呈現 Mustache 範本。

 

必要腳本

<script async custom-template="amp-mustache" src="https://cdn.ampproject.org/v0/amp-mustache-0.1.js"></script>

版本說明

版本 描述
0.2 支援 SVG 元素並縮減套件大小 (12.2KB vs. 20.5KB,gzip 壓縮)。

遷移至更現代的 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>

然後,可以在 scripttemplate 標籤中定義 Mustache 範本,如下所示:

<!-- Using template tag. -->
<template type="amp-mustache">
  Hello {{world}}!
</template>

<script type="text/plain" template="amp-mustache">
  Hello {{world}}!
</script>

請盡可能使用 template 標籤,因為 AMP 驗證會提供實用的開發體驗提示。針對表格環境中的範本建立邊緣案例和問題,請使用 script 範本。請參閱下方的「表格」章節。

範本如何被探索、何時呈現、如何提供資料,都由目標 AMP 元素決定,該元素會使用此範本來呈現其內容 (例如,在 amp-listamp-form 等中)。

限制

驗證

就像所有 AMP 範本一樣,amp-mustache 範本也必須是格式良好的 DOM 片段。這表示除了其他事項外,您無法使用 amp-mustache 來執行下列操作:

  • 計算標籤名稱。例如,不允許使用 <{{tagName}}>
  • 計算屬性名稱。例如,不允許使用 <div {{attrName}}=something>

「三花括號」的輸出會經過清理,僅允許以下標籤:

aarticleasidebblockquotebrcaptioncodecolcolgroupdddeldetailsdivdldtemfigcaptionfigurefooterh1h2h3headerhriinslimainmarknavolppreqssectionsmallspanstrongsubsummarysuptabletbodytdtfootththeadtimetruul

淨化

Mustache 輸出經過清理是為了安全性和維持 AMP 有效性。這可能會導致某些元素和屬性遭到靜默移除。

陷阱

巢狀範本

根據 AMP 驗證,<template> 元素不得為其他 <template> 元素的子元素。當巢狀使用兩個使用範本的元件時,可能會發生這種情況,例如 amp-listamp-form

為了解決這個問題,<template> 元素也可以透過元件上的 template 屬性,依 id 參照。

<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>

解決方法包括將 Mustache 區段包裝在 HTML 註解中 (例如 <!-- {{#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; -> &amp;quot;)。一種解決方法是使用類似的字元,例如 ′ (&prime;) 和 ″ (&Prime;)。

HTML 實體

HTML 實體在 <template> 元素中不會被保留。

如果您想要伺服器端轉譯包含使用者產生文字的 <template>,這可能會是個問題,因為包含 {{}}{{{}}} 的使用者產生文字會被視為 Mustache 區段。例如,將 {{ 取代為 HTML 實體 &lcub;&lcub; 將無法運作,因為當瀏覽器剖析 <template> 時,它們不會被保留。

解決方法包括將 {{ 之類的字串取代為不同的字元,或直接從使用者產生的內容中移除它們。

驗證

請參閱 AMP 驗證器規格中的 amp-mustache 規則

需要更多協助嗎?

您已經讀過這份文件很多次,但它仍然沒有涵蓋您的所有問題嗎?也許其他人也有同感:請在 Stack Overflow 上與他們聯繫。

前往 Stack Overflow
發現錯誤或缺少功能嗎?

AMP 專案大力鼓勵您的參與和貢獻!我們希望您能成為我們開放原始碼社群的長期參與者,但我們也歡迎針對您特別熱衷的問題提供一次性的貢獻。

前往 GitHub