假设我有一个像这样的URL列表:
[ '/images/1', '/images/2', ... ]
我想要预获取其中的n
个URL,以便在图像之间进行转换更快。现在在componentWillMount
中我正在执行以下操作:
componentWillMount() {
const { props } = this;
const { prefetchLimit = 1, document = dummyDocument, imgNodes } = props;
const { images } = document;
const toPrefecth = take(prefetchLimit, images);
const merged = zip(toPrefecth, imgNodes);
merged.forEach(([url, node]) => {
node.src = url;
});
}
使用如下方式定义imgNodes
:
imgNodes: times(_ => new window.Image(), props.prefetchLimit),
其中times
、zip
和 take
来自Ramda。
现在当我像这样在 React 中使用这些 URL 时:
<img src={url} />
不管 URL 在何处使用,它都会根据Etag
和Expire
标记命中浏览器缓存。我还计划在视图内部达到 n - 1
时预取下一个n
张图片,以同样的方式重用 imgNodes
。
我的问题是:
考虑到将有100多个组件使用此想法,但一次只有1个组件可见,这是一个有效的想法吗?
这样做会遇到内存问题吗?我认为当组件卸载时,
imgNodes
会被垃圾回收。
我们正在使用redux
,因此我可以将这些图像保存在 store 中,但这似乎是我处理缓存而不是利用浏览器的自然缓存。
这是一个多么糟糕的想法?
img
规范的理解方式。它似乎表明,一旦您要求浏览器获取资源,如果您再次请求并且它在您已知的图像列表中,则不必重新请求该资源。https://dev.w3.org/html5/spec-preview/the-img-element.html#list-of-available-images我希望如果我误解了这一点,那么浏览器/HTTP缓存会说不要重新获取。 - Tim Roberts