• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    JavaScript中的錯誤隔離

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:31:35
    文檔

    JavaScript中的錯誤隔離

    JavaScript中的錯誤隔離:接口請求失敗、接口中部分?jǐn)?shù)據(jù)缺失、運(yùn)營數(shù)據(jù)不符合預(yù)期… 當(dāng)我們的應(yīng)用發(fā)布上線后,就開始面臨這些風(fēng)險。 而一旦這些問題導(dǎo)致了 JavaScript 報錯(如空指針異常),并且沒有被有效地隔離,就有可能引發(fā)頁面的白屏、無法交互等線上問題。 在雙 11 準(zhǔn)備期間
    推薦度:
    導(dǎo)讀JavaScript中的錯誤隔離:接口請求失敗、接口中部分?jǐn)?shù)據(jù)缺失、運(yùn)營數(shù)據(jù)不符合預(yù)期… 當(dāng)我們的應(yīng)用發(fā)布上線后,就開始面臨這些風(fēng)險。 而一旦這些問題導(dǎo)致了 JavaScript 報錯(如空指針異常),并且沒有被有效地隔離,就有可能引發(fā)頁面的白屏、無法交互等線上問題。 在雙 11 準(zhǔn)備期間

    接口請求失敗、接口中部分?jǐn)?shù)據(jù)缺失、運(yùn)營數(shù)據(jù)不符合預(yù)期… 當(dāng)我們的應(yīng)用發(fā)布上線后,就開始面臨這些風(fēng)險。

      而一旦這些問題導(dǎo)致了 JavaScript 報錯(如空指針異常),并且沒有被有效地隔離,就有可能引發(fā)頁面的白屏、無法交互等線上問題。

      在雙 11 準(zhǔn)備期間,我們收集了過往一年前端相關(guān)的線上問題,在收集的 21 個案例中,竟有一半的問題都與「數(shù)據(jù)異常觸發(fā)頁面顯示異常」這個原因有些相關(guān)。

      如何將錯誤的影響隔離在一定范圍內(nèi),顯得尤為重要。

      這篇文章就和大家一起來聊一聊我們嘗試過的一些方案,及遇到的問題。

      從空指針異常說起

      數(shù)據(jù)引發(fā)的最常見的問題就是空指針異常。

      var result = a.b.c.d;

      這樣的代碼如同地雷,一旦 a 是一個動態(tài)數(shù)據(jù),那么問題一觸即發(fā)。

      封裝一個 get 的方法來取值,當(dāng)數(shù)據(jù)不存在時,返回 undefined ,可以快速避免此類問題。 

     var result = get(a, 'b.c.d'); 
     但如同我們期望大家在取值前,都先做判斷一樣,并不能保證所有人都這么用了,用不用全靠自覺。
    if (a && a.b && a.b.c) {
     var result = a.b.c.d;
    }

     所以,有了以下的一些方案:


      異步數(shù)據(jù)校驗(yàn)

      對異步數(shù)據(jù)校驗(yàn)的想法是,在數(shù)據(jù)獲取后、使用前,先做一遍schema校驗(yàn),檢測重要數(shù)據(jù)缺失、類型不對等異常情況。

      與此方案對應(yīng)的,我們在 fetch 的基礎(chǔ)上封裝了 fetch-checker 注1 組件。

      fetch-checker 強(qiáng)制要求用戶在請求數(shù)據(jù)的同時,提供數(shù)據(jù)對應(yīng)的 schema:

    let schema = {
     "rule": {
     "type": "string",
     },
     "banner": {
     "type": "object",
     "required": true,
     "default": {
     "url": "https://item.taobao.com/item.htm?id=527331762117"
     }
     }
    };

     這份 schema 需要描述:


      每個字段的類型

      字段是否 required

      當(dāng) required 的字段缺失時,是否需要打底數(shù)據(jù)

      fetch-checker 在拿到數(shù)據(jù)后,先做一層校驗(yàn),如有需要的話,補(bǔ)上缺失的數(shù)據(jù),然后再返回給調(diào)用者。這樣,使用者拿到的數(shù)據(jù)就一定是符合預(yù)期的。

      然而,這個方案面臨的挑戰(zhàn)是:

      如何確保調(diào)用者提供了完整的 schema 描述。不想寫 schema,完全可以提供一個粗略的 schema 描述,來通過校驗(yàn)。

      schema 如何精簡。即不會對 bundle 大小造成太大影響,又能滿足校驗(yàn)的功能。

      代碼編譯

      受 babel 的啟發(fā),這個方案是對存在 NPE 隱患的代碼,在編譯階段,將其轉(zhuǎn)換成等價的安全代碼。如下所示:

    var a = {};
    // input
    var result = a.b.c;
    // output
    var result = (_object2 = (_object3 = a) == null ? null : _object3.b) == null ? null : _object2.c;

    當(dāng) a 為空對象時,執(zhí)行編譯后的代碼會返回 null ,從而避免因?yàn)榇a拋錯,阻斷后續(xù)進(jìn)程。


      在 babel-plugin-safe-member-expression 注2 這個 Babel 插件中,我們做了上述的嘗試。目前,cake項(xiàng)目中,已經(jīng)可以通過 enableSafeMemberExpression 這個配置,選擇性的啟用該功能。

      這個方案相比來說接入成本較低,開發(fā)者無需對現(xiàn)有的代碼做出調(diào)整,但同樣存在挑戰(zhàn):

      開發(fā)階段問題不易暴露,明明應(yīng)該報錯的場景,卻沒有任何反饋。理想的狀態(tài)是:開發(fā)調(diào)試階段盡可能多的暴露問題,線上則盡可能的減少報錯。

      隱患的代碼如何界定。目前所有的 a.b 的調(diào)用方式都會按上述方案進(jìn)行編譯,雖然測試過程中還沒有發(fā)現(xiàn)問題,但只處理有隱患的代碼才更安全。

      靜態(tài)校驗(yàn)

      以 flow 為代表的靜態(tài)校驗(yàn)工具,可以在一定程度上檢測出 NPE 隱患。
    type res = {
     data ?: Object
    }
    let name = res.data.name;
    // property `name`. Propery cannot be accessed on possibly undefined value

    如上面的代碼所描述的,使用者需要首先理清自己的數(shù)據(jù)是否允許為空值,當(dāng) data 被允許為空值時,通過 flow 檢測, data.name 類似這樣調(diào)用便會被檢測出錯誤。


      然而,如何來推進(jìn)所有的業(yè)務(wù)都接入靜態(tài)校驗(yàn),接入后,又如何保證開發(fā)者描述了所有的類型,卻同樣是個難點(diǎn)。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    JavaScript中的錯誤隔離

    JavaScript中的錯誤隔離:接口請求失敗、接口中部分?jǐn)?shù)據(jù)缺失、運(yùn)營數(shù)據(jù)不符合預(yù)期… 當(dāng)我們的應(yīng)用發(fā)布上線后,就開始面臨這些風(fēng)險。 而一旦這些問題導(dǎo)致了 JavaScript 報錯(如空指針異常),并且沒有被有效地隔離,就有可能引發(fā)頁面的白屏、無法交互等線上問題。 在雙 11 準(zhǔn)備期間
    推薦度:
    標(biāo)簽: 失敗 里的 錯誤
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品人妻V?出轨中文字幕| 丁香色婷婷国产精品视频| 国产精品免费久久| MM1313亚洲精品无码| 老司机67194精品线观看| 97国产精品视频| 亚洲第一精品福利| 久久se这里只有精品| 精品久久一区二区| 精品国产热久久久福利| 亚洲日韩精品射精日| 99精品国产在热久久无毒不卡| 91亚洲精品自在在线观看| 欧美成人精品欧美一级乱黄一区二区精品在线 | 无码精品蜜桃一区二区三区WW| 中文字幕av日韩精品一区二区| 99国产欧美久久久精品蜜芽| 中国国产精品| 麻豆精品| 精品久久久久久无码免费| 亚洲国产成人久久精品动漫| 国产日韩一区在线精品欧美玲| 久久精品国产福利国产琪琪| 亚洲av日韩精品久久久久久a| 韩国精品欧美一区二区三区| 国产精品后入内射日本在线观看| 91大神精品全国在线观看| 国产精品视频一区二区三区无码| 久久亚洲私人国产精品| 亚洲国产精品无码久久久秋霞2 | 久久国产精品国语对白| 国产精品自在线拍国产电影| 蜜臀久久99精品久久久久久小说| 久久亚洲中文字幕精品一区| 久久97久久97精品免视看秋霞| 国产精品无码无卡无需播放器| 国产成人精品免费大全| 国产精品女同一区二区久久| 国产亚洲精品线观看动态图| 久久精品无码免费不卡| 欧美精品一区二区久久|