使用prefetch优化的问题
来源:8-4 优化资源加载的顺序【给资源设置优先级】
Mesry
2022-07-05
项目描述
我用webpack+vue写的项目,一个引导页面里,只有一张大的背景图,点击下一步换另一张图片,在点切换到下一张
代码如下
<div :style="{backgroundImage: 'url(' + this.image +')'}"></div>const cacheImg = {}
export default {
data () {
image: '',
mode: 1,
step: 1,
cacheImg: {}
},
created () {
const result = await this.loadImg(this.mode, this.step)
this.image = result
},
methods: {
async loadImg (mode, step) {
const result = await import(`../assets/img/feature-guide${mode}_${step}.png`)
this.setCacheImg(`${mode}_${step}`, result.default)
return Promise.resolve(result.default)
},
setCacheImg (key, value) {
cacheImg[key] = value
const link = document.createElement('link')
link.as = 'image'
link.rel = 'prefetch'
link.href = value
document.head.appendChild(link)
},
}
}思路是想利用prefetch做预加载,每次点击都import()当前图片的下一张图片,并将结果缓存到cacheImg对象中,并动态写入link标签。当真正请求当前图片的下一张图片的时候,去cacheImg对象中去找,使图片从prefetch中的缓存拿到。

有几个问题
在webpack中利用注释的prefetch,是不是只支持组件,不支持图片,所以我才手动写入link标签
2.不知道我这么做,是否正确,但是我看确实是走的prefetch的缓存
3.我上图红框中,显示白页图标的,打开response,显示Failed to load response data: No data found for resource with giver identifier。这是为什么,我这图片加载进来了嘛。
4.虽然做了prefetch,但是点击下一步,切换图片的时候,仍然屏幕会闪一下,这个怎么优化
1回答
-
Mr_Max
2022-07-06
同学你好!
非常好的优化尝试!
webpack的prefetch注释确实是针对组件的,更准确说是针对chunk的。
你可以自己提前请求来图片然后缓存,或者用prefetch/preload交给浏览器去做,浏览器有它自己的缓存。另外,可以一上来直接prefetch/preload后面的所有图片,引导页的图片最终都要加载吧。如果前面还有其他页面,最好在前面的页面做预加载。推荐你看下这个文章,考虑一下prefetch和preload的适用场景。https://medium.com/reloading/preload-prefetch-and-priorities-in-chrome-776165961bbf。
这个看下有没跨域报错,但是图片貌似加载成功的,你截图里图1和图4都有预览。这个不是特别确实原因。
如果你是从自己的cacheImg缓存里取出图片资源,再交给浏览器去渲染,这个处理会慢一些。但我看你实际好像又是用的background-image: url(this.image). 你的this.image是图片资源路径?那实际是走浏览器的请求和缓存?prefetch不能保证一定会预加载。如果this.image是你从自己缓存取出的资源然后转成了base64再渲染,这个比较慢,肯定会闪白。
042022-07-09
相似问题