Next.js,一个流行的React框架,改变了开发人员构建现代Web应用程序的方式。它提供了强大的功能,例如服务器端渲染 (SSR) 和静态站点生成 (SSG),可优化应用程序的性能和用户体验。在这篇博文中,我们将探讨 SSG 和 SSR 之间的主要区别、它们的优势、何时选择其中一种方法,以及如何使用 AWS Amplify 部署这两种方法。Amplify 是一个完整的解决方案,可让前端 Web 和移动开发人员在 AWS 上轻松构建、交付和托管全栈应用程序。
静态站点生成,顾名思义,在构建时生成静态 HTML 文件。每次构建应用程序时,都会创建一堆页面。然后将这些文件提供给用户,这意味着当用户访问网站时,服务器不需要做任何额外的工作。此方法非常适合内容不经常更改的网站,例如博客或文档网站。
服务器端呈现涉及在用户请求时为服务器上的每个页面生成 HTML。使用 SSR,有一个服务器可以预渲染页面 - 它就像一个模板,您可以将变量插入其中,服务器处理所有渲染。这发生在请求时,因此当用户请求页面时,他们会获得服务器端呈现的页面。此呈现全部发生在服务器端,永远不会在浏览器中运行。因此,与 SSG 不同,SSG 中的页面已在服务器中呈现,等待提供给客户端,SSR 在收到请求时在服务器上呈现页面。SSR 非常适合具有频繁变化的动态或个性化内容的网站,例如电子商务网站或社交媒体平台。
虽然 SSG 提供了出色的 SEO 优势,但 SSR 为动态内容和个性化提供了更好的支持,这可能对搜索排名至关重要。
在本文中,我们将在 Next.js 中讨论两种渲染方法:SSG 和 SSR。我们还将提供一个示例代码库,帮助您确定应用程序的最佳呈现方法。
Next.js 支持生成“n”个动态生成的路由的功能。在我们的示例代码库中,我获取了过去几天的 100 篇顶级 Hacker News 帖子,并将这些 ID 呈现到主页上。
单击时,每个页面都会显示帖子的详细信息。这些页面中的每一个也将具有“pages/[hackerNewsArticleId]”这样的路由。您可以在指定为 [slug] 的页面文件夹中看到该模板页面的可用方式。
现在,您可能会问我们如何定义要静态生成的路径列表?我们将使用两个 NextJS 函数: getStaticProps
和 getStaticPaths
。
getStaticProps
将在构建时预呈现页面,从 Hacker News API 获取帖子信息列表,并将该信息传递到我们组件的 props 以及 getStaticPath 中。
我们的第二个函数 getStaticPaths
是动态路由的关键。它将从 ID 接收 ID getStaticProps
列表,并创建一个路径对象列表,如下所示:
export async function getStaticPaths() {
return {
paths: [{ params: { id: '1' } }, { params: { id: '2' } }],
fallback: false, // can also be true or 'blocking'
}
}
接下来.JS现在将摄取此路径列表,并为每个参数生成一个新页面。我们现在还允许引入黑客新闻 ID 的主要组件呈现以路由到单个页面。如果你去我们的动态渲染的组件页面,你会看到我们再次调用getStaticProps方法来调用黑客新闻细节端点来获取帖子的标题、投票等。请注意,这是编译时博客文章的快照。
我们将介绍如何从这个 Github 存储库部署一个 SSG Next.js 应用程序到 Amplify。首先,请单击下面以在您自己的环境中部署此项目。以下是有关使用 Amplify 进行部署和托管的更多信息。
选择连接到 GitHub 并授权 aws-amplify-console。
在“部署应用”页上,继续并选择“Create new role”,保留 Amplify 后端角色的所有默认值。
创建角色后,在“Deploy App页上刷新现有角色,然后选择刚创建的角色。选择“Save and Deploy”。
部署应用需要 2-3 分钟。出现该框时单击 Continue。然后,您可以在 Amplify 应用进入预配、构建和部署阶段时进行监控。
完成部署后,您将能够访问域名下托管的网站。
选择域后,您将导航到 Amplify 应用程序,该应用程序将显示您的 SSG Next.js 应用程序。
我们将研究如何将NextJS Web应用程序从GitHub直接部署到Amplify。
惊喜!实际上,当我们部署到 Amplify 时,我们已经部署了一个 SSR 页面。Next.JS 的惊人之处在于,您可以在构建时生成一些页面,而其他页面仍然可以利用 SSR 呈现动态数据。
为了对特定页面使用服务器端渲染,我们导出一个名为getServerSideProps
的异步函数。服务器将在每次请求时调用此函数。
现在,在您的托管链接上,导航到 /ssr
路线(即 https://main.amplifyapp.com/ssr)。现在,您应该看到如下所示的页面:
Next.js 需要从非常流行的前端框架进行不同的范式转变,利用Create React App(CRA)和React Router 库。
CRA 是一个入门工具包,为您提供用于创建 React 应用程序的样板项目。CRA 使用客户端呈现 (CSR),这意味着您的应用程序在浏览器中呈现,通常最佳做法是根据用户的交互分解网络请求。与 SSG 相比,您现在必须一次加载所有数据。
通过包含这些常见陷阱部分,我们希望您能从我们的错误中吸取教训,并节省一些时间和挫败感。
SSG 和 SSR 都为不同类型的 Next.js 应用程序提供了独特的优势。通过了解项目的内容频率、SEO 要求、用户体验和开发复杂性,您可以做出明智的决定,在 Next.js 项目中是使用 SSG 还是 SSR。最终,选择取决于您的特定用例以及您愿意在性能、可扩展性和动态内容之间进行权衡。