圖片預(yù)加載踩坑

Preload方法

搜到一個Image Preload的方案肌访,簡單粗暴

const img = new Image();
img.src = url;

執(zhí)行以上代碼纯陨,這個url的圖片就會被預(yù)加載政溃,想要使用的時候趾访,img.onload 即可,甚至重新new一個Image對象董虱,賦值相同的url扼鞋,都是可以復(fù)用的。

Canvas跨域報錯

但是直接用會在canvas里會有個坑愤诱。

Canvas報錯

當(dāng)我使用canvas的 ctx.getImageData 會得到這個報錯云头,直譯過來就是有跨域數(shù)據(jù)污染了canvas。

增加一個 img.crossOrigin = ""; 即可淫半。雖然這里設(shè)置的是空字符串溃槐,實際上起作用的屬性值是anonymous。

crossOrigin可以有下面兩個值:

關(guān)鍵字 含義
anonymous 元素的跨域資源請求不需要憑證標(biāo)志設(shè)置科吭。
use-credentials 元素的跨域資源請求需要憑證標(biāo)志設(shè)置昏滴,意味著該請求需要提供憑證猴鲫。

實際上,只要crossOrigin的屬性值不是use-credentials谣殊,全部都會解析為anonymous拂共,包括空字符串,包括類似'abc'這樣的字符姻几。

https://www.zhangxinxu.com/wordpress/2018/02/crossorigin-canvas-getimagedata-cors/

這樣操作后就可以快樂的預(yù)加載圖片宜狐,并且和Canvas愉快的玩耍了。

圖片好像加載了兩次

有一些圖片蛇捌,我不僅僅在JS里用來用去肌厨,還在HTML中img標(biāo)簽用到了,然而我發(fā)現(xiàn)這圖請求了兩次豁陆。

重復(fù)加載

難道img標(biāo)簽和js中的 Image 對象不能共用這個預(yù)加載柑爸??

或者不應(yīng)該用src傳鏈接盒音?而是img標(biāo)簽有什么別的屬性可以接收Image對象表鳍?

Image對象不就是img HTMLElement嗎?祥诽?譬圣?

到底是為什么呢。雄坪。厘熟。

很細(xì)小的區(qū)別就是其中一個多了個Origin字段:

請求1

請求2

我直接去查了img標(biāo)簽有哪些屬性,https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img

發(fā)現(xiàn)了一個叫crossorigin的屬性维哈。绳姨。

沒錯,安排上anonymous阔挠,就可以省掉多余的那次請求了飘庄。

<img :src="currentBgUrl" alt="背景圖" crossorigin="anonymous">

優(yōu)化預(yù)加載圖片數(shù)組

一開始直接一個forEach,每個url搞個對象預(yù)加載一下购撼,目的是達(dá)到了跪削。但還可以根據(jù)場景再優(yōu)化一下。

考慮到這列圖片用在刮刮樂上迂求,圖片是按順序展示的碾盐,第一張圖沒加載出來,第108張圖根本是用不到的揩局。

所以:

preloadImages(imageUrls, index = 0) {
  if (imageUrls && imageUrls.length > index) {
    const img = new Image();
    img.onload = () => {
      preloadImages(imageUrls, index + 1);
    };
    img.crossOrigin = "";
    img.src = imageUrls[index];
  }
}

參考 https://www.photo-mark.com/notes/image-preloading/

加載序列

盜一下別人的測試結(jié)果

The canonical preloader shaved 1.5 seconds off the total time. But that’s not the most important statistic in this case. The top line of each chart represents the download time of the next image in the gallery — the one 90% of my users will ask for next. Using the canonical preloader code with a moderately slow connection, that image is not available to our viewer until 14.27 seconds after the page loads even though it was first in line and began downloading immediately after the main page loaded. This is because it is sharing bandwidth with a bunch of other files as you can see in the chart. With the sequential download this image has the full bandwidth to itself and is ready in 1.46 seconds — almost 1000% faster. For our most common use case this is an immense improvement.

簡言之毫玖,并行加載確實省一點點點點點點時間(24.01秒 VS 25.44秒),但是跟提升的用戶體驗比起來顯得微不足道。

我自己也測試了一下效果孕豹,理論上來說涩盾,讓前面的圖片先加載顯然更加有意義。當(dāng)然励背,在圖片較小網(wǎng)速較快的情況下春霍,這兩種體驗的差距幾乎忽略不計∫睹迹總而言之址儒,串行加載不虧。

串行加載
并行加載

用戶點擊切換圖片的時候衅疙,好像還是又請求了莲趣?

不得不說,加載完成后饱溢,等待用戶交互喧伞,等到用戶點擊切換其他圖片時,又發(fā)了一個請求绩郎,明明已經(jīng)preload了潘鲫。

我只好將所有圖片preload時push到一個cache數(shù)組掛在vue實例data中,果然OK了肋杖。完美實現(xiàn)溉仑。

我估計是preload完img又被GC了…

https://stackoverflow.com/questions/15736501/non-attached-image-onload-garbage-collection

https://stackoverflow.com/a/20847365

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市状植,隨后出現(xiàn)的幾起案子浊竟,更是在濱河造成了極大的恐慌,老刑警劉巖津畸,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件振定,死亡現(xiàn)場離奇詭異,居然都是意外死亡洼畅,警方通過查閱死者的電腦和手機吩案,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帝簇,“玉大人,你說我怎么就攤上這事靠益∩ル龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵胧后,是天一觀的道長芋浮。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么纸巷? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任镇草,我火速辦了婚禮,結(jié)果婚禮上瘤旨,老公的妹妹穿的比我還像新娘梯啤。我一直安慰自己,他們只是感情好存哲,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布因宇。 她就那樣靜靜地躺著,像睡著了一般祟偷。 火紅的嫁衣襯著肌膚如雪察滑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天修肠,我揣著相機與錄音贺辰,去河邊找鬼。 笑死嵌施,一個胖子當(dāng)著我的面吹牛饲化,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艰管,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滓侍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牲芋?” 一聲冷哼從身側(cè)響起撩笆,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缸浦,沒想到半個月后夕冲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡裂逐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年歹鱼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卜高。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弥姻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掺涛,到底是詐尸還是另有隱情庭敦,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布薪缆,位于F島的核電站秧廉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疼电,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一嚼锄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔽豺,春花似錦区丑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至濒析,卻和暖如春正什,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背号杏。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工婴氮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盾致。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓主经,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庭惜。 傳聞我的和親對象是個殘疾皇子罩驻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容