nextjs

静态生成

Next.js 的静态生成 (Static Generation, SG) 是一种构建方式,它在构建时预渲染页面 HTML,并将这些 HTML 文件直接提供给客户端。这意味着页面内容在用户请求之前就已经准备好了,从而提供更快的加载速度和更好的 SEO 性能。

工作原理:

在构建过程中,Next.js 会为每个静态生成的页面生成一个对应的 HTML 文件。当用户请求页面时,服务器直接返回预先构建好的 HTML 文件,无需在服务器端进行任何渲染。这与传统的服务器端渲染 (SSR) 不同,SSR 是在每次请求时动态生成 HTML。

使用场景:

静态生成适用于内容不经常变化的页面,例如:

  • 博客文章
  • 产品页面
  • 文档
  • 营销 landing page

优势:

  • 更快的加载速度: 因为 HTML 已经在构建时生成,所以服务器可以立即响应请求,无需等待渲染。
  • 更好的 SEO: 搜索引擎爬虫可以更容易地抓取预渲染的 HTML 内容,从而提高网站的 SEO 排名。
  • 降低服务器负载: 由于页面是在构建时生成的,服务器无需处理每个请求的渲染,从而降低了服务器负载。
  • 更好的缓存: 静态生成的 HTML 文件可以被 CDN 缓存,进一步提高加载速度。

如何使用:

在 Next.js 中,可以使用 getStaticProps 函数来实现静态生成。这个函数在构建时运行,并返回一个包含页面所需数据的对象。这些数据将被传递给页面的组件,用于渲染 HTML。

import Head from "next/head";
import Layout from "../../app/layout";

// pages/post-static/[id].js
// 使用静态生成html例子打包后会生成多个html文件,每个文件对应一个id
function Post({ post, id }: any) {
return (
<Layout>
<div>
<Head>
<title>{`${id}标题`}</title>
<meta name="description" content={`Post${id}页面描述`} />
<meta name="keywords" content={`文章${id}的关键词`} />
<meta
name="viewport"
content="initial-scale=1.0, width=device-width"
/>
{/* 其他SEO相关的标签 */}
</Head>
<h1>{JSON.stringify(post.data)}</h1>
</div>
</Layout>
);
}

// 获取静态页面数据(如果只有一个页面则不需要此函数)
export async function getStaticProps({ params }: any) {
const res = await fetch(
`http://xxx/api/utils-updates/1?populate=*&id=${params.id}`
);
const post = await res.json();

return {
props: {
post,
id: params.id,
},
};
}

// 这里是根据id动态生成html文件,可以根据接口返回的数据生成多个html文件
export async function getStaticPaths() {
return {
paths: [
{ params: { id: "1" } },
{ params: { id: "2" } },
{ params: { id: "3" } },
],
fallback: false, // 或者 'blocking' 或 true
};
}

export default Post;