Next.js--- SEO(搜索引擎优化)

173 阅读5分钟

SEO策略

1、语义化标签

  • <h1> ~~ <h6>

2、站点地图(Sitemap)【www.imooc.com/article/373…

站点地图是一个XML文件,列出网站页面的URL,以及其他信息。

  • 安装软件包npm install next-sitemap
  • 在项目的根目录下创建next-sitemap.config.js文件

/** @type {import('next-sitemap').IConfig} */
    module.exports = {
      siteUrl: process.env.SITE_URL || 'https://example.com',
      generateRobotsTxt: true, // (可选,默认为 false)
      // ...其他配置项
    }


  • 在package.json文件中添加脚本内容

 "scripts": {
      "build": "next build",
      "postbuild": "next-sitemap"
    }

  • 执行构建任务 npm run build,构建成功后会在项目根目录找到sitemap.xml和robots.txt文件
  • 在sitemap.xml文件中配置页面的优先级

3、结构化数据标记(Schema.org)

结构化数据能帮助搜索引擎更好地理解网站内容。优化原则是使用标准的标记语言,如 JSON – LD,准确描述网站的信息。

  • 安装react-schemaorg库帮助生成这些标记 npm install react-schemaorg
  • 创建结构化数据,JSON-LD格式
import { SchemaOrg } from 'react-schemaorg';
 
const ArticleSchema = {
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "The Rock Climbs Everest",
  "image": [
    "https://example.com/photos/1x1/photo.jpg",
    "https://example.com/photos/4x3/photo.jpg",
    "https://example.com/photos/16x9/photo.jpg"
  ],
  "datePublished": "2015-02-05T08:00:00+08:00",
  "dateModified": "2015-02-05T09:20:00+08:00",
  "author": {
    "@type": "Person",
    "name": "Jane Doe"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Example Publisher",
    "logo": {
      "@type": "ImageObject",
      "url": "https://example.com/logo.jpg"
    }
  }
};

  • 在Next.js页面中使用结构化数据
import Head from 'next/head';
import { SchemaOrg } from 'react-schemaorg';
import ArticleSchema from './path-to-your-schema'; // 确保导入你的结构化数据对象
 
export default function Page() {
  return (
    <>
      <Head>
        <SchemaOrg item={ArticleSchema} />
      </Head>
      {/* 页面内容 */}
    </>
  );
}

  • 使用Google的Structured Data Testing Tool来验证你的页面是否正确显示了结构化数据。这可以帮助你确保SEO优化效果。
  • 动态数据和服务器端渲染(SSR)或静态站点生成(SSG)

如果页面内容是动态生成的(例如,基于数据库查询),确保在服务器端或构建时生成结构化数据。

export async function getStaticProps() {
  const articleData = await fetchArticleData(); // 假设这是一个异步函数来获取文章数据
  const schema = createSchema(articleData); // 创建结构化数据对象
  return { props: { schema } }; // 将结构化数据传递给页面组件
}

然后在页面中使用props:

import { SchemaOrg } from 'react-schemaorg';
import Head from 'next/head';
import { useRouter } from 'next/router'; // 用于获取路由信息,如果需要的话
import ArticleSchema from './path-to-your-schema'; // 根据实际情况导入或使用props中的schema对象
 
export default function Page({ schema }) { // 使用props中的schema对象
  return (
    <>
      <Head>
        <SchemaOrg item={schema} />
      </Head>
      {/* 页面内容 */}
    </>
  );
}

1、自动处理元数据(Meta Data)

元数据,如<title><meta>标签,Next.js通过next/head组件,自动为每个页面添加元数据,并且允许开发者自定义页面的元数据。

import Head from 'next/head';

const Page = () => (
  <div>
    <Head>
      <title>页面标题</title>
      <meta name="description" content="这是一个SEO优化的页面" />
    </Head>
    <h1>页面内容</h1>
  </div>
);

export default Page;

1-1、动态处理元数据

通过next/head,我们可以根据页面的内容动态设置Meta标签,从而优化SEO和社交媒体的展示效果。

import Head from 'next/head';

export default function PostPage({ post }) {
  return (
    <>
      <Head>
        <title>{post.title} - My Blog</title>
        <meta name="description" content={post.excerpt} />
        <meta name="robots" content="index, follow" />
        <meta property="og:title" content={post.title} />
        <meta property="og:description" content={post.excerpt} />
        <meta property="og:image" content={post.imageUrl} />
        <meta property="og:url" content={`https://myblog.com/posts/${post.id}`} />
      </Head>
      <main>
        <h1>{post.title}</h1>
        <p>{post.content}</p>
      </main>
    </>
  );
}

export async function getServerSideProps({ params }) {
  const res = await fetch(`https://api.example.com/posts/${params.id}`);
  const post = await res.json();
  return { props: { post } };
}

通过getServerSideProps获取文章数据,并在页面渲染时动态地设置了多个Meta标签。

2、自动图片优化

页面的加载速度是SEO排名的一个重要因素。Next.js内置了next/image组件,能够自动优化图片,支持延迟加载、自动选择最佳图片格式(如WebP)、调整图片大小等,从而加快页面加载速度。

import Image from 'next/image';

const Page = () => (
  <div>
    <Image src="/path/to/image.jpg" alt="图片描述" width={500} height={300} />
  </div>
);

export default Page;

3、默认启动HTTP/2

Next.js默认启用HTTP/2协议,它能够更高效地处理多个请求,减少页面加载时间,进一步提升SEO表现。

4、支持动态路由和默认路由

Next.js支持动态路由和嵌套路由,这使得开发者能够轻松构建复杂的URL结构,同时保持SEO友好性。

5、自动代码拆分

Next.js自动进行代码拆分,确保每个页面只加载所需的JavaScript。这意味着在访问不同页面时,用户无需加载整个应用的所有代码,从而提高了页面加载速度。

6、服务端渲染SSR

通过SSR,Next.js能够在服务器端生成HTML页面,并将其发送到客户端。这样,搜索引擎爬虫(如Googlebot)在抓取页面时,会看到完整的HTML,而不需要依赖JavaScript执行。

import React from 'react';

export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: { data }, // 将数据传递给页面组件
  };
}

const Page = ({ data }) => (
  <div>
    <h1>数据展示</h1>
    <ul>
      {data.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  </div>
);

export default Page;

通过getServerSideProps方法,Next.js可以在服务器端预渲染页面并返回完整的HTML,这意味着搜索引擎爬虫可以直接获取到页面的完整内容,而不需要执行JavaScript。

7、静态生成SSG

通过SSG,Next.js能够在构建时预先生成HTML文件,而不是在每次请求时动态生成。这样,生成的页面是完全静态的,能够被搜索引擎迅速抓取。

export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: { data }, // 将数据传递给页面组件
  };
}

const Page = ({ data }) => (
  <div>
    <h1>数据展示</h1>
    <ul>
      {data.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  </div>
);

export default Page;

通过getStaticProps方法,Next.js在构建时生成静态页面,从而确保搜索引擎能够抓取到完全的页面内容,并提高SEO表现。

8、增量静态再生 ISR

增量静态再生(ISR)是Next.js的一个独特功能,它结合了静态生成和动态更新的优势。通过ISR,Next.js可以生成静态页面,并根据预设的时间间隔自动更新内容,而无需重新构建整个网站。

export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();

  return {
    props: { data },
    revalidate: 60, // 每60秒更新一次页面
  };
}

通过ISR,Next.js确保了页面内容始终是最新的,同时又能保持静态页面的SEO优势。搜索引擎能够抓取到最新的内容,而不会受到页面更新频繁的影响。