gpt4 book ai didi

javascript - Next.js - 理解 getInitialProps

转载 作者:行者123 更新时间:2023-12-03 13:27:06 24 4
gpt4 key购买 nike

我有一个使用 next.js 和 Apollo/Graphql 的应用程序,我试图完全理解 getInitialProps 生命周期 Hook 的工作原理。

在我的理解中,生命周期getInitialProps用于设置一些初始 Prop ,这些 Prop 将在应用程序首次加载时呈现服务器端,可用于从数据库预取数据以帮助搜索引擎优化或简单以缩短页面加载时间。

我的问题是这样的:

Every time I have a query component that fetches some data in my components across my app, do I have to use getInitialProps to be sure that data will be rendered server side?

我的理解是,getInitialProps仅适用于页面索引组件(以及_app.js),这意味着任何位于以下位置的组件组件树无法访问此生命周期,并且需要从页面级别向上获取一些初始 Prop ,然后将它们传递到组件树。 (如果有人能证实这个假设那就太好了)

这是我的代码:

_app.js(在 /pages 文件夹中)

import App, { Container } from 'next/app';
import { ApolloProvider } from 'react-apollo';

class AppComponent extends App {
static async getInitialProps({ Component, ctx }) {
let pageProps = {};
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx)
}
// this exposes the query to the user
pageProps.query = ctx.query;
return { pageProps };
}
render() {
const { Component, apollo, pageProps } = this.props;

return (
<Container>
<ApolloProvider client={apollo}>
<Component client={client} {...pageProps} />
</ApolloProvider>
</Container>
);
}
}

export default AppComponent;

Index.js(在 /pages/users 文件夹中)

import React, { PureComponent } from 'react';
import { Query } from 'react-apollo';
import gql from 'graphql-tag';

const USERS_QUERY = gql`
query USERS_QUERY {
users {
id
firstName
}
}
`;

class Index extends PureComponent {
render() {
return (
<Query query={USERS_QUERY}>
{({data}) => {
return data.map(user => <div>{user.firstName}</div>);
}}
</Query>
);
}
}

export default Index;

最佳答案

答案是否定的

如果您将 Apollo 与 Next JS 一起使用,则不必使用 getInitialProps在每个页面上获取服务器端渲染的一些初始数据。以下配置为getInitialProps如果所有组件具有 <Query> ,则足以让所有组件通过各自的查询进行渲染。其中的组件

static async getInitialProps({ Component, ctx }) {
let pageProps = {};
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx)
}
// this exposes the query to the user
pageProps.query = ctx.query;
return { pageProps };
}

我的问题以及为什么我没有看到任何服务器端渲染是 Heroku 或 Now 不会使用公共(public) URL(即 my-app.heroku.com)执行 SSR。为了解决这个问题,我在 Heroku 中购买并应用了一个自定义 URL,它起作用了。除了自定义 URL 之外,我在 Apollo 配置中还进行了以下配置

  const request = (operation) => {
operation.setContext({
fetchOptions: {
credentials: 'include'
},
headers: { cookie: headers.cookie }
});
};

这完全解决了这个问题,现在我有了 SSR,无需手动设置 getInitialProps在每个页面上

希望这对某人有帮助

关于javascript - Next.js - 理解 getInitialProps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com