关于前端框架:React内部是如何实现cache方法的
大家好,我卡颂。 前几天写的一篇介绍use这个新hook的文章中聊到React原生实现了一个缓存函数的办法 —— cache。 对于如下代码,被cache包裹的函数,当屡次调用时,如果传参不变,会始终返回缓存值: const cacheFn = cache(fn);cacheFn(1, 2, 3);// 不会执行fn,间接返回缓存值cacheFn(1, 2, 3);React内为什么须要cache办法呢?思考如下组件: const fetch = cache(fetchUserData);function User({id}) { const {name} = use(fetch(id)); return <p>{name}</p>;}User组件会依据用户id申请用户数据,并渲染用户名。 如果id扭转,那么fetch办法从新发动申请是失常逻辑。 然而,React组件常常render,如果在id不变的状况下,因为User组件render导致一直发动申请,显然是不合理的。 所以,这种状况下就须要cache办法。当id不变时,即便User组件重复render,fetch(id)都返回同一个值。 本文来聊聊cache的源码实现。 欢送退出人类高质量前端框架群,带飞 剖析实现思路整个办法实现一共有64行代码,首先咱们来剖析下实现要点。 如果参数不变,则应用缓存的值。这意味着咱们须要解决: 参数的程序举个例子,当参数程序变了,不应用缓存值: const cacheFn = cache(fn);cacheFn(1, 2, 3);// 不应用缓存值cacheFn(3, 2, 1);区别解决援用类型、原始类型参数举个例子,当同一地位的参数传递了同一个援用类型值,则返回缓存值: const cacheFn = cache(fn);const obj = {};cacheFn(1, obj, 3);// 返回缓存值cacheFn(1, obj, 3);当同一地位的参数传递了不同援用类型值,则不返回缓存值: const cacheFn = cache(fn);const obj = {};cacheFn(1, obj, 3);// 不返回缓存值cacheFn(1, {}, 3);缓存的垃圾回收缓存数据时,要留神缓存生效然而援用的数据没有开释造成的内存透露问题。 所以,对于援用类型数据,能够应用WeakMap保留。 对于原始类型数据,能够应用Map保留。 ...