如何设置运行时生成的新页面的预呈现HTML在Next.js中的增量静态生成(ISR)存储位置,例如AWS S3



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

同样的问题也会出现在增量静态生成中,我可能只想在构建时预先呈现浏览量最大的页面的子集。

当在本地运行时,生成的预呈现文件将存储在.next/server/pages下的本地文件系统中(尽管我在https://github.com/vercel/next.js/tree/c7596be786ebe1fa5860c0f5efd7781faae0f931/examples其中在运行时生成页面(。

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

这是可能的还是在某个地方记录的?

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

  • https://github.com/vercel/next.js/discussions/25410

  • 如何在Next.js中使用AWS?我认为这只是关于构建时生成的页面,而不是运行时

  • https://vercel.com/docs/next.js/incremental-static-regeneration

  • https://github.com/vercel/next.js/discussions/17711

  • 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://github.com/vercel/next.js/discussions/17080

  • https://github.com/vercel/next.js/discussions/16852

  • 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无服务器APIhttps://nextjs.org/blog/next-8#serverless-nextjs,但我找不到关于如何在不使用存储库的情况下做到这一点的清晰文档

    此外,该项目确实声称在他们的自述文件上处理ISR。

我最终了解了更多关于Next.js的信息。回退false与true与阻止getStaticPaths之间的区别是什么?这澄清了我的一些想法。

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

  • 当用户更新页面时,使CDN/S3无效。更一般地,我需要对";哪些用户动作可能改变页面呈现的方式";,他们中的任何一个人都必须更改页面。功能请求位于:https://github.com/vercel/next.js/discussions/11698

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

    我根本不确定CDN是否具有这种能力,尽管能力在";更现代的CDN";在https://formidable.com/blog/2019/modern-cdns-lambda/可能允许

我还用标准ISR在Heroku上启动了一项测试https://github.com/cirosantilli/node-express-sequelize-nextjs-realworld-example-app/tree/63150b632f5e6feda8ba3b8029e22de25543f162而且它似乎运行正常,所以当文件系统被破坏时,最糟糕的事情可能是我会丢失一些缓存。这并不像我想要实现的设置那样令人惊叹,但由于CDN功能,我甚至不确定这是否可能,所以我将从标准ISR开始,看看它的进展如何。

最新更新