欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用require.context實(shí)現(xiàn)優(yōu)雅的預(yù)加載

 更新時(shí)間:2023年05月05日 16:51:16   作者:posted  
這篇文章主要介紹了使用require.context實(shí)現(xiàn)優(yōu)雅的預(yù)加載?,需要的朋友可以參考下

前言

在前端開發(fā)中,對(duì)頁面花里胡哨度[注1]要求越高的頁面,用到的圖片、音頻什么的就越多,比如什么結(jié)婚請(qǐng)柬、展會(huì)請(qǐng)柬、發(fā)布會(huì)宣傳頁、數(shù)據(jù)大屏。雖然現(xiàn)在瀏覽器不允許網(wǎng)頁在沒有用戶交互的情況下播放音頻,但是,我們依舊要在頁面展現(xiàn)的同時(shí),準(zhǔn)備好所有的靜態(tài)資源。

注1:花里胡哨度(garish degree),又名難做指數(shù),江湖人稱領(lǐng)導(dǎo)開心點(diǎn)

丑陋的預(yù)加載

預(yù)加載即提前加載,瀏覽器在請(qǐng)求一張圖片時(shí),會(huì)緩存到本地,在下次請(qǐng)求同樣的地址時(shí),會(huì)直接在本地緩存讀?。?04),在本地讀取的時(shí)間基本可以忽略不計(jì)。如果我們能夠在圖片未加載完成時(shí)給用戶一個(gè)加載進(jìn)度,提示用戶:“急什么,馬上完事!”,則能夠有效的提升用戶體驗(yàn)。

單張預(yù)加載

相信同學(xué)都了解圖片的預(yù)加載:

let img = new Image()
img.src = "@/../../xx.png"
img.onload = () => {
	//...
}

這是為大家所熟知的預(yù)加載方式,但是這種方法只適用于單張圖片的預(yù)加載。

那多張?jiān)趺醋瞿兀?/p>

多張預(yù)加載

很簡(jiǎn)單,我們給圖片們定義一個(gè)數(shù)組就好了

let imagesPathArr = ["@/../../xx.png","@/../../yy.png","..."];

然后我們?cè)儆醚h(huán)去加載這些圖片

let count = 0        
for (let item of imagesPathArr) {
          let img = new Image()
          img.src = item
          img.onload = () => {
            count++
            if (count === imagesPathArr.length) {
                // ... 加載完成
    		}
  		}
}

我們甚至可以通過count/imagesPathArr.length算出加載的百分比 。

沒錯(cuò),但是這種方法加載十張圖片還可以,那加載一百?gòu)埬兀?/p>

同學(xué)說:“我可以把圖片從0-99命名,加載時(shí)只需要循環(huán)一百次就可以了!”

可以,那么假如我們用python寫了一個(gè)重命名腳本,把這一百?gòu)垐D片從0-99命名完成。

那么我們的代碼就長(zhǎng)這樣:

for(let i = 0;i<=99;i++){
	let img = new Image()
      img.src = `@/../../${i}.png`
      img.onload = () => {
      count++
      if (count === imagesPathArr.length) {
          // ... 加載完成
      }
  	}
}

ok,看起來沒有任何問題,實(shí)際上也沒有任何問題。

但是在使用過程中,我們會(huì)發(fā)現(xiàn),圖片的格式不一定是統(tǒng)一的(當(dāng)然你可以將他們轉(zhuǎn)換成統(tǒng)一的),而且這種方式看起來太丑了,一點(diǎn)也不夠優(yōu)雅。

那么有沒有一種方式,優(yōu)雅的預(yù)加載呢?有。

優(yōu)雅的預(yù)加載

要實(shí)現(xiàn)優(yōu)雅的預(yù)加載,我們要優(yōu)哪些方面?

  • 第一,我們無需知道加載的圖片有多少;
  • 第二,我們無需知道加載的圖片叫什么;
  • 第三,我們無需知道圖片的格式是什么。

他??的,這聽起來就優(yōu)雅,相當(dāng)于什么都不用干,就把預(yù)加載做出來了!

但是,眾所周知,瀏覽器環(huán)境沒有直接操作文件系統(tǒng)的能力,我們無法像node一樣,直接使用fs,怎么才能做到如上所說的呢?從第一步來看,我們至少要遍歷一個(gè)父級(jí)文件夾吧?

本期的主角登場(chǎng)

require.context

它是一個(gè)webpack的api,可以通過這個(gè)方法獲取一個(gè)特定的上下文,用來實(shí)現(xiàn)文件的批量自動(dòng)化導(dǎo)入,如果你使用vite,那么可以使用 import.meta.globEager(),本文只用require.context舉例。

好像這個(gè)api已經(jīng)存在了好久了,但是我是最近才知道的??,在這里分享給還沒用過的同學(xué)。

使用語法如下:

        let requireModule = require.context(
          "../../../public/static/img", // 需要遍歷的路徑
          false, // 是否遞歸,設(shè)置為true會(huì)遞歸到最后一級(jí)文件夾
          /\.png|\.webp|\.jpg|\.jpeg|\.bmp|\.gif$/ //匹配的正則表達(dá)式
        );

上述代碼匹配了常用的圖片格式。

如果我們循環(huán)它的key(),會(huì)得到類似./xxx.png的項(xiàng),所以,只要去掉./就得到了文件夾下所有的圖片。

所以,我們可以做一個(gè)數(shù)組來儲(chǔ)存所有的圖片路徑:

let imagesPathArr = [];
for (var i = 0; i < requireModule.keys().length; i++) {
    imagesPathArr.push("/static/img/" + requireModule.keys()[i].substr(2, requireModule.keys()[i].length));
}

這樣,imagesPathArr就擁有了我們指定文件夾下所有的圖片路徑了,我們根本無需關(guān)心圖片有多少、叫什么、什么格式。

下面直接對(duì)imagesPathArr進(jìn)行循環(huán)(跟上面一樣),導(dǎo)入所有圖片:

        let count = 0
        for (let item of imagesPathArr) {
          let img = new Image()
          img.src = item
          img.onload = () => {
            count++
            if (count === imagesPathArr.length) {
                // 加載完成
            }
          }
        }

最后,我們把所有的邏輯封裝成一個(gè)函數(shù),并給他套上promise

    async loadImgs() {
      await new Promise((resolve, reject) => {
        this.$store.dispatch('loadingStart', {
          text: "正在加載資源"
        })
        let requireModule = require.context(
          "../../../public/static/img",
          false,
          /\.png|\.webp|\.jpg|\.jpeg|\.bmp|\.gif$/
        );
        let imagesPathArr = [];
        for (var i = 0; i < requireModule.keys().length; i++) {
          imagesPathArr.push("/static/img/" + requireModule.keys()[i].substr(2, requireModule.keys()[i].length));
        }
        let count = 0
        for (let item of imagesPathArr) {
          let img = new Image()
          img.src = item
          img.onload = () => {
            count++
            if (count === imagesPathArr.length) {
              this.$store.dispatch('loadingDone')
              resolve()
            }
          }
        }
      })
    },

我們只需在合適的時(shí)機(jī),調(diào)用該函數(shù),即可全自動(dòng)的預(yù)加載圖片了,而且日后往文件夾內(nèi)新增或者刪除圖片,都不用管這一段邏輯,它依然可以穩(wěn)健運(yùn)行!如果你有加載音頻的需求,也是同理,在正則部分加一個(gè).mp3什么的,使用audio.onload即可!

到此這篇關(guān)于使用require.context實(shí)現(xiàn)優(yōu)雅的預(yù)加載 的文章就介紹到這了,更多相關(guān)require.context預(yù)加載 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ES6/JavaScript使用技巧分享

    ES6/JavaScript使用技巧分享

    本篇文章主要給大家講解了ES6/JavaScript使用技巧,需要的朋友參考一下吧。
    2017-12-12
  • JS檢測(cè)數(shù)組類型的方法小結(jié)

    JS檢測(cè)數(shù)組類型的方法小結(jié)

    這篇文章主要介紹了js檢測(cè)數(shù)組類型的方法小結(jié),有instanceof方法Array.isArray() 方法和Object.prototype.toString.call()方法,都是比較常用的,需要的朋友可以參考下
    2017-03-03
  • JavaScript閉包實(shí)例講解

    JavaScript閉包實(shí)例講解

    眾所周知,JavaScript沒有塊級(jí)作用域,只有函數(shù)作用域。那就意味著定義在函數(shù)中的參數(shù)和變量在函數(shù)外部是不可見的,而在一個(gè)函數(shù)內(nèi)部任何位置定義的變量,在該函數(shù)內(nèi)部任何地方都可見
    2014-04-04
  • JavaScript引用賦值與傳值賦值總結(jié)

    JavaScript引用賦值與傳值賦值總結(jié)

    這篇文章主要介紹了JavaScript引用賦值與傳值賦值總結(jié),在JavaScript中基本數(shù)據(jù)類型都是傳值賦值,復(fù)合數(shù)據(jù)類型都是引用賦值(傳地址)也叫引用傳址,下文更多相關(guān)資料,需要的小伙伴可以參考一下
    2022-05-05
  • 微信小程序用戶授權(quán)彈窗 拒絕時(shí)引導(dǎo)用戶重新授權(quán)實(shí)現(xiàn)

    微信小程序用戶授權(quán)彈窗 拒絕時(shí)引導(dǎo)用戶重新授權(quán)實(shí)現(xiàn)

    我們?cè)陂_發(fā)小程序時(shí),如果想獲取用戶信息,就需要獲取用的授權(quán),如果用戶誤點(diǎn)了拒絕授權(quán),我們?cè)趺礃尤フ_的引導(dǎo)用戶重新授權(quán)呢。今天就來給大家講講如果正確的引導(dǎo)用戶授權(quán),需要的朋友可以參考下
    2019-07-07
  • 原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法

    原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法

    這篇文章主要介紹了原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了JavaScript針對(duì)頁面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-09-09
  • JS高仿拋物線加入購(gòu)物車特效實(shí)現(xiàn)代碼

    JS高仿拋物線加入購(gòu)物車特效實(shí)現(xiàn)代碼

    本篇文章主要介紹了JS高仿拋物線加入購(gòu)物車特效實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • js仿搜狐視頻記錄片列表展示效果

    js仿搜狐視頻記錄片列表展示效果

    這篇文章主要為大家詳細(xì)介紹了js仿搜狐視頻記錄片列表展示效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • JavaScript中async/await的高級(jí)用法小結(jié)

    JavaScript中async/await的高級(jí)用法小結(jié)

    JavaScript的異步編程已經(jīng)從回調(diào)(Callback)演進(jìn)到Promise,再到如今廣泛使用的async/await語法,本文為大家整理了7個(gè)async/await高級(jí)用法,希望對(duì)大家有所幫助
    2023-12-12
  • JavaScript中的簡(jiǎn)寫語法分享

    JavaScript中的簡(jiǎn)寫語法分享

    這篇文章主要為大家整理了12個(gè)JavaScript中常用的簡(jiǎn)寫語法技巧,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以收藏一下
    2023-04-04

最新評(píng)論