av人人干_女狠狠噜天天噜日日噜_国产精品一区二区免费_亚洲国语自产一区第二页_免费av观看_已婚少妇露脸日出白浆_国产精品探花视频_久久国产精品2020免费_国产精品好好热av在线观看_亚洲另类春色校园小说

網站建設知識

我們將想法與焦點與您一起共享

當前位置:深圳網站建設 > 網站建設知識> 深圳網站建設|聊一聊 JavaScript 中的錯誤隔離

深圳網站建設|聊一聊 JavaScript 中的錯誤隔離

2017/6/6 8:41:13 獨占網絡 網站建設知識
接口請求失敗、接口中部分數據缺失、運營數據不符合預期… 當我們的應用發布上線后,就開始面臨這些風險。

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

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

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

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

從空指針異常說起

數據引發的常見的問題就是空指針異常。

JavaScript

var result = a.b.c.d; 
這樣的代碼如同地雷,一旦 a 是一個動態數據,那么問題一觸即發。

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

JavaScript

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

JavaScript

if (a && a.b && a.b.c) {
var result = a.b.c.d;
}
 
所以,有了以下的一些方案:

異步數據校驗

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

與此方案對應的,我們在 fetch 的基礎上封裝了 fetch-checker注1 組件。

fetch-checker 強制要求用戶在請求數據的同時,提供數據對應的 schema:

JavaScript

let schema = {
    "rule": {
      "type": "string",
    },
    "banner": {
      "type": "object",
      "required": true,
      "default": {
        "url": "http://www.ykfic.cn"
      }
    }
}; 
這份 schema 需要描述:

每個字段的類型
字段是否 required
當 required 的字段缺失時,是否需要打底數據
fetch-checker 在拿到數據后,先做一層校驗,如有需要的話,補上缺失的數據,然后再返回給調用者。這樣,使用者拿到的數據就一定是符合預期的。

然而,這個方案面臨的挑戰是:

如何確保調用者提供了完整的 schema 描述。不想寫 schema,完全可以提供一個粗略的 schema 描述,來通過校驗。
schema 如何精簡。即不會對 bundle 大小造成太大影響,又能滿足校驗的功能。
代碼編譯

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

JavaScript

var a = {};

// input
var result = a.b.c;

// output
var result = (_object2 = (_object3 = a) == null ? null : _object3.b) == null ? null : _object2.c; 
當 a 為空對象時,執行編譯后的代碼會返回 null,從而避免因為代碼拋錯,阻斷后續進程。

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

這個方案相比來說接入成本較低,開發者無需對現有的代碼做出調整,但同樣存在挑戰:

開發階段問題不易暴露,明明應該報錯的場景,卻沒有任何反饋。理想的狀態是:開發調試階段盡可能多的暴露問題,線上則盡可能的減少報錯。
隱患的代碼如何界定。目前所有的 a.b 的調用方式都會按上述方案進行編譯,雖然測試過程中還沒有發現問題,但只處理有隱患的代碼才更安全。
靜態校驗

以 flow 為代表的靜態校驗工具,可以在一定程度上檢測出 NPE 隱患。

JavaScript

type res = {
data ?: Object
}

let name = res.data.name;
// property `name`. Propery cannot be accessed on possibly undefined value 
如上面的代碼所描述的,使用者需要先理清自己的數據是否允許為空值,當 data 被允許為空值時,通過 flow 檢測,data.name 類似這樣調用便會被檢測出錯誤。

然而,如何來推進所有的業務都接入靜態校驗,接入后,又如何保證開發者描述了所有的類型,卻同樣是個難點。

小結

總結以上幾種方案,各有優缺點,都還不能算做理想的解決方案。

方案名稱 優勢 缺點
提前判斷 實行簡單 全靠自覺
異步數據校驗 可確保所使用的數據是滿足預期的 schema 描述成本高
代碼編譯 接入成本低,易執行 開發階段不易暴露問題
靜態校驗 對現有代碼邏輯侵入少 落地成本高
對于業務來說,愿意使用和有效的方案一定是:

能將線上問題隔離在一個小范圍內,同時不影響開發調試階段的問題暴露
能提前暴露出隱患
接入成本低,不需要大量修改現有業務代碼

關于空指針異常和錯誤隔離,機智的你又有哪些方案,一起來討論吧。

    深圳網站建設www.ykfic.cn

始終專注高端網站建設服務 網站建設案例服務方案聯系

聯系我們

135-3000-5572
151-1257-9390

地址:深圳市龍崗區橫崗街道力嘉創意文化產業園338

郵箱:chenmh@sz886.com

我們的優勢

12年建站服務經驗自主開發后臺CMS開發項目不外包無隱形收費

服務198家上市企業服務行業龍頭超過70家 營銷型網站建設完備的項目流程管理體系網頁設計與網站開發技術并重

關于獨占網絡

十多年來,憑借對設計的深刻理解,對互聯網營銷趨勢的敏銳洞察,獨占網絡不斷修正服務導向,完善創作品格,始終注重專業探索,為所有合作企業機構全力以赴,確保網站的視覺體驗與營銷轉化能力。

我們是一群對互聯網抱有執著信念的技術控。從2012年到現在,公司從未建過強大的營銷團隊,卻憑著作品與服務不斷保持增長,做到了"桃李不言,下自成蹊。" 我們堅信:每個客戶都是一條渠道,每個案例都是一個廣告,為企業插上翅膀,助力企業轉型升級,我們已做好準備。

專業團隊為您提供深圳網站建設、深圳網站制作、深圳營銷型網站建設、外貿網站建設等服務,深圳建網站就找獨占網絡 | 12年專注網站建設

深圳市獨占網絡科技有限公司 |備案號:粵ICP備15007128| Copyright 2025,ALL Rights Reserved www.ykfic.cn | Copyright 2025版權所有
Hi,Are you ready? 如果您有意向
請于我們取得聯系。

有一個互聯網項目想和我們談談嗎?
您可以填寫右邊的表格,讓我們了解您的項目需求,這是一個良好的開始,我們將會盡快與你取得聯系。當然也歡迎您給我們寫信或是打電話,讓我們聽到你的聲音!

獨占-整合互聯網營銷

地址:深圳市龍崗區橫崗地鐵A出口力嘉創意文化產業園338
大客戶專線:深圳 13530005572
售前QQ:1447567909
E-mail: sales@sz886.cn

合作意向表
您希望我們為您提供什么服務?
主站蜘蛛池模板: 新安县| 辽宁省| 新龙县| 宝兴县| 嘉善县| 桐梓县| 松溪县| 东乡| 南京市| 天水市| 唐山市| 巴东县| 台东市| 堆龙德庆县| 溧阳市| 蒲江县| 库伦旗| 铅山县| 敖汉旗| 涞源县| 陈巴尔虎旗| 册亨县| 彰化县| 新晃| 璧山县| 南京市| 喀什市| 那坡县| 新田县| 嘉义市| 黄浦区| 高陵县| 潼南县| 老河口市| 桐庐县| 绿春县| 阳西县| 漳平市| 银川市| 舒城县| 丹江口市|