根据用户登录有条件地使用next.js app或创建同网站域的react app

Conditionally use next.js app or create react app with the same website domain according to users login

我有一个使用 CRA 构建的网站,node.js 我想对大部分页面使用 ISR。 问题是大约20%的用户是注册用户,他们得到自己的内容,而且不同header,这意味着我只能使用SSR,而不能使用ISR。

我的想法是使用类似的东西:

  1. 在我的 node.js 服务器中,我会检查用户是否已登录
  2. 如果他没有登录,我会向 next.js 服务器发送一个获取请求,获取静态 html 文件并提供它。
  3. 如果用户已登录,我会向他发送我的 CRA 应用程序。

我想到的另一个选择是对请求使用 proxy server 过滤器,检查是否设置了 session ID 或 cookie ID

可能吗?哪个选项更好?

我可以使用 CDN 来提供这些静态文件吗?

有没有更好的办法解决这个问题?

只保留 Nextjs 应用程序中的所有内容。

如果您需要静态生成的页面,请在该页面中使用 getStaticPropsgetStaticPaths 或什么都不用(以获得与 CRA 应用程序相同的结果)。

如果您需要一些与服务器相关的逻辑,请在该页面中使用 getServerSideProps


更新 运行next build

之后

页面test是一个简单的组件

const Test = () => <div>test</div>;

export default Test;

在其他页面(/gpp,/gpp/[id])中定义了getServerSideProps

.....
const GppPage: NextPage = () => (
  <>
    <Head>
      <title>GPP</title>
    </Head>
    <Box>
      
       ....
    </Box>
  </>
);


export async function getServerSideProps(context) {
  return {
    props: {
      session: "mysession"
    }
  };
}

export default GppPage;

图中的测试页显然是一个静态页面(看符号)

如果您在 _app.tsx 中定义一些 getInitialPropsgetServerSideProps,那么您将继承 SSR 行为

我没有使用 next.js,而是为我的网站创建了自己的 ISR。这样我就可以对注册用户使用 SSR,对未注册用户使用 ISR。虽然 create react app 团队不推荐在 CRA 应用程序中使用 SSR,但我发现在 this article for SSR, this article 的帮助下对于带有 react router 的 SSR 非常简单。我使用了 react 18 和 react router 5.

虽然这个解决方案对我有用,但不能保证它以后会用,所以我不会推荐它,直到 create react app 团队推荐它。

解决方案的优点:

  1. 代码更自由。例如,我可以为移动设备和桌面提供不同的页面(并且仍然提供静态页面)。
  2. 与 next.js
  3. 相比成本降低

解决方案的缺点

  1. 不稳定,因为 create react 团队不推荐它
  2. 缺少某些 next.js 功能,例如图像优化
  3. html 页面不是从 CDN 提供的(我使用 EBS