Next.js 是一个流行的 React 框架,它提供了许多强大的功能来简化服务器渲染(SSR)和静态生成(SSG)的过程。其中,getServerSideProps 和
getStaticProps 是两个重要的函数,用于在页面渲染之前获取数据。本文将详细解答这两个函数的用法及区别,并结合代码示例进行说明。
Next.js v9.3版本引入了 getServerSideProps 取代 getInitialProps 的使用;
getInitialProps 会根据情况在服务端或者客户端执行,如果在 getInitialProps 中进行一些 node.js 或数据库这种纯服务端的操作,当 getInitialProps 在客户端执行时就会报错,除非自己去做兼容处理,执行环境不一致,导致维护成本增高,故而该 API Next 9.3 后续版本已弃用。
getServerSideProps 是一个异步函数,用于在每个请求时获取数据。它位于页面组件中,并且只能在服务器端执行。下面是一个简单的示例:
export async function getServerSideProps(context) {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data
}
};
}
在上述示例中,我们使用 fetch 函数从远程 API 获取数据,并将其作为 props 返回。这样,页面组件就可以通过 props.data 来访问这些数据了。
1. 当 getServerSideProps 所在页面为 SSR 服务端渲染时,getServerSideProps 中的数据将会被放到全局的 _NEXT_DATA 中,用于将服务器端渲染的内容与客户端渲染的内容进行同步,以确保页面在客户端加载后能够保持一致的状态和数据。这样可以提高页面的性能和用户体验。
2. 非 SSR 情况下,进入该页面 next.js 将会自动发请求到: host/_next/data/hash/{url}.json?{query},其中 host 为当前网站域名, hash 为生产环境下哈希地址,url 为路由地址,query 为路由传参,该接口返回值为:
{
"pageProps": "返回的 props 数据内容",
"__N_SSP": true
}
客户端拿到 getServerSideProps 返回值在页面挂载时注入进去。
针对情况2举例说明:
当前有这样一个页面 https://www.example.com/word?w=word
",页面路由为 /word
,路径中需要接收参数 w
,/word
页面中 getServerSideProps
根据参数 w
,调取接口获取对应参数数据展示在页面上,当 url
中 w
变化时,浏览器就会发送 https://www.example.com/_next/data/0Lft-1zUH3u6biD0uE-6b/word.json?w=test
这样的 XHR
请求,获取页面需要重新渲染的数据。
/word
页面中 getServerSideProps
代码如下:
export const getServerSideProps: GetServerSideProps = async (context) => {
const { query, req, res } = context;
// query 路由传参
const data = await fetch('url', { method:"post", body: {query.w} });
// 返回数据供页面使用
return {
props: {
query,
data
},
};
};
getStaticProps 也是一个异步函数,但它在构建时运行,而不是每次请求时运行。它用于在构建时生成静态页面所需的数据。下面是一个简单的示例:
export async function getStaticProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: {
data
}
};
}
在上述示例中,我们同样使用 fetch 函数从远程 API 获取数据,并将其作为 props 返回。不同的是,这些数据在构建时就会被预先获取,并在每个静态页面中使用。
getServerSideProps 和 getStaticProps 是 Next.js 中用于获取数据的重要函数。getServerSideProps 适用于需要实时数据的场景,而 getStaticProps 适用于数据不经常变化的场景。合理选择这两个函数可以提高页面性能和用户体验。