首页 > 解决方案 > 如何设置在运行时生成的新页面的预呈现 HTML 与 Next.js 中的增量静态生成 (ISR) 一起存储到 AWS S3 的位置?

问题描述

假设我有一个像 Medium-clone 这样的多用户博客网站,当用户从网站本身的 Web UI 创建一个新的博客页面时,我希望它的 HTML 被静态预呈现并在未来从该缓存中提供动态路由/posts/[user]/[pid],无需我重新启动服务器或运行任何自定义手动命令来重建静态渲染缓存。

增量静态生成也会出现同样的问题,我可能只想在构建时预呈现最活跃查看的页面的子集。

在本地运行时,生成的预渲染文件将存储在本地文件系统下(尽管我在https://github.com/vercel/next.js/tree/c7596be786ebe1fa5860c0f5efd7781faae0f931/examples.next/server/pages下找不到明确的示例,其中页面在运行时生成)。

但是,当部署到 Heroku 和其他 PaaS 系统时,我肯定需要一种方法来指定那些新生成的 HTML 页面将存储在哪里,某种推送/获取适配器,因为Heroku 的文件系统是 ephemeral,而那些文件.next/是不是在构建时生成的,next build可以随时随机消失。也许 Next 只会重新生成它们而用户不会注意到,但我不想打赌,至少会有一些性能影响。所以我可能会使用 Amazon AWS S3 之类的东西来存储这些静态资产。

这可能或记录在某处吗?

我可以找到一些可能相关的线程:

标签: herokunext.js

解决方案


我最终了解了有关 Next.js的更多信息。这清除了我脑海中的一些事情。

首先,ISR 确实会为每个页面命中触发重建(n 秒宽限期除外)。但我想要的是一种机制:

  • 当页面被用户更新时,使 CDN/S3 失效。更一般地说,我需要对“哪些用户操作可能会改变页面呈现方式”进行编码依赖图,并且其中任何一个都必须更改页面。功能请求:https ://github.com/vercel/next.js/discussions/11698

  • 如果 CDN/S3 不包含页面,我希望它以某种方式联系我的服务器,以便它可以第一次生成页面,然后将其返回给用户,并更新 CDN

    我不确定 CDN 是否具有该功能,尽管在https://formidable.com/blog/2019/modern-cdns-lambda/的“更现代的 CDN”中提到的功能可能允许它

我还使用标准 ISR https://github.com/cirosantilli/node-express-sequelize-nextjs-realworld-example-app/tree/63150b632f5e6feda8ba3b8029e22de25543f162对 Heroku 进行了测试,它似乎运行正常,所以可能是最糟糕的事情当文件系统被破坏时会发生这种情况,我会丢失一些缓存。它没有我想要实现的设置那么令人惊奇,但由于 CDN 功能,我不确定这是否可能,所以我将从标准 ISR 开始,看看它是如何进行的。


推荐阅读