【发布时间】:2017-09-24 11:20:36
【问题描述】:
假设我有一个这样的 url 列表:
[ '/images/1', '/images/2', ... ]
我想预取其中的n,以便图像之间的转换更快。我现在在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),
还有来自ramda的times、zip和take。
现在当我在里面使用这些网址时,会像这样:
<img src={url} />
它会根据Etag 和Expire 标记访问浏览器缓存,无论在哪里使用url。我还计划在我们在视图内点击n - 1 时使用它来预取下一个n 图像,以同样的方式重用imgNodes。
我的问题是:
这是否是一个有效的想法,提供 100 多个将使用此想法但一次只能看到 1 个的组件?
这样做会遇到内存问题吗?我假设在卸载组件时
imgNodes将被垃圾收集。
我们正在使用redux,因此我可以将这些图像保存在商店中,但这似乎是我在处理缓存而不是利用浏览器的自然缓存。
这是多么糟糕的想法?
【问题讨论】:
-
你有没有带着这个去任何地方?我有兴趣...
-
@MathieuK。我们具有与上述基本相同的结构/接口,利用正常的 HTTP 缓存。
-
所以你依赖浏览器/HTTP的默认行为?
-
我依赖于我理解 HTML 的
img规范的方式。听起来好像是说一旦您要求浏览器获取资源,如果您再次询问并且它在您的已知图像列表中,它就不必重新请求该资源。 dev.w3.org/html5/spec-preview/… 我希望如果我误解了,浏览器/HTTP 缓存会说不要重新获取。
标签: javascript reactjs caching dom