”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Next.js 缓存:通过高效的数据获取来增强您的应用程序

Next.js 缓存:通过高效的数据获取来增强您的应用程序

发布于2024-11-08
浏览:347

Next.js 中的缓存不仅仅是为了节省时间,还在于减少冗余网络请求、保持数据新鲜并使您的应用程序像摇滚明星一样运行。
无论您是想将数据缓存更长时间还是按需刷新,Next.js 都能为您提供所需的所有工具。在本文中,我们将详细介绍如何在 Next.js 中有效地使用缓存

Next.js 扩展了 fetch API,为您提供缓存方面的超能力。使用 cache: 'no-store'cache: 'force-cache' 等简单的获取选项,您可以轻松控制数据缓存的时间和方式。

始终保持新鲜缓存:'no-store'(相当于unstable_noStore())

每次都想要新鲜数据吗? cache: 'no-store' 是可以使用的。此获取选项完全跳过缓存并在每次请求时获取最新数据。当您需要实时准确性时,它是完美的 - 不允许昨天提取的剩余内容。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

注意:如果您想跳过服务器组件上的缓存,还可以使用unstable_noStore()。语法稍后可能会更改,因此请坚持使用 cache: 'no-store' 以确保稳定性。

通过缓存重用数据:'force-cache'(相当于unstable_cache())

另一方面,如果您可以使用缓存数据(考虑不经常更改的静态内容),请使用 cache: 'force-cache'。它将保存响应以供将来使用并跳过冗余的网络请求。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

注意:unstable_cache() 也会缓存数据,但如果您要避免将来发生意外,使用稳定的 cache: 'force-cache' 会更可靠。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

通过重新验证保持新鲜感

有时缓存的数据需要刷新——无论是在特定时间之后还是由事件触发时。幸运的是,Next.js 允许您通过多种方式重新验证缓存的数据。

使用时间重新验证:next.revalidate

如果您的数据需要定期刷新(例如每小时或每天),您可以使用提取请求中的 next.revalidate 选项设置重新验证期。它将在您指定的时间后获取最新数据,同时在其余时间保留缓存内容。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

fetch('https://api.example.com/data', {
  next: { revalidate: 3600 }  // Revalidate data every hour (3600 seconds)
});

带标签的按需重新验证:revalidateTag()

现在,想象一下,您可以告诉 Next.js 在发生重要事件(例如表单提交或新博客文章上线)时刷新缓存数据的特定位。您可以为缓存的数据分配标签,然后在需要时重新验证这些标签。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

这样,您可以根据需要手动刷新部分缓存,而无需等待下一次计划的重新验证。

使用不稳定的方法

如果您是喜欢冒险的人,您还可以直接在服务器组件上使用 unstable_noStore()unstable_cache() 方法来管理缓存行为。请记住,这些“不稳定”是有原因的,因此它们将来可能会发生变化(或者在您阅读时可能已发生变化)。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

或者,如果您热衷于缓存,请按以下方法使用 stable_cache():

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

跳过支柱钻孔

这里有一个巧妙的技巧:如果您要跨多个组件(例如布局、页面和一些内部组件)获取相同的数据,请不要强调在顶部获取一次并将其向下传递或必须在多个组件上多次请求该数据会导致性能下降。 Next.js 在服务器渲染期间自动记住获取请求,这意味着如果您多次获取相同的数据,它足够智能,只需访问网络一次并在多个组件中共享结果。

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

Next.js Caching: Turbocharging Your App with Efficient Data Fetching

总结一下

Next.js 为您提供了有效管理缓存所需的所有工具,无论是通过 fetch API 选项,如 cache: 'no-store'cache: 'force-cache',或者更具实验性的unstable_noStore() 和unstable_cache() 方法。添加 next.revalidaterevalidateTag 等重新验证策略,您就拥有了保持数据新鲜所需的一切。

来源:
Next.js 缓存

版本声明 本文转载于:https://dev.to/samaghapour/nextjs-caching-turbocharging-your-app-with-efficient-data-fetching-51hb?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    appEngine静态文件mime type override ,静态文件处理程序有时可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for file for file for [File]。 application/application/octet...
    编程 发布于2025-04-30
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-30
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-04-30
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-04-30
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-04-30
  • `position: sticky`与`bottom: 0`为何与MDN描述相反?
    `position: sticky`与`bottom: 0`为何与MDN描述相反?
    位置的相反行为:底部粘性:0 指定位置:粘贴底部:0时,它的行为与MDN提供的定义不同。与描述不同,其中最初将元素视为相对位置,直到它们超过阈值并固定为固定,在提供的代码示例中,底部为底部:0指定。 MDN指出,首先应将页脚元素从视图的底部移动到0px。但是,观察到的行为是相反的: ...
    编程 发布于2025-04-30
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-30
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-04-30
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-30
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-04-30
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 中删除一个频繁的问题时,在与Chrome and IE9中的图像一起工作时,遇到了一个频繁的问题。和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下CSS ID块创建带...
    编程 发布于2025-04-30
  • 在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    Accessing Actual Rendered Font when Undefined in CSSWhen accessing the font properties of an element, the JavaScript object.style.fontFamily and objec...
    编程 发布于2025-04-30
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-30
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-30
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-04-30

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3