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

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

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

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]删除
最新教程 更多>
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,以便更快地搜索这些前缀。理解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-04-07
  • \“(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-07
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    将pandas dataframe列转换为dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定义格式:})指定的格式参数匹配给定的字符串格式。转换后,MyCol列现在将包含DateTime对象。 date date filtering > = p...
    编程 发布于2025-04-07
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-04-07
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] 剩余_size- = buf_size lines = buffer.split('\ n'....
    编程 发布于2025-04-07
  • 如何将来自三个MySQL表的数据组合到新表中?
    如何将来自三个MySQL表的数据组合到新表中?
    mysql:从三个表和列的新表创建新表 答案:为了实现这一目标,您可以利用一个3-way Join。 选择p。*,d.content作为年龄 来自人为p的人 加入d.person_id = p.id上的d的详细信息 加入T.Id = d.detail_id的分类法 其中t.taxonomy =...
    编程 发布于2025-04-07
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-04-07
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-04-07
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-07
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-04-07
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-04-07
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-04-07
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-07
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-07
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-04-07

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

Copyright© 2022 湘ICP备2022001581号-3