3个缓存策略为你的React应用提供更好的用户体验

433 阅读4分钟

整合缓存策略是最好的方法之一,通过它我们可以提高网站的性能减少使用的资源数量,并最终通过更快的加载时间改善用户的体验

当涉及到将缓存解决方案与你的React应用程序整合时,有3种主要策略,这都取决于你自己的定制要求。

这些要求涉及到我们希望存储的内容的时间跨度,缓存内容变化的频率,服务器请求的可靠性,以及我们正在处理的应用程序的类型,可能侧重于在线或离线互动。

Cache Illustration

不过,你可能要考虑的一个因素是,你目前的项目或你打算开始工作的项目是否在使用状态管理库,如Redux/Vuex/MobX,因为这将需要一个与我们在本文中所讨论的不同的方法。

注意事项。在这篇文章中,我们将使用浏览器的本地存储API,因为它是最可靠和最适合于处理缓存的解决方案。我们正在使用useEffect钩子,你可以在这里阅读更多的信息。

缓存策略

1.后退式缓存

这可能是最简单的,但也是一种有效的缓存策略。它允许我们通过总是存储我们试图检索的内容的先前版本来保护自己免受失败的请求。

虽然它在性能方面没有什么帮助,但它的真正好处在于它是一个很好的措施,可以确保我们保护自己免受失败的服务器请求的影响,否则会使我们遇到意外的情况:

const [posts, setPosts] = useState([]);
useEffect(() => {
  const fetchData = async () => {
    try {
      const { data } = await axios.get('https://jsonplaceholder.typicode.com/posts');
      setPosts(data);
      localStorage.setItem("posts", data);
    } catch (err) {
      setPosts(localStorage.getItem("posts") || []);
    }
  };
  fetchData();
}, []);

2.本地优先的缓存

这是一种缓存策略,最适合于我们希望缓存不太可能经常变化的内容的情况,如导航链接列表、用户的个人资料信息(个人资料图片URL、生物、出生日期、用户名等)、档案等。

该策略包括我们在发出获取数据的请求之前检查缓存,这样我们就可以在第一次请求之后的每次请求中跳过请求数据。当我们在经常访问的页面上缓存内容时,它才会真正发挥作用:

const [posts, setPosts] = useState([]);
useEffect(() => {
  const storedPosts = localStorage.getItem("posts");
  const fetchData = async () => {
    try {
      const { data } = await axios.get('https://jsonplaceholder.typicode.com/posts');
      setPosts(data);
      localStorage.setItem("posts", data);
    } catch (err) {
      // Handle Error
    }
  };
  if (!storedPosts) {
    fetchData();
  }
}, []);

3.版本化缓存

一个更高级的缓冲技术是我们对缓冲进行版本管理。它包括我们把我们希望缓存的内容的一个版本和内容本身一起标注在缓存存储条目中。

版本化是一个可控的过程,这意味着我们可以在需要的时候触发本地计算的版本的副作用来更新缓存,类似于下面所附的代码片段中的方式。

const [posts, setPosts] = useState([]);
useEffect(() => {
  // Versioned Cache Entry
  const versionedPostsEntry = localStorage.getItem('posts');
  const versionedPosts = versionedPostsEntry.posts;
  const cacheVersion = versionedPostsEntry.version;
  // This will be computed according to your use-case
  const computedVersion = 2;
  const fetchData = async () => {
    try {
      const { data } = await axios.get('https://jsonplaceholder.typicode.com/posts');
      setPosts(data);
      localStorage.setItem("posts", {
        version: computedVersion,
        posts: data,
      });
    } catch (err) {
      // Handle Error
    }
  };
  if (!cacheVersion || cacheVersion < computedVersion) {
    fetchData();
  } else {
    setPosts(versionedPosts);
  }
}, []);

正如上面的例子所概述的,每个缓存条目都有一个版本标签,它将被用来追踪当前缓存的版本到外部的计算值(这将作为我们的控制开关)。这意味着可以平稳地控制缓存过程,以便在需要的时候进行缓存更新。

这种策略是两全其美的,因为我们不仅可以选择处理偶尔紧急改变的缓存内容,还可以根据手头的情况维持较长的时间,所以这一切都取决于我们。

这种策略的缺点是,为了使一切都在控制之下,沿途会有更多的复杂性,因为我们必须仔细地协调副作用。

总结

在你的React应用程序中集成缓存解决方案有几个好处:从性能提升到通过消除加载时间来改善用户体验,以及通过减少发送到服务器的请求数量来减少资源的使用,从而导致对后端架构的整体压力减少

我希望你喜欢阅读这篇文章,并从中学到一些新东西。

如果你对我在这篇文章中讨论的内容有任何建议或问题,或者你希望留下任何形式的反馈,请在下面留言,我们将进一步讨论。

干杯!