数据获取是服务端渲染应用中非常重要的一个环节。通过本章节的内容,了解服务端渲染应用的一些深层次的知识
我们定义了 getInitialProps
静态方法,用于获取数据
那么为什么要使用一个静态方法来进行数据的获取,而不是像传统 SPA 应用一样直接写在组件的生命周期当中呢。
在服务端会执行的生命周期只有 created/componentWillMount,而像 mounted/componentDidMount 这样的生命周期是不会被执行的。那么我们将获取数据的逻辑写在 created 当中是否可行呢。答案也是否定的
由于我们获取数据的逻辑一般都是异步的。在服务端渲染的过程中,并不会像客户端应用那样,当 props/state 改变时组件重新 render,所以我们需要定义一个静态方法来获取数据
getInitialProps
规范因为 getInitialProps 可能会在服务端运行、也能会在客户端运行,所以我们需要编写的时候注意环境
何时在服务端运行
SSR 在进行首屏渲染的时候,组件会在服务端渲染,并且会直接在服务端获取数据,渲染到 html 中,所以这时候就会在服务端运行
何时在客户端运行
当首屏渲染完成后,我们切换路由,这时候切换路由完全是客户端行为,所以会在客户端运行
getInitialProps
参数由于我们可能需要获取服务端或者客户端的请求数据,所以在执行改方法的时候我们传入了一些参数
export interface Params {
request?: Request; // 服务端请求实例
routerProps?: RouteComponentProps; // 客户端路由实例
}
export declare type ReactInitialPropsFunction = (params: Params) => Promise<any>;
该接口可以通过 @tiger/utils
导入
如果我们需要在获取数据的方法中判断环境,我们可以:
__isBrowser__
全局变量request
(服务端) / 是否存在 routerProps
(客户端)