成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

前端資源加載重試

Prasanta / 2285人閱讀

摘要:資源加載重試,則是提高用戶(hù)體驗(yàn)中重要的一環(huán)。對(duì)加載失敗的進(jìn)行重試。一個(gè),有時(shí)候會(huì)包括及資源,其中一個(gè)加載失敗便會(huì)發(fā)起重試,直到有一個(gè)資源重試了次就判斷為失敗。通過(guò)資源加載重試,可大大減少中加載異步的頁(yè)面文件時(shí),失敗而導(dǎo)致白屏的問(wèn)題。

介紹

對(duì)于TO C的應(yīng)用,用戶(hù)網(wǎng)絡(luò)千差萬(wàn)別,總有各種網(wǎng)絡(luò)問(wèn)題導(dǎo)致資源加載失敗,使得訪問(wèn)時(shí)出現(xiàn)白屏,樣式錯(cuò)亂等。資源加載重試,則是提高用戶(hù)體驗(yàn)中重要的一環(huán)。

最近開(kāi)始嘗試用 Vue 整套技術(shù)體系進(jìn)行開(kāi)發(fā)。如何在 Vue 中做資源加載重試?

資源分類(lèi)

目前常見(jiàn)的前端資源分為

script 腳本

css 樣式文件

img 圖片

background-img 背景圖

而在 webpack 構(gòu)建體系里,根據(jù)加載方式可以細(xì)分為

內(nèi)聯(lián)到html的script,link標(biāo)簽

img圖片

import() 或 require.ensure 異步加載的chunk,通過(guò)webpack內(nèi)置的加載器完成

實(shí)踐方案 內(nèi)聯(lián)資源重試

assets-reload

通過(guò) script, link, img 等標(biāo)簽上的 onerror 回調(diào)來(lái)進(jìn)行資源加載重試,并且替換的URL規(guī)則可定制。而背景圖則是讀取樣式表的規(guī)則,匹配到 background-img,則重新插入一條 background-img 樣式,用于重試。

具體的實(shí)現(xiàn)歡迎點(diǎn)擊該模塊參考。

另外配合webpack構(gòu)建自動(dòng)化的能力,將這些onerror函數(shù)進(jìn)行綁定。

script

通過(guò)這個(gè)模塊,再利用script-ext-html-webpack-plugin 配置script的onerror屬性

    new ScriptExtHtmlWebpackPlugin({
        custom: {
        test: /.js$/,
        attribute: "onerror="attackCatch(this)""
        }
    })
link

另外寫(xiě)個(gè)簡(jiǎn)單的插件將head處內(nèi)聯(lián)的link標(biāo)簽加上onerror屬性。

class MyPlugin {
  apply (compiler) {
    compiler.hooks.compilation.tap("css-attr-plugin", (compilation) => {
      compilation.hooks.htmlWebpackPluginAlterAssetTags
      .tapAsync("myPlugin", function (data, cb) {
        data.head.forEach(el=>{
          if(el.tagName === "link"){
            el.attributes.onerror = "attackCatch(this)";
          }
        })
        cb(null ,data);
      });
    })
  }
}

module.exports = MyPlugin
img

img目前暫未找到適配的插件,稍后將自行添加對(duì)應(yīng)的插件。也歡迎各位推薦

background-img 背景圖

背景圖這一塊,則因?yàn)闆](méi)有事件監(jiān)聽(tīng),只能進(jìn)行全量替換,目前的應(yīng)用僅在測(cè)試域名環(huán)境下,將所有背景圖資源替換為當(dāng)前域名下。

webpack內(nèi)置異步加載器

webpack-plugin-import-retry

閱讀了webpack資源加載器部分的代碼,重寫(xiě)了下加載器部分,實(shí)現(xiàn)了重試的能力。同時(shí)支持,傳入格式化URL函數(shù)用于自定義重試時(shí)的鏈接。

對(duì)加載失敗的chunk,進(jìn)行重試。

一個(gè)chunk,有時(shí)候會(huì)包括 JS及CSS資源,其中一個(gè)加載失敗便會(huì)發(fā)起重試,直到有一個(gè)資源重試了2次就判斷為失敗。

通過(guò)資源加載重試,可大大減少 router 中,加載異步的頁(yè)面文件時(shí),失敗而導(dǎo)致白屏的問(wèn)題。

/******/     __webpack_require__.oldE = __webpack_require__.e;
/******/     __webpack_require__.e = function newRequireEnsure (chunkId, options) {
/******/                         return __webpack_require__.oldE(chunkId, options).then(function () {}, function (err) {
/******/                             console.error(err);
/******/                             var type;
/******/                             if (/.*.css??/.test(err.request)) {
/******/                                 type = "LINK";
/******/                             } else if (/.*.js??.*/.test(err.request)) {
/******/                                 type = "SCRIPT";
/******/                             }
/******/                             if (options === undefined) {
/******/                                 options = {
/******/                                     LINK: 0,
/******/                                     SCRIPT: 0
/******/                                 };
/******/                             }
/******/                             options[type]++;
/******/                             // 最小值為1
/******/                             if (options[type] <= 2) {
/******/                                 return newRequireEnsure(chunkId, options);
/******/                             }
/******/                         })
/******/                     }
重試規(guī)則

我們項(xiàng)目中,前端部署的架構(gòu)為將前端項(xiàng)目文件發(fā)布到自己的靜態(tài)資源服務(wù)器,CDN再來(lái)進(jìn)行回源請(qǐng)求文件。

URL僅為域名不同,路徑相同。

因此,我們的重試規(guī)則為 加上reloadAssets=1參數(shù),用于標(biāo)識(shí)是第幾次重試。

第二次重試時(shí),將CDN域名替換為當(dāng)前域名。

因?yàn)镃DN域名也會(huì)有不穩(wěn)定的時(shí)候,將CDN域名替換為當(dāng)前訪問(wèn)的域名,成功率會(huì)高些。

因?yàn)椴煌瑯I(yè)務(wù)的CDN資源替換為主站資源路徑未必相同。因此都支持自定義規(guī)則。

測(cè)試域名應(yīng)用

對(duì)于測(cè)試環(huán)境,我們一般會(huì)啟用一個(gè)測(cè)試域名用于訪問(wèn)。

此時(shí),增量文件尚未發(fā)布到CDN,導(dǎo)致訪問(wèn)測(cè)試域名時(shí),增量文件請(qǐng)求不到,而為此提前將增量文件發(fā)布到線上,則比較麻煩。

因此,我們的自定義規(guī)則內(nèi),會(huì)添加是否為測(cè)試環(huán)境的判斷,如果為測(cè)試環(huán)境,第一次重試的時(shí)候就直接替換為當(dāng)前的測(cè)試域名進(jìn)行訪問(wèn)。

以此達(dá)到同一套代碼適配不同域名。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102102.html

相關(guān)文章

  • 淺析前端上傳

    摘要:項(xiàng)目上也用到很多上傳文件的地方,七牛云,阿里云,訊飛上傳都接觸過(guò),所以在這里做一個(gè)記錄,總結(jié)一下前端上傳的幾種方式。類(lèi)型的文件名七牛云上傳淺析是一個(gè)基于七牛開(kāi)發(fā)的前端。 showImg(https://segmentfault.com/img/bVbvibu?w=1920&h=1080); 圖片,音頻,視頻等等這幾種常見(jiàn)的資源類(lèi)型,如果需要從前端上傳到服務(wù)端,有幾種方式呢?不妨回顧一下...

    terro 評(píng)論0 收藏0
  • 防雪崩利器:熔斷器 Hystrix 的原理與使用

    摘要:前言分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況這種現(xiàn)象被稱(chēng)為服務(wù)雪崩效應(yīng)為了應(yīng)對(duì)服務(wù)雪崩一種常見(jiàn)的做法是手動(dòng)服務(wù)降級(jí)而的出現(xiàn)給我們提供了另一種選擇服務(wù)雪崩效應(yīng)的定義服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的 前言 分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況, 這種現(xiàn)象被稱(chēng)為服務(wù)雪崩效應(yīng). 為了應(yīng)對(duì)服務(wù)雪崩, 一種常見(jiàn)的做法是手動(dòng)服...

    jayzou 評(píng)論0 收藏0
  • 防雪崩利器:熔斷器 Hystrix 的原理與使用

    摘要:前言分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況這種現(xiàn)象被稱(chēng)為服務(wù)雪崩效應(yīng)為了應(yīng)對(duì)服務(wù)雪崩一種常見(jiàn)的做法是手動(dòng)服務(wù)降級(jí)而的出現(xiàn)給我們提供了另一種選擇服務(wù)雪崩效應(yīng)的定義服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的 前言 分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況, 這種現(xiàn)象被稱(chēng)為服務(wù)雪崩效應(yīng). 為了應(yīng)對(duì)服務(wù)雪崩, 一種常見(jiàn)的做法是手動(dòng)服...

    JessYanCoding 評(píng)論0 收藏0
  • XXL-JOB v1.9.1,分布式任務(wù)調(diào)度平臺(tái)

    摘要:版本特性國(guó)際化調(diào)度中心實(shí)現(xiàn)國(guó)際化,支持中文英文兩種語(yǔ)言,默認(rèn)為中文。調(diào)度中心提供觸發(fā)任務(wù)單次執(zhí)行的服務(wù),可根據(jù)業(yè)務(wù)事件靈活觸發(fā)。 版本 V1.9.1 特性 1、國(guó)際化:調(diào)度中心實(shí)現(xiàn)國(guó)際化,支持中文、英文兩種語(yǔ)言,默認(rèn)為中文。 2、調(diào)度報(bào)表新增運(yùn)行中中狀態(tài)項(xiàng); 3、調(diào)度報(bào)表優(yōu)化,報(bào)表SQL調(diào)優(yōu)并且新增LocalCache緩存(緩存時(shí)間60s),提高大數(shù)據(jù)量下報(bào)表加載速度; 4、修復(fù)打包...

    沈建明 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<