AMP

AMP 验证错误

有效的 AMP 文档不得包含任何验证错误。本文档的目的是帮助您更好地理解和修复在验证您的 AMP 页面时遇到的任何验证错误。有关验证错误的完整概述,请参阅AMP 验证器规范

AMP HTML 标签和属性错误

缺少必需的标签

代码 MANDATORY_TAG_MISSING
格式 “缺少或不正确的必需标签 '%1'。”
修复 添加(或更正)必需的 HTML 标签。

以下标签必须存在于所有 AMP 文档中

  • <!doctype html>
  • <html amp> 或 <html ⚡>
  • <head>
  • <link rel="canonical" href="$SOME_URL">
  • <meta charset="utf-8">
  • <meta name="viewport" content="...">
  • <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>
  • <script async src="https://cdn.ampproject.org/v0.js"></script>
  • <body>

这些必需标签在AMP 验证器规范中包含 mandatory: true 字段;它们也在AMP 规范中被引用。

缺少另一个标签所需的标签

代码 TAG_REQUIRED_BY_MISSING
格式 “缺少或不正确的标签 '%1',但标签 '%2' 需要它。”
修复 添加(或更正)必需的 HTML 标签。

当验证器在 AMP 文档中找到扩展组件,但找不到其等效的 <script> 时,会抛出 TAG_REQUIRED_BY_MISSING 错误。

扩展组件必须作为自定义元素显式包含在 AMP 文档中。要修复这些错误,请导航到扩展组件的参考页面,复制其必需的脚本,并将其粘贴到 AMP 文档的 <head> 中。

不允许的标签

代码 DISALLOWED_TAG
格式 “不允许使用标签 '%1'。”
修复 删除不允许的标签。

标签是允许列表制的,因此没有所有不允许标签的明确列表;但是,AMP 规范大致定义了不允许的标签集。

不允许自定义 JavaScript

代码 DISALLOWED_SCRIPT_TAG
格式 “不允许自定义 JavaScript。”
修复 删除 javascript 标签或使用 amp-script。

AMP 格式不允许通过 <script> 元素将自定义 JavaScript 添加到页面。JavaScript 的许多常见用法都有 AMP HTML 库的等效实现。有关可用于增强 AMP HTML 页面的组件集,请参阅AMP 组件

如果没有任何可用组件涵盖您的用例,则可以使用amp-script来运行您的自定义 JavaScript。

缺少必需的属性

代码 MANDATORY_ATTR_MISSING
格式 “标签 '%2' 中缺少必需的属性 '%1'。”
修复 将必需的属性添加到标签。

AMP 标签的必需属性在AMP 验证器规范中定义。只需搜索标签,查看列出的属性,并检查 mandatory: true。每个 AMP 标签的必需属性也列在该标签的规范中。

无效的属性值

代码 INVALID_ATTR_VALUE
格式 “标签 '%2' 中的属性 '%1' 被设置为无效值 '%3'。”
修复 将属性值修复为有效值。

此错误表示 HTML 标签具有允许的名称的属性,但不是允许的值。例如,此错误的常见触发因素是 URL 的无效值。所有 URL 值(在 hrefsrc 属性中)必须匹配这些可能的属性值之一。

重要提示:AMP 中的许多 URL 值都需要 HTTPS。如果您收到此错误,并且不确定原因,请检查相关的 AMP 标签的规范,以查看该属性是否需要 HTTPS。

不允许的属性

代码 DISALLOWED_ATTR
格式 “属性 '%1' 不得出现在标签 '%2' 中。”
修复 从 HTML 标签中删除属性。

属性是允许列表制的,因此没有所有不允许属性的明确列表。要检查每个特定标签支持的属性,请在AMP 验证器规范中搜索 HTML 标签,然后搜索 attrs

除了每个标签的特定属性允许列表外,所有 AMP 标签都可以使用 $GLOBAL_ATTRS 下允许列表中的任何属性;前缀为 "data-" 的所有属性也都允许列表。

缺少或不正确的必需文本

代码 MANDATORY_CDATA_MISSING_OR_INCORRECT
格式 “标签 '%1' 内的必需文本 (CDATA) 缺失或不正确。”
修复 添加或更正标签内的必需文本。

CDATA 是开始和结束 HTML 标签之间的内容数据,目前通过允许列表和拒绝列表进行评估。具有必需 CDATA 的标签包括

<style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript>

<style amp-custom>

此错误的详细消息可以是以下之一

  • “必需的样式样板(启用 js)”
  • “必需的样式样板(noscript)”
  • “不允许的 -amp- CSS 类名前缀”
  • “不允许在 CSS 中使用 !important 属性”
  • “不允许在 CSS 中使用 @charset”
  • “不允许在 CSS 中使用 @import”
  • “不允许在 CSS 中使用 @namespace”
  • “不允许在 CSS 中使用 @supports”
  • “不允许在 CSS 中使用 @document”
  • “不允许在 CSS 中使用 @page”

  • “不允许在 CSS 中使用 @viewport”

标签内不允许的文本

代码 CDATA_VIOLATES_DENYLIST
格式 “标签 '%1' 内的文本 (CDATA) 与 '%2' 匹配,这是不允许的。”
修复 删除不允许的文本。

已拒绝特定 CSS 数据以验证基本 CSS AMP 规则。

以下是拒绝的 CSS 数据列表(另请参阅AMP 验证器规范中的 disallowed_cdata_regex

  • "\\.i?-amp-"(“CSS -amp- 类名前缀”)
  • “!important”
  • “charset”
  • “&#64;import”
  • “@namespace”
  • “@document”
  • “@page”

  • “@viewport”

标签属性中不允许的属性

代码 DISALLOWED_PROPERTY_IN_ATTR_VALUE
格式 “标签 '%3' 中的属性 '%2' 中的属性 '%1' 是不允许的。”
修复 删除指定属性中不允许的属性。

当属性内部的属性名称不允许时,会发生此错误。此处的属性是指属性内的结构化键/值数据。

例如,以下内容将导致错误

<meta http-equiv="X-UA-Compatible" content="invalidfoo=edge">

应该是:<meta http-equiv="X-UA-Compatible" content="ie=edge">。再举一个例子,在

<meta name="viewport content="width=device-width;minimum-scale=1"> 中,widthminimum-scale 是属性名称。

以下结果会导致 DISALLOWED_PROPERTY_IN_ATTR_VALUE 错误

<meta name="viewport content="width=device-width;invalidfoo=1">

无效的属性值

代码 INVALID_PROPERTY_VALUE_IN_ATTR_VALUE
格式 "标签 '%3' 中属性 '%2' 的属性 '%1' 设置为 '%4',这是无效的。"
修复 更正无效的属性值。

当属性内的属性值无效时,会发生此错误。此处的“属性”指的是属性内结构化的键/值数据。

例如,在 <meta name="viewport content="width=device-width;minimum-scale=1"> 中,device-width1 是属性值。

以下代码会导致 INVALID_PROPERTY_VALUE_IN_ATTR_VALUE 错误

<meta name=viewport content="width=device-width;minimum-scale=invalidfoo">

请注意,如果您尝试输出一个无值属性(例如,对于 amp-video 等组件,类似 autoplaycontrolsloop 的属性),但您的 HTML 构建过程生成了默认的(但无效的)值(例如 true)(例如,React 默认会生成 <amp-video autoplay="true" ...>默认情况下),解决方法是将属性的名称作为值输出。例如,<amp-video autoplay="autoplay" ...>

缺少 URL

代码 MISSING_URL
格式 "标签 '%2' 中属性 '%1' 缺少 URL。"
修复 添加有效的 URL。

当需要 URL 的属性缺少 URL 时,会发生此错误,例如,空的 hrefsrc 属性。

无效的 URL

代码 INVALID_URL_PROTOCOL
格式 "标签 '%2' 中属性 '%1' 的 URL '%3' 格式错误"
修复 修复损坏的 URL。

当属性具有 URL,但该 URL 无效时,会发生此错误。

无效的 URL 协议

代码 INVALID_URL_PROTOCOL
格式 标签 '%2' 中属性 '%1' 的 URL 协议 '%3:' 无效。
修复 更改为有效的协议,例如,可能需要将 `http` 更改为 `https`。

对于必须设置为特定协议的 hrefsrc 属性的标签,会发生此错误。例如,许多标签需要 https

属性中缺少必需的属性

代码 MANDATORY_PROPERTY_MISSING_FROM_ATTR_VALUE
格式 "标签 '%3' 中属性 '%2' 缺少属性 '%1'。"
修复 添加缺少的属性。

当前,如果缺少以下必需属性,则会发生此错误

  • content="...ie=..."
  • content="...width=..."
  • content="...minimum-scale=..."

它们引用了预期的标签

  • <meta http-equiv="X-UA-Compatible" content="ie=edge">
  • <meta name=viewport content="width=device-width;minimum-scale=1">

互斥的属性

代码 MUTUALLY_EXCLUSIVE_ATTRS
格式 "标签 '%1' 中遇到互斥属性 - 请选择 %2 中的一个。"
修复 删除其中一个互斥属性。

当标签同时具有两个互斥属性时,会发生此错误。例如,对于以下标签,只允许使用其中一个

缺少列表中的必需属性

代码 MANDATORY_ONEOF_ATTR_MISSING
格式 "标签 '%1' 缺少一个必需的属性 - 请选择 %2 中的一个。"
修复 从提供的属性选择中添加缺少的必需属性。

当标签缺少多个选择中的一个必需属性时,会发生此错误。例如,以下标签需要两个可能选择中的一个属性

错误的父标签

代码 WRONG_PARENT_TAG
格式 "标签 '%1' 的父标签是 '%2',但它只能是 '%3'。"
修复 使标签成为所需父级的直接子级。

特定标签需要直接父级(而不是远祖)。以下列出了特定标签的所需父级(标签,父级)

  • !doctype 需要父标签 root
  • html 需要父标签 !doctype
  • head 需要父标签 html
  • body 需要父标签 html
  • link 需要父标签 head
  • meta 需要父标签 head
  • style amp-custom 需要父标签 head
  • style 需要父标签 boilerplate (noscript)
  • noscript 需要父标签 head
  • script 需要父标签 head
  • source 需要媒体标签(amp-audio, amp-video 等)。

不允许的标签祖先

代码 DISALLOWED_TAG_ANCESTOR
格式 "标签 '%1' 不得作为标签 '%2' 的后代出现。"
修复 删除(或移动)不允许的嵌套标签。

当标签是另一个未通过验证的标签的后代时,会发生此错误。目前,唯一的例子是 template 标签,它不能嵌套在另一个 template 标签下。

必需的标签祖先

代码 MANDATORY_TAG_ANCESTOR
格式 "标签 '%1' 只能作为标签 '%2' 的后代出现。"
修复 删除标签或使其成为特定标签的后代。

必需后代在 AMP 验证器规范中定义为 mandatory_ancestor

当以下标签缺少其 mandatory_ancestor 时,会发生此错误(标签,祖先)

  • img 必须是 noscript 的后代。
  • video 必须是 noscript 的后代。
  • audio 必须是 noscript 的后代。
  • noscript 必须是 body 的后代。

带有提示的必需标签祖先

代码 MANDATORY_TAG_ANCESTOR_WITH_HINT
格式 "标签 '%1' 只能作为标签 '%2' 的后代出现。你是不是想用 '%3'?"
修复 删除标签、使其成为特定标签的后代,或将标签替换为提示的标签。

当在 AMP 文档中找到以下标签之一,并且未正确嵌套在其必需的父级中时,会发生此错误

  • img 不在 noscript 父级内。
  • video 不在 noscript 父级内。
  • audio 不在 noscript 父级内。
  • noscript 不在 body 父级内。

重复的唯一标签

代码 DUPLICATE_UNIQUE_TAG
格式 "标签 '%1' 在文档中出现多次。"
修复 从 AMP 文档中删除重复的标签之一。

当只允许存在一个标签实例,并且找到重复项时,会发生此错误。

已知唯一标签的完整列表

  • <!doctype html>
  • <html amp>
  • <head>
  • <link rel=canonical href=...>
  • <link rel=amphtml href=...>
  • <meta charset="utf-8">

  • <meta viewport>

* <style amp-custom> * <style amp-boilerplate>body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}</style><noscript><style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}</style></noscript> * <body> * <script src="https://cdn.ampproject.org/v0.js">

样式和布局错误

在深入了解样式和布局错误之前,有必要了解 AMP 中样式布局的工作原理。由于 AMP 页面是 HTML 页面,因此样式与任何 HTML 页面非常相似。但是,为了确保页面快速加载,有一些限制,并且 AMP 验证器会强制执行这些限制。

AMP 页面中的布局受到更多控制。任何在页面上显示的标签都需要预定义的高度和宽度,从而显著减少渲染和滚动卡顿。这并不意味着您必须手动包含这些属性。对于某些布局类型,AMP 验证器不会抛出错误,因为会假定默认值。

每个 AMP 标签都有一个 supported_layouts 列表,如AMP 验证器规范中所定义。验证器将对不受支持的布局抛出错误,并且会检查预定义布局的验证规则。

样式表太长

代码 STYLESHEET_TOO_LONG
格式 "标签 'style' 中指定的作者样式表太长 - 我们看到 %1 个字节,而限制是 %2 个字节。"
修复 将样式表的大小减少到 75,000 字节以下。

当 AMP 验证器测量 <style amp-custom> 中样式内容的大小超过 75,000 字节的限制时,会抛出此错误。

CSS 语法错误

代码 CSS_SYNTAX
格式 "标签 '%1' 中出现 CSS 语法错误 - %2。"
修复 修复 CSS 语法错误。

当您在指定的标签中存在 CSS 语法错误时,会发生此错误。如果您不确定是什么导致了该错误,请尝试通过在线 CSS 验证器(例如,csslint)运行 CSS。

特定规则的 CSS 语法错误

代码 CSS_SYNTAX_INVALID_AT_RULE
格式 "标签 '%1' 中出现 CSS 语法错误 - 看到无效的 @ 规则 '%2'。"
修复 修复指定的 CSS 语法错误。

此错误指的是 CSS 中的 @-规则,AMP 只允许使用少量规则。(另请参阅 AMP 规范)。例如,不允许使用 @import。验证错误会明确告诉您无效的规则,从而更方便地修复该规则。

AMP 标签不支持隐含布局

代码 IMPLIED_LAYOUT_INVALID
格式 "标签 '%2' 不支持隐含布局 '%1'。"
修复 为标签提供有效的 layout 属性。

当您没有为 AMP 标签指定布局,并且隐含布局(基于宽度、高度和大小)不受支持时,会发生此错误。请在AMP 验证器规范中检查该标签的 supported_layout 值。

实际的布局行为由 layout 属性确定。有关布局工作原理的更多信息,请参阅 如何控制布局AMP HTML 布局系统规范

注意 – 如果您没有指定布局,并且没有包含 widthheight 值,则布局默认设置为 CONTAINER。由于 CONTAINER 不在任何 AMP 标签中受支持,因此验证器会抛出错误。请指定除 CONTAINER 以外的布局,或者添加 width 和/或 height 值,错误就会消失。

隐含布局不允许的属性

代码 ATTR_DISALLOWED_BY_IMPLIED_LAYOUT
格式 "标签 '%2' 中属性 '%1' 被隐含布局 '%3' 禁止。"
修复 从标签中删除不允许的属性,或者指定允许该属性的布局。

当您没有为 AMP 标签指定布局,并且隐含布局包含不允许的属性时,会发生此错误。AMP HTML 布局系统规范中描述了布局类型不允许的属性。

AMP 标签不支持指定的布局

代码 SPECIFIED_LAYOUT_INVALID
格式 "标签 '%2' 不支持指定的布局 '%1'。"
修复 指定标签支持的布局。

当标签的指定布局不受支持时,会发生此错误。请在AMP 验证器规范中检查该标签的 supported_layout 值。

实际的布局行为由 layout 属性确定。有关布局工作原理的更多信息,请参阅 如何控制布局AMP HTML 布局系统规范

指定布局不允许的属性

代码 ATTR_DISALLOWED_BY_SPECIFIED_LAYOUT
格式 "标签 '%2' 中属性 '%1' 被隐含布局 '%3' 禁止。"
修复 从标签中删除不允许的属性,或者指定允许该属性的布局。

当您为 AMP 标签指定布局,并且该布局包含不允许的属性时,会发生此错误。AMP HTML 布局系统规范中描述了布局类型不允许的属性。

布局所需属性的无效值

代码 ATTR_VALUE_REQUIRED_BY_LAYOUT
格式 "标签 '%3' 中属性 '%2' 的值 '%1' 无效 - 对于布局 '%4',请将属性 '%2' 设置为值 '%5'。"
修复 将属性设置为指定的值。

当属性值对于指定的布局无效时,会发生此错误。要了解是什么触发了此错误,您需要熟悉布局的不同行为

假设您将布局设置为 fixed-height,并且为 heightwidth 都包含了数值。fixed-height 布局采用 height 值。width 属性必须不存在,或者设置为 auto。否则,验证器会抛出 ATTR_VALUE_REQUIRED_BY_LAYOUT 错误。

宽度和高度的单位不一致

代码 INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT
格式 “标签 '%1' 中宽度和高度的单位不一致 - 宽度指定为 '%2',而高度指定为 '%3'。”
修复 请提供一致的宽度和高度单位。

除了 layout=fixed 之外,width 和 height 属性需要以相同的单位表示。当它们不一致时,会触发此错误。

例如,<amp-img src="" layout="responsive" width="42px" height="42rem"> 会导致此错误消息

“标签 'amp-img' 中宽度和高度的单位不一致 - 宽度指定为 'px',而高度指定为 'rem'。”

模板错误

AMP 页面不能包含模板语法,除非该语法位于专门设计为包含模板的 AMP 标签内,例如,amp-mustache

在源文件中包含模板是可以的,只要这些文件的生成输出不包含模板(另请参阅使用 CSS 预处理器)。

属性包含模板语法

代码 TEMPLATE_IN_ATTR_NAME
格式 “标签 '%2' 的属性名称 '%1' 中包含 Mustache 模板语法。”
修复 从属性中删除 Mustache 模板语法。

只要验证器在属性值中发现 Mustache 模板语法,就会发生此错误。

属性包含未转义的模板语法

代码 UNESCAPED_TEMPLATE_IN_ATTR_VALUE
格式 “标签 '%2' 中的属性 '%1' 设置为 '%3',其中包含未转义的 Mustache 模板语法。”
修复 转义 Mustache 模板。

只要验证器在属性值中发现 未转义的 Mustache 模板语法,就会发生此错误。

属性包含模板部分

代码 TEMPLATE_PARTIAL_IN_ATTR_VALUE
格式 “标签 '%2' 中的属性 '%1' 设置为 '%3',其中包含 Mustache 模板局部。”
修复 删除 Mustache 局部。

只要验证器在属性值中发现 Mustache 局部,就会发生此错误。

弃用错误

已弃用的标签

代码 DEPRECATED_TAG
格式 尚未定义错误消息(没有已弃用的标签)。
修复 删除已弃用的标签。

当在 AMP 文档中找到以前有效的 AMP 标签时,会出现此警告。这只是一个警告;带有警告的 AMP 文档仍然有效。目前不存在已弃用的标签;此警告保留供将来弃用时使用。

已弃用的属性

代码 DEPRECATED_ATTR
格式 “标签 '%2' 中的属性 '%1' 已弃用 - 请改用 '%3'。”
修复 作为最佳实践,请删除已弃用的属性。

当在 AMP 文档中找到以前有效的 AMP 属性时,会出现此警告。这只是一个警告;带有警告的 AMP 文档仍然有效。

通过在AMP 验证器规范中搜索 deprecation 来识别每个 AMP 标签的已弃用属性。