- 从零开始学习Next.js
- 什么是 Next.js?
- 安装和环境配置
- 创建第一个页面
- 页面和路由
- API 路由
- 样式处理
- 数据获取与处理
- 动态导入和代码拆分
- 静态站点生成与优化
- Next.js 中的环境变量和配置文件使用指南
- Next.js 的国际化(i18n)支持指南
- Next.js 中的 API Routes 深入理解
- Next.js 性能优化指南
- Next.js 中的 SEO 优化指南
- Next.js 应用部署指南
- Next.js 中的中间件与重定向
- 在 Next.js 中集成 GraphQL
- 使用 Next.js 构建复杂多页应用
- 将 Next.js 项目改造成 PWA(渐进式网络应用)
- 编写可维护、可扩展的 Next.js 代码的最佳实践
- Next.js 的开源生态
- 实战项目:使用 Next.js 构建个人博客系统
- 实战项目:构建简易电子商务平台
- 实战项目:构建社交媒体网站
页面和路由
class Next.js,SSG,SSR在 Next.js 中,页面的渲染方式有三种:静态页面生成 (SSG)、服务端渲染 (SSR) 和客户端渲染 (CSR)。这里将重点介绍如何使用静态页面生成(SSG)、动态路由及服务端渲染(SSR)来掌握 Next.js 的基础功能。
1. 静态页面生成(SSG)
Next.js 提供了 getStaticProps()
来生成静态页面。页面在构建时预渲染,生成静态 HTML 文件。这种方法非常适合内容在构建后不需要频繁更新的场景。
1.1 getStaticProps()
的使用
getStaticProps()
是一个异步函数,用于获取数据并在构建时生成静态页面。
步骤:
- 创建一个页面文件,比如
pages/posts.js
。 - 使用
getStaticProps()
获取数据。
代码示例:
export default function Posts({ posts }) {
return (
<div>
<h1>Blog Posts</h1>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
// 获取数据,并在构建时生成页面
export async function getStaticProps() {
const res = await fetch('https://jsonplaceholder.typicode.com/posts');
const posts = await res.json();
return {
props: {
posts,
},
};
}
1.2 说明:
getStaticProps()
函数会在构建时运行,获取外部数据并将其传递给页面组件。- 返回值:返回的对象必须包含
props
,其中包含了传递给组件的数据。
1.3 访问页面:
在浏览器中访问 http://localhost:3000/posts
,你将看到构建时从 API 获取到的博客文章列表。
2. 动态路由
Next.js 通过在 pages
文件夹中使用 方括号语法 创建动态路由,常用于处理动态内容,比如博客详情页。
2.1 动态路由文件命名:[id].js
假设你要为博客文章创建一个详情页,URL 形式为 /posts/[id]
,其中 [id]
是动态部分。
步骤:
- 创建一个新的页面
pages/posts/[id].js
。 - 使用
useRouter()
来获取动态路由参数。
代码示例:
import { useRouter } from 'next/router';
export default function Post({ post }) {
return (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
);
}
// 获取每篇文章的数据
export async function getStaticProps({ params }) {
const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${params.id}`);
const post = await res.json();
return {
props: {
post,
},
};
}
// 定义动态路径
export async function getStaticPaths() {
const res = await fetch('https://jsonplaceholder.typicode.com/posts');
const posts = await res.json();
const paths = posts.map((post) => ({
params: { id: post.id.toString() },
}));
return {
paths,
fallback: false,
};
}
2.2 getStaticPaths()
的使用
getStaticPaths()
需要与动态路由配合使用,用于告诉 Next.js 需要预渲染哪些路径。
getStaticPaths()
返回一个paths
数组,数组中的每个对象代表一个需要生成的页面路径。fallback: false
表示对于未定义的路径,Next.js 将显示 404 页面。
3. 服务端渲染(SSR)
Next.js 提供了 getServerSideProps()
方法,用于在每次请求时执行数据获取,适合需要动态获取数据的场景。
3.1 getServerSideProps()
的使用
getServerSideProps()
在每个请求时运行,因此页面不会生成静态 HTML,而是由服务器动态生成。
步骤:
- 创建一个页面
pages/server-rendered.js
。 - 使用
getServerSideProps()
动态获取数据。
代码示例:
export default function ServerRenderedPage({ post }) {
return (
<div>
<h1>{post.title}</h1>
<p>{post.body}</p>
</div>
);
}
// 每次请求时获取数据
export async function getServerSideProps(context) {
const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const post = await res.json();
return {
props: {
post,
},
};
}
3.2 说明:
getServerSideProps()
在请求时运行,因此页面的数据是实时的,适合频繁变化的数据源。- 返回值:与
getStaticProps()
类似,必须返回一个props
对象。
3.3 访问页面:
在浏览器中访问 http://localhost:3000/server-rendered
,页面将从服务器动态获取数据并渲染。
总结
- 静态页面生成(SSG):使用
getStaticProps()
在构建时生成静态页面,适合静态内容。 - 动态路由:通过文件命名
[id].js
实现动态路由,并使用getStaticPaths()
动态生成多个页面。 - 服务端渲染(SSR):使用
getServerSideProps()
在请求时动态生成页面,适合需要实时数据的页面。
通过掌握这些基本功能,开发者可以根据项目需求选择适合的渲染方式,从而构建高效的 Next.js 应用。
评论区
评论列表
{{ item.user.nickname || item.user.username }}