В Next.js 9.3 представлены следующие три API:
- getStaticProps
- getStaticPaths
- getServerSideProps
предварительное знание
SSG
Next.js выполняет настройки маршрутизации на основе имени файла в каталоге страниц.
getInitialProps
getInitialProps— это API, который запускается до отображения страницы. Если путь содержит запрос, выполните запрос с требуемыми данными какpropsперешел на страницу. (На самом деле иногда возникают побочные эффекты отсутствия воздействия на HTML, такие как отправка журналов.) Подобно трем API, представленным на этот раз, его можно использовать только вpagesИспользуется в файлах внутри папки. getInitialProps — это API, специфичный для SSR, что является недоразумением. После прямого доступа getInitialProps запустится на стороне сервера. С другой стороны, при использовании next/link для маршрутизации на стороне клиента она выполняется на стороне клиента. Поэтому рекомендуется использовать библиотеку выборки, такую как isomorphic-unfetch.
//pages/stars.js
// 用于客户端和服务器端
import fetch from 'isomorphic-unfetch'
// getInitialProps中获取返回的数据stars
function Stars({ stars }) {
return <div>Next stars: {stars}</div>
}
// 先执行获取数据
Stars.getInitialProps = async () => {
const res = await fetch('https://api.github.com/repos/zeit/next.js')
const json = await res.json()
return { stars: json.stargazers_count }
}
export default Stars
getStaticProps
getStaticPropsдля предварительного выполнения во время сборкиgetInitialPropsAPI для обработки и предварительной генерации статических файлов. не запускается на клиенте. Всегда запускайте на стороне сервера.
//pages/buildTimeStars.js
// 不在客户端运行
import fetch from 'node-fetch'
// getStaticProps中返回的stars, build_time数据
function BuildTimeStars({ stars, build_time }) {
return <div>ビルド時({build_time})のNextのstar数は: {stars}</div>
}
// 在构建时运行
export async function getStaticProps() {
const res = await fetch('https://api.github.com/repos/zeit/next.js')
const json = await res.json()
const stars = json.stargazers_count
const build_time = new Date().toString();
return {
props: {
stars,
build_time
},
}
}
export default BuildTimeStars
Dynamic Routes
существуетpagesДобавьте квадратную скобку [] к имени файла в папке, чтобы включить динамическую маршрутизацию. (pages/posts/[pid].js)
//pages/posts/[pid].js
import { useRouter } from 'next/router'
const Post = () => {
const router = useRouter()
const { pid } = router.query
return <p>Post: {pid}</p>
}
export default Post
//posts/abc
<div id="__next">
<p>Post: abc</p>
</div>
//posts/hoge
<div id="__next">
<p>Post: hoge</p>
</div>
getStaticPaths
Используется для создания статических файлов при использовании динамической маршрутизации.
//zeit/[name].js
import fetch from 'node-fetch'
function Zeit({ name, stars }) {
return <div>{name} stars: {stars}</div>
}
// 首先执行。 返回路径以使用数组进行预构建。
export async function getStaticPaths() {
// zeit获取30个由API管理的存储库
const res = await fetch('https://api.github.com/orgs/zeit/repos')
const repos = await res.json()
// 存储库名称的路径
const paths = repos.map(repo => `/zeit/${repo.name}`)
return { paths, fallback: false }
}
// 接收带有路由信息的参数
export async function getStaticProps({ params }) {
// 对应于文件名zeit/[name].js
const name = params.name
const res = await fetch(`https://api.github.com/repos/zeit/${name}`)
const json = await res.json()
const stars = json.stargazers_count
return { props: { name, stars } }
}
export default Zeit
// /zeit/ms
<div id="__next">
<div>ms stars: 2699</div>
</div>
// /zeit/micro
<div id="__next">
<div>micro stars: 9128</div>
</div>
Обязательные параметры для getStaticProps:pathsа такжеfallback. Он определяет поведение при доступе к путям, отличным от предварительно созданных путей.
- false
Другие маршруты 404 - true
Если для резервного варианта установлено значение true, даже пути, которые не были предварительно созданы, не будут 404
В заключение
Сервер | клиент | время исполнения | |
---|---|---|---|
getStaticProps | true | false | во время сборки (по запросу, если +fallback=true) |
getStaticPaths | true | false | только когда построен |
getServerSideProps | true | false | по требованию |
getInitialProps | true | true | по требованию |