在Next.js网页上添加AMP组件

1,132 阅读6分钟

加速移动页面,或AMP,是一个开源的网络组件框架,可以提高网页的加载速度。AMP对网页的HTML、CSS和JavaScript规定了严格的准则,控制媒体、广告和其他脚本等外部资源的加载方式。

在本教程中,我们将浏览AMP的一些准则,学习如何管理出现的一些权衡因素。我们将介绍如何通过在Next.js项目中使用AMP组件,在网页上显示耗费资源的元素,同时仍然遵守AMP的规则。

如果你想跟着学习,本教程的所有代码都可以在我的GitHub上找到。让我们开始吧!

AMP的局限性

AMP通过阻止开发者使用包含图片、视频和音频等资源的自定义元素来优化网页加载。同样,开发者也不能为显示动态广告、嵌入社交媒体帖子和创建交互式表单等任务编写自定义JavaScript。为了解决这些限制,我们将使用AMP组件。

AMP组件

AMP组件是自定义编写的HTML片段,我们可以用它来为我们的网页添加复杂的功能,同时仍然符合AMP的标准。

目前,AMP组件目录包括许多常见任务的内置组件,如添加图片、计算网页分析和显示广告。因为内置组件包含在AMP的基础库中,所以你不需要在你的代码中明确包含它们。

扩展组件是对基础库的扩展,因此默认不包括。在你的代码中,你需要把扩展组件作为自定义元素明确地包含进去。例如,你可能希望用amp-analytics 添加页面分析,或用amp-lightbox 添加一个灯箱。

该目录还包括实验性组件,这些组件已经发布,但还不支持广泛使用。如果你在组件目录中找不到你需要的东西,你可能希望编写你自己的AMP组件!

现在我们知道了有哪些AMP组件可用,让我们在网页上添加一个吧!

将一个网页变成AMP页面

在给我们的网页添加AMP组件之前,我们需要把我们的网页配置成一个AMP页面。amp 配置接受两种类型的值:truehybrid 。输入一个值true ,就可以把网页变成一个AMP的HTML页面。输入一个值hybrid ,就可以创建两个版本的网页,一个是AMP HTML,一个是标准HTML,标准HTML是默认的。

让我们用true 将我们的网页配置为AMP页面。

export const config = { amp: true }

现在,让我们通过运行下面的代码块来创建一个真正的AMP页面。

export default function Page = () => {
  return <h1>My First AMP Page</h1>
}

当我们导出真正的AMP页面时,Next.js将创建两个版本的页面,一个是为你的用户提供的优化版本,一个是为搜索引擎提供的非优化版本。

要创建一个混合AMP页面,你所要做的就是把页面的配置值改为hybrid

export const config = { amp: 'hybrid' }
export default function Page = () => {
  return <h1>My First AMP Page</h1>
}

要访问AMP页面,你需要在URL的末尾添加?amp=1 。此外,由于hybrid 不像true 那样是一个布尔值,你需要用引号将其包围。

混合AMP页面要求你为AMP和标准HTML页面编写有效的HTML。为了渲染正确的HTML,我们可以使用useAmp React Hook。

useAmp React Hook

通过导入下面的包,将useAmp React Hook添加到你的网页上。

import { useAmp } from 'next/amp'

接下来,创建一个变量,保存React Hook的输出。

const isAmp = useAmp()

现在,你可以使用三元运算符或if 语句来渲染正确的HTML。

{isAmp ? (
    // AMP component
    ) : (
    // Standard HTML
    )
}

最后,我们要把所有的东西放在一起!在下面的例子中,我们将使用amp-img ,一个加载图像的AMP组件,在我们的网页上显示一个图像。

import { useAmp } from "next/amp";
import Image from "next/image";

export const config = { amp: "hybrid" };

export default function Hybrid() {
  const isAmp = useAmp();

  return (
    <div>
      <h1>Hybrid AMP Page&lt;/h1>
      {isAmp ? (
        <amp-img
          alt="A view of the sea"
          src="/chiangmai.jpeg"
          width="640"
          height="360"
        ></amp-img>
      ) : (
        <Image
          alt="A view of the sea"
          src="/chiangmai.jpeg"
          width="640"
          height="360"
        />
      )}
    </div>
  );
}

在上面例子中的AMP版本中,我们不需要使用默认的HTML<img> 标签。此外,由于amp-img 是作为一个内置的组件,我们不需要把它导入到我们的网页上如果AMP组件库中的某个组件没有被包含在基础库中,我们会收到以下通知,即它需要一个外部脚本。

<script async custom-element="amp-carousel" src="https://cdn.ampproject.org/v0/amp-carousel-0.2.js"></script>

在Next.js中,你需要在文档的头部包含这个script 标签,如下面的代码块所示。

<Head>
    <script
      async
      custom-element="amp-carousel"
      src="https://cdn.ampproject.org/v0/amp-carousel-0.2.js"
    ></script>
</Head>

AMP验证

在我们导出AMP页面之前,让我们确保它符合AMP的要求。添加验证的方法有很多,例如,npm包、命令行工具、浏览器扩展程序和开发人员控制台!这些方法都是为了满足AMP要求。让我们来看看Next.js中AMP验证的内置方法。 amphtml-validator.

在构建和导出过程中,amphtml-validator 要求AMP页面符合AMP规范。任何警告或错误都将显示在终端。

例如,假设你试图使用一个普通的HTML<img> 标签,而不是amp-img 。这将导致导出时出现错误,如下面的代码所示。

Amp Validation

/hybrid?amp=1  error  The parent tag of tag 'img' is 'div', but it can only be 'i-amphtml-sizer-intrinsic'.
               error  The parent tag of tag 'img' is 'div', but it can only be 'i-amphtml-sizer-intrinsic'.


> Build error occurred
Error: AMP Validation caused the export to fail. https://nextjs.org/docs/messages/amp-export-validation

如果你想使用一个自定义的AMP验证器,你可以在next.config.js 文件中加入你的自定义验证规则的路径。

module.exports = {
  amp: {
    validator: './custom_validator.js',
  },
}

在Next.js中导出AMP页面

如果没有验证错误,运行next export ,将把我们所有的页面导出为静态HTML页面。Next.js会自动检测一个页面是否支持AMP,并以正确的格式导出该页面。

如前所述,一个混合AMP页面将被导出为两个文件。例如,假设我们有一个名为pages/blog.js 的混合页面。它将被导出为out/blog.html ,一个带有客户端React运行时间的标准HTML页面,以及out/blog.amp.html ,一个AMP HTML页面。

Next.js会自动插入一个从AMP页面到标准HTML页面的链接,反之亦然,分别见于以下两个代码片断。

<link rel="amphtml" href="/blog.amp.html" />


<link rel="canonical" href="/blog" />

如果pages/blog.js 是一个真正的AMP页面,它将导出一个名为out/blog.html 的HTML文件。

结论

现在,你知道如何在Next.js中开始使用AMP组件了吧

在本教程中,我们介绍了内置的、可扩展的和实验性的AMP组件,真正的和混合的AMP页面,以及useAmp React Hook。然后,我们学习了如何在Next.js中验证和导出AMP页面。

在撰写本文时,AMP只支持CSS-in-JS的样式设计。然而,对CSS模块的支持正在开发中,你可以在GitHub上找到一些变通方法。

同样地,官方也没有对TypeScript的支持。虽然它在路线图上,但目前还没有预定的发布日期。作为一种变通方法,你可以在你的项目中创建一个自定义类型的文件,名为 [amp.d.ts](https://stackoverflow.com/questions/50585952/typescript-and-google-amp-property-amp-img-does-not-exist-on-type-jsx-intrin/50601125#50601125)的文件,并为AMP添加自定义类型。

我希望你喜欢这个教程!如果你发现自己被卡住了,请留下评论,我会尽力帮助你的。

The postAdding AMP components to a Next.js webpageappeared first onLogRocket Blog.