如何在 Next.js 中使用服务器端渲染将我的应用分成可重用的组件

How to divide my app into reusable components using server side rendering in Next.js

我对编写一个 Next.js 应用程序感到困惑,当我有可重用的组件和 <Link> 导航到应用程序的其他区域时,它将在服务器端呈现页面。

文档说

我的问题

我不清楚以下内容:

  1. 如何将您的应用程序分解为可重用的组件以保持服务器端呈现?
  2. 如果有<Link>到应用程序的其他页面,如何在服务器上呈现其他页面?
  3. 如果 <Link>s 是客户端,这肯定意味着只有初始页面将在服务器端呈现,那么用 Nextjs 而不是普通的 React 编写应用程序有什么意义?
  4. 如果只为页面调用 getInitialProps,这肯定意味着页面的 getInitialProps 必须对其页面上呈现的任何数据执行所有服务器调用,然后发送到子组件,并且这一定很慢。如果一个页面包含一个项目列表,将有一个服务器调用来获取项目列表,并且对于列表中的每个项目,都需要一个调用来获取项目详细信息,另一个调用来获取项目图片。在呈现页面之前,这是 很多 次服务器调用。

我的申请

我认为用一个我希望能够做的事情的示例应用程序来说明我的问题会更容易。

这是我的应用程序的图形表示。

项目结构

所有页面使用layout-template添加页眉和页脚的主要结构,然后使用组件在页面中间添加自己的内容

|- pages
     |- index.js  (i.e. tab-1)
     |- tab2.js
     |- tab3.js
     |- tab4.js
     |- aitem
          |- [id].js
     |- numitem
          |- [id].js
|- Components
     |- layout-template.js --- needs data to pass to header/footer
     |- header.js
     |- footer.js
     |- AlphabetList --- needs data
     |- AlphabetListItem --- needs data

下面是我的组件示例,展示了它们如何构成我的应用程序。在某些组件中看到他们必须从服务器获取数据。

因为它们是组件,所以它们在 componentWillMount 中获取数据,这意味着该组件将 不会 呈现服务器端。因此这似乎完全违背了写作 Next.js.

的目的

Component = layout_template.js 需要从服务器获取数据传递给页眉和页脚

Component = header.js 只包含 JSX

Page = Index.js (URL= "/" or "/index")不从服务器获取任何数据,只是指定JSX

Component = AlphabetList.js 从服务器获取字母表项目列表并使用另一个组件呈现它

Component = AlphabetListItem.js 从服务器获取项目的图像然后渲染它。单击此组件后,应用会转到项目的详细信息页面

Page = AlphabetItemDetails.js ( URL = "aitem/[id]") 从服务器获取有关项目的附加信息并呈现项目的填充详细信息

如何构建我的代码?

首先,标签不必是新页面。选项卡可以是组件。

在主页面(index.js),您可以将使用 getInitialProps 获取的数据传输到具有 prop 的组件。

你也可以通过Layout通过prop向header、footer等组件发送数据。对于页眉中的徽标,您可以创建 _app.js 到 pages 文件夹并使用 getInitialProps 从此处提取数据,而不是在每个页面上再次提取数据。

更多详细信息,您可以访问此页面https://nextjs.org/docs/getting-started