heroku - 如何设置在运行时生成的新页面的预呈现 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 之类的东西来存储这些静态资产。
这可能或记录在某处吗?
我可以找到一些可能相关的线程:
如何将 AWS 与 Next.js 一起使用?我认为这仅涉及在构建时生成的页面,而不是运行时
https://vercel.com/docs/next.js/incremental-static-regeneration
https://www.reddit.com/r/nextjs/comments/mvvhym/a_complete_guide_to_incremental_static/
https://github.com/vercel/next.js/discussions/11552#discussioncomment-115595
https://dev.to/givehug/next-js-apollo-client-and-server-on-a-single-express-app-55l6
https://github.com/serverless-nextjs/serverless-next.js应该在某处进行,因为无服务器通常意味着临时文件系统。他们的自述文件说他们使用 Next.js 无服务器 API https://nextjs.org/blog/next-8#serverless-nextjs但我找不到关于如何在不使用该存储库的情况下执行此操作的明确文档
此外,该项目确实声称在其 README 中处理 ISR。
解决方案
我最终了解了有关 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 开始,看看它是如何进行的。
推荐阅读
- python - 使用 unittest 在多输入函数中模拟 Python 输入
- angular - 角度 mdc-select 不应用全宽
- r - 包 withr 不可用(R 版本 4.0.2)
- capacitor - Ionic 5 + 带有华为 HMS 的电容器
- r - 在 R 中排列行,以使年份列按自定义顺序排列,并将具有相同条目的其他列分组
- machine-learning - 通过多重预处理点燃 ML
- c# - 测试项目不引用任何 .NET Nuget 适配器
- python - 如果 A 行中的字符串包含 B 行元素,则 Pandas 过滤器
- mysql - 如何在 MySQL 中查找重复记录,但有一定程度的差异?
- java - Java GroupBy 多个与 Sum