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 组件,了解可用于增强 AMP HTML 页面的组件集。
如果没有任何可用的组件涵盖您的用例,则可以使用 amp-script
来运行您的自定义 JavaScript。
缺少强制属性
代码 | MANDATORY_ATTR_MISSING |
格式 | "标记 '%2' 中缺少强制属性 '%1'。" |
修复 | 将强制属性添加到标记。 |
AMP 标记的强制属性在AMP 验证器规范中定义。只需搜索标记,查看列出的属性,并检查 mandatory: true
。每个 AMP 标记的强制属性也列在该标记的规范中。
属性值无效
代码 | INVALID_ATTR_VALUE |
格式 | "标记 '%2' 中的属性 '%1' 设置为无效值 '%3'。" |
修复 | 将属性值修复为有效的值。 |
此错误表示 HTML 标记的属性具有允许的名称,但不具有允许的值。例如,此错误的一个常见触发因素是 URL 的无效值。所有 URL 值(在 href
和 src
属性中)必须匹配以下可能的属性值之一。
重要提示: AMP 中的许多 URL 值都需要 HTTPS。如果您遇到此错误,但不确定原因,请查看相关的 AMP 标记规范,以查看该属性是否需要 HTTPS。
不允许的属性
代码 | DISALLOWED_ATTR |
格式 | "标记 '%2' 中可能不会出现属性 '%1'。" |
修复 | 从 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"
"@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">
中,width
和 minimum-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-width
和 1
是属性值。
以下代码会导致 INVALID_PROPERTY_VALUE_IN_ATTR_VALUE 错误
<meta name=viewport content="width=device-width;minimum-scale=invalidfoo">
请注意,如果您尝试输出一个无值的属性(例如,amp-video
等组件的 autoplay
、controls
或 loop
等属性),但您的 HTML 构建过程正在生成一个默认(但无效)的值(例如 true
)(例如,React 默认会产生 <amp-video autoplay="true" ...>
默认),解决方法是将属性的名称作为值输出。例如,<amp-video autoplay="autoplay" ...>
。
缺少 URL
代码 | MISSING_URL |
格式 | "标签 '%2' 的属性 '%1' 缺少 URL。" |
修复 | 添加有效的 URL。 |
当需要 URL 的属性缺少 URL 时,会发生此错误,例如,空的 href
或 src
属性。
无效的 URL
代码 | INVALID_URL_PROTOCOL |
格式 | "标签 '%2' 的属性 '%1' 的 URL '%3' 格式错误。" |
修复 | 修复损坏的 URL。 |
当属性具有 URL,但该 URL 无效时,会发生此错误。
无效的 URL 协议
代码 | INVALID_URL_PROTOCOL |
格式 | "标签 '%2' 的属性 '%1' 的 URL 协议 '%3:' 无效。" |
修复 | 更改为有效的协议,例如,`http` 可能需要改为 `https`。 |
对于必须设置为特定协议的 href
或 src
的标签,会发生此错误。例如,许多标签需要 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 中的一个。" |
修复 | 删除其中一个互斥属性。 |
当一个标签同时具有互斥的属性时,会发生此错误。例如,以下标签只允许有一个属性
amp-iframe
:src
或srcdoc
amp-jwplayer
:data-media-id
或data-playlist-id
列表中缺少强制属性
代码 | MANDATORY_ONEOF_ATTR_MISSING |
格式 | "标签 '%1' 缺少一个强制属性 - 请选择 %2 中的一个。" |
修复 | 从提供的属性选择中添加缺少的强制属性。 |
当一个标签从多个选择中缺少一个必需的属性时,会发生此错误。例如,以下标签需要从两个可能的选择中选择一个属性
amp-twitter
:data-tweetid
或src
amp-instagram
:data-shortcode
或src
amp-iframe
:src
或srcdoc
amp-youtube
:src
或data-videoid
错误的父标记
代码 | 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 语法错误 - 看到无效的 at 规则 '%2'。" |
修复 | 修复指定的 CSS 语法错误。 |
此错误指的是 CSS 中的 @ 规则,AMP 只允许少数规则。(另请参阅 AMP 规范)。例如,不允许使用 @import
。验证错误会明确告诉您无效的规则,从而更容易修复该规则。
AMP 标记不支持隐含布局
代码 | IMPLIED_LAYOUT_INVALID |
格式 | "标签 '%2' 不支持隐含的布局 '%1'。" |
修复 | 为标签提供有效的布局属性。 |
当您没有为 AMP 标签指定布局,并且不支持隐含的布局(基于宽度、高度和大小)时,会发生此错误。请查看 AMP 验证器规范 中该标签的 supported_layout
值。
实际的布局行为由 layout
属性确定。有关布局如何工作的更多信息,请参阅 如何控制布局 和 AMP HTML 布局系统规范。
width
和 height
值,则布局默认设置为 CONTAINER。 由于任何 AMP 标签都不支持 CONTAINER,因此验证器会抛出错误。请指定 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
,并且为 height
和 width
都包含了数值。fixed-height
布局采用 height
值。width
属性必须不存在,或者设置为 auto
。验证器会抛出 ATTR_VALUE_REQUIRED_BY_LAYOUT 错误。
宽度和高度的单位不一致
代码 | INCONSISTENT_UNITS_FOR_WIDTH_AND_HEIGHT |
格式 | “标签 '%1' 中宽度和高度的单位不一致 - 宽度以 '%2' 指定,而高度以 '%3' 指定。” |
修复 | 提供一致的宽度和高度单位。 |
除了 layout=fixed
之外,宽度和高度属性需要以相同的单位表示。当它们不一致时,会触发此错误。
例如,<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 标签的已弃用属性。