使用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中的缓存拿到。


http://img.mukewang.com/szimg/62c40e8a08a6b28410010280.jpg

有几个问题

  1. 在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

同学你好!

非常好的优化尝试!

  1. webpack的prefetch注释确实是针对组件的,更准确说是针对chunk的。

  2. 你可以自己提前请求来图片然后缓存,或者用prefetch/preload交给浏览器去做,浏览器有它自己的缓存。另外,可以一上来直接prefetch/preload后面的所有图片,引导页的图片最终都要加载吧。如果前面还有其他页面,最好在前面的页面做预加载。推荐你看下这个文章,考虑一下prefetch和preload的适用场景。https://medium.com/reloading/preload-prefetch-and-priorities-in-chrome-776165961bbf

  3. 这个看下有没跨域报错,但是图片貌似加载成功的,你截图里图1和图4都有预览。这个不是特别确实原因。

  4. 如果你是从自己的cacheImg缓存里取出图片资源,再交给浏览器去渲染,这个处理会慢一些。但我看你实际好像又是用的background-image: url(this.image). 你的this.image是图片资源路径?那实际是走浏览器的请求和缓存?prefetch不能保证一定会预加载。如果this.image是你从自己缓存取出的资源然后转成了base64再渲染,这个比较慢,肯定会闪白。

0
4
Mr_Max
回复
Mesry
你import进来这个图片成模块,它肯定要被先下载本地缓存,你的await不是在等吗?你可以调试看一下。我说的放成本地资源就是把它直接放工程里,当静态资源用,不建议那样。
2022-07-09
共4条回复

前端性能优化企业级解决方案 6大角度+大厂视野

只要项目还在线,性能优化永远是时刻要关注的问题

1109 学习 · 226 问题

查看课程