Next.js 初学者完整指南
我一直用Create React App搭建 React 应用,我非常喜欢它。不过最近,我越来越多地使用 Next.js 来搭建应用。它有很多很棒的功能,比如路由和服务端渲染,可以为最终用户和开发者带来卓越的体验。
Next.js 是一个 React 元框架,这意味着它是一个建立在 React 之上的框架,它强化了更多结构并提供了更多功能:例如服务器端渲染、路由、打包等等。在本文中,我们将介绍如何开始使用 Next.js、SSR 与 SSG 以及路由。
如果你以前没用过 React,可以先阅读我的 React 入门教程,然后再回来学习本教程!首先你需要具备 React 基础。
创建 Next.js 应用
我们将创建一个在主页上列出颜色的应用程序。每个颜色都会链接到一个显示该颜色信息的颜色页面!

首先,我们将使用 CLI 初始化一个 Next.js 应用。它的工作原理与大多数应用初始化脚本类似,它会为你生成一堆启动文件。
$ npx create-next-app color-pages
$ cd color-pages
然后,我们将启动开发服务器——它内置热重载并链接到生成的主页上的文档。
$ npm run dev
现在,我们可以开始写代码了!我们首先要创建一个包含颜色的静态 json 文件。创建一个颜色目录,然后在里面添加一个颜色文件。最后,添加颜色!
mkdir data
touch data/colors.json
我使用了很多年度潘通色来制作这个,欢迎随意复制!如果你自己制作,请务必使用这个结构,这样其余代码才能正常工作。
// data/colors.json
[
{ "name": "Illuminating", "hex": "#F5DF4D" },
{ "name": "Classic Blue", "hex": "#0f4c81" },
{ "name": "Living Coral", "hex": "#FA7268" },
{ "name": "Ultra Violet", "hex": "#5f4b8b" },
{ "name": "Greenery", "hex": "#88b04b" },
{ "name": "Rose Quartz", "hex": "#F7CAC9" },
{ "name": "Marsala", "hex": "#B57170" },
{ "name": "Radiant Orchid", "hex": "#b067a1" }
]
路由
现在,我们来处理color
页面。使用 Next.js,如果您在文件夹中创建一个文件pages
,它会将其转换为路由。因此,您可以创建about.js
一个/about
页面,但例外情况是,index.js
它会将页面路由到/
。您也可以创建文件夹来创建路由,例如/blog/my-post-title
。如果您将文件名放在 中[]
,则括号内的名称将成为参数名称。我们希望为上面数组中的每种颜色创建路由,因此我们将创建一个名为 的文件[color].js
,这将使我们能够一次性动态创建“经典蓝”、“紫外光”等颜色的页面,而无需为每个颜色创建单独的 .js 文件。
$ touch pages/[color].js
获取静态路径
现在,让我们创建getStaticPaths()
函数。Next.js 会查找此函数,以便为该模板生成所有静态页面——在本例中是颜色页面。我们希望为每种颜色创建一个遵循相同格式的页面,但无需对每个页面进行硬编码。
首先,导入我们的colors
数组。然后,在函数内部,我们将循环遍历它们,并为每个路由参数命名。在本例中,我们的路由参数要与文件名color
中的参数名称匹配[]
。我们希望路由中的颜色与每个颜色名称匹配——因此/Marsala
将渲染显示 Marsala 的页面!
最后,我们将以 Next.js 所需的格式返回所有颜色。我们会将它们放入一个fallback
设置为 的对象中false
——这样,如果您访问/hotpink
数组中不存在的颜色,就会返回 404 页面!
// [color].js
// import the colors array
import colors from '../data/colors.json'
export async function getStaticPaths() {
// loop through the colors array
const paths = colors.map(color => ({
// return an object with params.color set to the color's name
params: { color: color.name }
}))
// Paths will look like this:
// [
// { params: { color: 'Marsala' } },
// { params: { color: 'Illuminating'} }
// ...
// ]
return { paths, fallback: false }
}
在大多数大型用例中,您可能需要从文件系统读取文件(例如博客文章的 Markdown 文件)或从外部 API 获取数据。您可以在其中执行任一任务getStaticPaths
来生成应用的路径。
获取静态属性
现在,我们将定义getStaticProps
Next.js 所需的函数。此函数将提供props
给页面的 React 组件。在我们的用例中,我们只需要当前页面颜色的信息。因此,页面会/Marsala
获取数据{ "name": "Marsala", "hex": "#B57170" }
——而不是所有其他颜色!
该getStaticProps
函数获取传递给它的参数,在本例中是颜色名称。页面/Marsala
参数看起来{ color: 'Marsala' }
就像我们在getStaticPaths
函数中创建的一样。在本例中,我们将在数组中查找名称与参数中的颜色匹配的颜色。然后返回数据——Next.js 要求将返回值嵌套在 { props } 中。
// [color].js
export async function getStaticProps({ params }) {
// find the info for just one color
const color = colors.find(color => color.name === params.color)
// return it in the necessary format.
return { props: { color } }
}
在较大的应用程序中,您可以从 API 中提取getStaticProps
有关某个项目的信息,或者您可能只需要获取一个 markdown 文件来呈现博客文章。
模板页面
现在我们开始最有趣的部分!创建 React 组件来模板化页面!我们创建的 props 对象getStaticProps
将由 Next.js 传递给组件——我们只需要在页面上渲染数据!我们将使用十六进制代码为页面添加背景颜色,并渲染颜色名称。
// [color.js]
export default function Color({ color }) {
return <div className='color-page' style={{ backgroundColor: color.hex }}>
<h1>{color.name}</h1>
</div>
}
我用以下内容替换了 CSS 文件,使页面看起来更好一些。
/* global.css */
html,
body, #__next, .color-page {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
top: 0px;
position: absolute;
display: block;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen,
Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
}
.color-page {
display: flex;
justify-content: center;
align-items: center;
}
链接组件
现在,我们需要做的就是使用Link
组件从主页链接到每个颜色对应的页面。我们将index.js
使用颜色列表进行更新。
我们将在此Home
组件中使用两个 Next.js 特有的组件——Link
和Head
。<Link>
允许你进行客户端路由转换,这将使用户的页面转换更加流畅。我们将用它来代替 和 ,否则就像一个a
标签一样。
该<Head>
组件允许我们在组件内部将数据插入到 htmlhead
标签中。我们将从那里更新页面标题和元标签!
// index.js
import Head from 'next/head'
import Link from 'next/link'
import colors from '../data/colors.json'
export default function Home() {
return (
<div>
<Head>
<title>Colors!</title>
<meta name="description" content="App that displays pretty colors to learn Next!" />
</Head>
{colors.map(color => (
<Link href={`/${color.name}`}>
<h2>{color.name}</h2>
</Link>
))}
</div>
)
}
SSR 与 SSG
我们刚刚构建了一个静态生成的 Next.js 应用——这意味着数据仅在构建时获取。如果我们的颜色来自 API,并且我们已经构建并部署了网站,那么我们的应用将不会因为任何 API 变更而更新(比如添加了 2022 年的年度颜色)。对于许多应用来说,这完全没问题!博客不需要频繁更新内容。
SSG(静态站点生成)允许 Next.js 在站点构建时为每个页面生成 HTML。这些页面随后可以被 CDN 缓存,从而打造出性能卓越的站点。
话虽如此,有时您需要一个动态更新的网站,这就是服务器端渲染的用武之地。SSR(服务器端渲染)允许您仍然在服务器端渲染 HTML,但针对用户对页面的每个请求执行此操作,而不是在构建时执行。
为了使用 SSR 而不是 SSG,我们需要将getStaticProps
和替换getStaticPaths
为getServerSideProps
。请注意,下面的示例将不起作用,因为我们实际上并没有创建 API!
export async function getServerSideProps({ params }) {
// Make a request to get data about the color via our API
const res = await fetch(`http://www.color-api.com/${params.color}`)
const color = await fetch.json()
// return the data as props that will be passed to the Color component
return { props: { color } }
}
如果您想了解有关SSR 与 SSG 的更多信息,我有一篇关于其差异的完整博客文章!
部署
请注意,我是 AWS Amplify 团队的开发倡导者,如果您对此有任何反馈或疑问,请联系我或在我们的 discord 上提问 - discord.gg/amplify!
现在您已经编写好了 Next.js 应用,接下来需要将其上线。AWS Amplify支持部署 SSR 和 SSG Next.js 应用,无需您进行任何额外配置。
如果您要创建静态生成的 Next.js 应用,请转到您的package.json
文件并将build
脚本更改为next build && next export
。如果您要创建服务器端渲染的应用,则无需更改任何内容!Next.js 为您生成的脚本正是您所需要的。
"scripts": {
"dev": "next dev",
+ "build": "next build && next export",
"start": "next start"
},
然后,在您选择的 git 提供商上创建一个存储库,并将您的代码推送到其中。
-
如果您还没有AWS 账户,请创建一个。
-
导航至Amplify 控制台
-
单击橙色
connect app
按钮。 -
GitHub
在菜单中选择From your existing code
,然后单击继续
- 输入您刚刚创建的 GitHub 仓库的名称(它应该会自动填充!)然后单击
next
- 构建设置将自动填充,因此您只需
next
单击Configure build settings
- 点击
Save and deploy
。
结论
Next.js 拥有出色的开发者体验。它拥有清晰的错误信息、全面易懂的文档,并且功能强大,只需比普通的 React 应用多做一点点工作即可。希望本教程对您有所帮助!
如果您有兴趣学习另一项技能,这里有一个教程,介绍如何使用 Amplify 将 Next.js 前端变成全栈应用程序!
文章来源:https://dev.to/aws/a-complete-beginner-s-guide-to-next-js-1md0