Next.js 9.3引入如下三个API:node
Next.js根据pages目录中的文件名进行路由设定git
getInitialProps是在渲染页面以前就会运行的API。 若是该路径下包含该请求,则执行该请求,并将所需的数据做为props传递给页面。 (实际上有时会有发送日志等不影响HTML的反作用。 ) 与这次介绍的3个API同样,只能在pages文件夹内的文件中使用。 getInitialProps是SSR专用的API,这是误解。 直接访问后,getInitialProps将在服务器端运行。 另外一方面,使用next/link进行客户端路由时,在客户端执行。 所以,建议使用isomorphic-unfetch等fetch库。github
//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是用于在构建时预先执行getInitialProps进行的处理并预先生成静态文件的API。 不会在客户端上运行。 始终在服务器端运行。json
//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 复制代码
在pages文件夹中的文件名中添加一个括号[]以启用动态路由。(pages/posts/[pid].js)api
//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> 复制代码
用于在使用动态路由时生成静态文件。数组
//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。 它决定访问预构建路径之外的路径时的行为。bash
服务端 | 客户端 | 执行时间 | |
---|---|---|---|
getStaticProps | true | false | 在构建时(根据要求,若是+ fallback = true) |
getStaticPaths | true | false | 仅在建造时 |
getServerSideProps | true | false | 根据要求 |
getInitialProps | true | true | 根据要求 |