AMP
示例
使用 Next.js,您可以将任何 React 页面转换为 AMP 页面,只需最少的配置,无需离开 React。
您可以在官方的 amp.dev 网站上了解更多关于 AMP 的信息。
启用 AMP
要为页面启用 AMP 支持,并详细了解不同的 AMP 配置,请阅读 next/amp
的 API 文档。
注意事项
- 仅支持 CSS-in-JS。目前,AMP 页面不支持 CSS 模块。您可以 为 Next.js 贡献 CSS 模块支持。
添加 AMP 组件
AMP 社区提供了 许多组件 来使 AMP 页面更具交互性。Next.js 会自动导入页面上使用的所有组件,无需手动导入 AMP 组件脚本
export const config = { amp: true }
function MyAmpPage() {
const date = new Date()
return (
<div>
<p>Some time: {date.toJSON()}</p>
<amp-timeago
width="0"
height="15"
datetime={date.toJSON()}
layout="responsive"
>
.
</amp-timeago>
</div>
)
}
export default MyAmpPage
以上示例使用了 amp-timeago
组件。
默认情况下,始终导入组件的最新版本。如果要自定义版本,可以使用 next/head
,如下例所示
import Head from 'next/head'
export const config = { amp: true }
function MyAmpPage() {
const date = new Date()
return (
<div>
<Head>
<script
async
key="amp-timeago"
custom-element="amp-timeago"
src="https://cdn.ampproject.org/v0/amp-timeago-0.1.js"
/>
</Head>
<p>Some time: {date.toJSON()}</p>
<amp-timeago
width="0"
height="15"
datetime={date.toJSON()}
layout="responsive"
>
.
</amp-timeago>
</div>
)
}
export default MyAmpPage
AMP 验证
在开发过程中,AMP 页面会使用 amphtml-validator 自动进行验证。错误和警告将显示在您启动 Next.js 的终端中。
在进行静态 HTML 导出时,页面也会进行验证,任何警告/错误都会打印到终端。任何 AMP 错误都会导致导出以状态码1
退出,因为导出不是有效的 AMP。
自定义验证器
您可以在 next.config.js
中设置自定义 AMP 验证器,如下所示
module.exports = {
amp: {
validator: './custom_validator.js',
},
}
跳过 AMP 验证
要关闭 AMP 验证,请将以下代码添加到 next.config.js
中
experimental: {
amp: {
skipValidation: true
}
}
静态 HTML 导出中的 AMP
当使用静态 HTML 导出静态预渲染页面时,Next.js 会检测页面是否支持 AMP,并根据此更改导出行为。
例如,混合 AMP 页面 pages/about.js
将输出
out/about.html
- 带有客户端 React 运行时的 HTML 页面out/about.amp.html
- AMP 页面
如果 pages/about.js
是一个仅限 AMP 的页面,那么它将输出
out/about.html
- 优化的 AMP 页面
Next.js 会自动在 HTML 版本中插入指向页面 AMP 版本的链接,因此您无需手动操作,如下所示
<link rel="amphtml" href="/about.amp.html" />
并且页面 AMP 版本将包含指向 HTML 页面的链接
<link rel="canonical" href="/about" />
当启用trailingSlash
时,pages/about.js
的导出页面将为
out/about/index.html
- HTML 页面out/about.amp/index.html
- AMP 页面
TypeScript
AMP 目前没有为 TypeScript 内置类型,但它在他们的路线图中(#13791)。
作为一种变通方法,您可以在项目中手动创建一个名为 amp.d.ts
的文件,并添加这些自定义类型。
这有帮助吗?