admin 发表于 2019-5-27 18:44:29

可能是最全一篇的前端异常监控总结

<div class="jsx-1859093252 bodytext" style="box-sizing: inherit; animation-name: bodytextEntry-jsx-1859093252; animation-duration: 1s; color: rgb(0, 0, 0); font-family: &quot;Open Sans&quot;, sans-serif; font-size: medium;"><blockquote style="box-sizing: inherit;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">前言:这几天把公司的项目清理了一下,对一些细节进行了优化,然后翻到了之前做的时候留下了一点笔记,顺手整理一下就诞生了这篇总结~</p></blockquote><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">异常捕获</h2><h3 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.3; letter-spacing: -0.03em; font-size: 1.35em;">try-catch</h3><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">try</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
error    <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 未定义变量</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">catch</span><span class="token punctuation" style="box-sizing: inherit;">(</span>e<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道错误了'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span>e<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">try-catch 处理异常的能力有限,只能捕获捉到运行时非异步错误,对于语法错误和异步错误就显得无能为力,捕捉不到。</p><h3 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.3; letter-spacing: -0.03em; font-size: 1.35em;">window.onerror</h3><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;">window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">onerror</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道异步错误了'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
    msg<span class="token punctuation" style="box-sizing: inherit;">,</span>url<span class="token punctuation" style="box-sizing: inherit;">,</span>row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">setTimeout</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
error<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span></code></pre></div><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">window.onerror 捕获异常能力比 try-catch 稍微强点,无论是异步还是非异步错误,onerror 都能捕获到运行时错误。</p><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">然而 window.onerror 对于语法错误还是无能为力,所以我们在写代码的时候要尽可能避免语法错误的,不过一般这样的错误会使得整个页面崩溃,还是比较容易能够察觉到的。</p><h4 style="box-sizing: inherit;">onerror 与 try-catch 区别</h4><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">在实际的使用过程中,onerror 主要是来捕获预料之外的错误,而 try-catch 则是用来在可预见情况下监控特定的错误,两者结合使用更加高效。</p><h4 style="box-sizing: inherit;">window.onerror 细节</h4><ul style="box-sizing: inherit; margin-bottom: 1.5em; padding-left: 1.5em; list-style: circle;"><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">onerror 函数只有在返回 true 的时候,异常才不会向上抛出,否则即使是知道异常的发生控制台还是会显示 Uncaught Error: xxxxx。</p></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">对于 onerror 这种全局捕获,最好写在所有 JS 脚本的前面,因为你无法保证你写的代码是否出错,如果写在后面,一旦发生错误的话是不会被 onerror 捕获到的。</p></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">onerror 是无法捕获到网络异常的错误(静态资源加载可以用 DOM2级事件监听)</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token operator" style="box-sizing: inherit;">&lt;</span>script<span class="token operator" style="box-sizing: inherit;">&gt;</span>
window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">onerror</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道异步错误了'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
      msg<span class="token punctuation" style="box-sizing: inherit;">,</span>url<span class="token punctuation" style="box-sizing: inherit;">,</span>row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error
    <span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token operator" style="box-sizing: inherit;">&lt;</span><span class="token operator" style="box-sizing: inherit;">/</span>script<span class="token operator" style="box-sizing: inherit;">&gt;</span>
<span class="token operator" style="box-sizing: inherit;">&lt;</span>img src<span class="token operator" style="box-sizing: inherit;">=</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">"./404.png"</span><span class="token operator" style="box-sizing: inherit;">&gt;</span></code></pre></div></li></ul><h3 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.3; letter-spacing: -0.03em; font-size: 1.35em;">addEventListener(‘error’)</h3><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">通过addEventListener(‘error’)监控静态资源加载,由于网络请求异常不会事件冒泡,因此必须在捕获阶段将其捕捉到才行,而且无法判断错误状态码,所以还需要配合服务端日志才能进行排查分析。</p><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">缺点:仍然无法捕获异常时网络请求的状态码</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token operator" style="box-sizing: inherit;">&lt;</span>script<span class="token operator" style="box-sizing: inherit;">&gt;</span>
window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">addEventListener</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'error'</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道 404 错误了'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span>
    msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error
<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token operator" style="box-sizing: inherit;">&lt;</span><span class="token operator" style="box-sizing: inherit;">/</span>script<span class="token operator" style="box-sizing: inherit;">&gt;</span>
<span class="token operator" style="box-sizing: inherit;">&lt;</span>img src<span class="token operator" style="box-sizing: inherit;">=</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">"./404.png"</span> alt<span class="token operator" style="box-sizing: inherit;">=</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">""</span><span class="token operator" style="box-sizing: inherit;">&gt;</span></code></pre></div><h4 style="box-sizing: inherit;">window.addEventListener(‘error’)与window.onerror的区别</h4><ol style="box-sizing: inherit;"><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;">前者能够捕获到资源加载错误,后者不能。</li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;">都能捕获js运行时错误,捕获到的错误参数不同。前者参数为一个event对象;后者为 msg, url, lineNo, columnNo, error一系列参数。event对象中都含有后者参数的信息。</li></ol><h4 style="box-sizing: inherit;">ajax 封装</h4><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">所有http请求都是基于xmlHttpRequest或者fetch封装的。所以要捕获全局的接口错误,方法就是封装xmlHttpRequest或者fetch</p><ul style="box-sizing: inherit; margin-bottom: 1.5em; padding-left: 1.5em; list-style: circle;"><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">封装xmlHttpRequest:</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token operator" style="box-sizing: inherit;">!</span>window<span class="token punctuation" style="box-sizing: inherit;">.</span>XMLHttpRequest<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> xmlhttp <span class="token operator" style="box-sizing: inherit;">=</span> window<span class="token punctuation" style="box-sizing: inherit;">.</span>XMLHttpRequest<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> _oldSend <span class="token operator" style="box-sizing: inherit;">=</span> xmlhttp<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">.</span>send<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> <span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_handleEvent</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>event<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>event <span class="token operator" style="box-sizing: inherit;">&amp;&amp;</span> event<span class="token punctuation" style="box-sizing: inherit;">.</span>currentTarget <span class="token operator" style="box-sizing: inherit;">&amp;&amp;</span> event<span class="token punctuation" style="box-sizing: inherit;">.</span>currentTarget<span class="token punctuation" style="box-sizing: inherit;">.</span>status <span class="token operator" style="box-sizing: inherit;">!==</span> <span class="token number" style="box-sizing: inherit; color: rgb(174, 129, 255);">200</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
          <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 自定义错误上报 }</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>
xmlhttp<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">send</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'addEventListener'</span><span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'addEventListener'</span><span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'error'</span><span class="token punctuation" style="box-sizing: inherit;">,</span> _handleEvent<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'addEventListener'</span><span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'load'</span><span class="token punctuation" style="box-sizing: inherit;">,</span> _handleEvent<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'addEventListener'</span><span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'abort'</span><span class="token punctuation" style="box-sizing: inherit;">,</span> _handleEvent<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">else</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> _oldStateChange <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'onreadystatechange'</span><span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'onreadystatechange'</span><span class="token punctuation" style="box-sizing: inherit;">]</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>event<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
            <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">.</span>readyState <span class="token operator" style="box-sizing: inherit;">===</span> <span class="token number" style="box-sizing: inherit; color: rgb(174, 129, 255);">4</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
                <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_handleEvent</span><span class="token punctuation" style="box-sizing: inherit;">(</span>event<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
            <span class="token punctuation" style="box-sizing: inherit;">}</span>
            _oldStateChange <span class="token operator" style="box-sizing: inherit;">&amp;&amp;</span> _oldStateChange<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">apply</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">,</span> arguments<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> _oldSend<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">apply</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">,</span> arguments<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">封装fetch:</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token operator" style="box-sizing: inherit;">!</span>window<span class="token punctuation" style="box-sizing: inherit;">.</span>fetch<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">let</span> _oldFetch <span class="token operator" style="box-sizing: inherit;">=</span> window<span class="token punctuation" style="box-sizing: inherit;">.</span>fetch<span class="token punctuation" style="box-sizing: inherit;">;</span>
    window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">fetch</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> _oldFetch<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">apply</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">,</span> arguments<span class="token punctuation" style="box-sizing: inherit;">)</span>
      <span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">then</span><span class="token punctuation" style="box-sizing: inherit;">(</span>res <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
            <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token operator" style="box-sizing: inherit;">!</span>res<span class="token punctuation" style="box-sizing: inherit;">.</span>ok<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span> <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// True if status is HTTP 2xx</span>
                <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 上报错误</span>
            <span class="token punctuation" style="box-sizing: inherit;">}</span>
            <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> res<span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
      <span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">catch</span><span class="token punctuation" style="box-sizing: inherit;">(</span>error <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
            <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 上报错误</span>
            <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">throw</span> error<span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div></li></ul><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">Promise 错误</h2><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">通过 Promise 可以帮助我们解决异步回调地狱的问题,但是一旦 Promise 实例抛出异常而你没有用 catch 去捕获的话,onerror 或 try-catch 也无能为力,无法捕捉到错误。</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;">window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">addEventListener</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'error'</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我感知不到 promise 错误'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span>
    msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error
<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
Promise<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">reject</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'promise error'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">new</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">Promise</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span>resolve<span class="token punctuation" style="box-sizing: inherit;">,</span> reject<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">reject</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'promise error'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">new</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">Promise</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span>resolve<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">resolve</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">then</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">throw</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'promise error'</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span></code></pre></div><ol style="box-sizing: inherit;"><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">可以添加一个 Promise 全局异常捕获事件 unhandledrejection:</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;">window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">addEventListener</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">"unhandledrejection"</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span><span class="token punctuation" style="box-sizing: inherit;">(</span>e<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
e<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">preventDefault</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道 promise 的错误了'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span>e<span class="token punctuation" style="box-sizing: inherit;">.</span>reason<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
Promise<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">reject</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'promise error'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">new</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">Promise</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span>resolve<span class="token punctuation" style="box-sizing: inherit;">,</span> reject<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">reject</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'promise error'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">new</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">Promise</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span>resolve<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">resolve</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">then</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">throw</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'promise error'</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span></code></pre></div></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">借助 try-catch封装</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 如果浏览支持Promise,捕获promise里面then的报错,因为promise里面的错误onerror和try-catch都无法捕获</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>Promise <span class="token operator" style="box-sizing: inherit;">&amp;&amp;</span> Promise<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">.</span>then<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> promiseThen <span class="token operator" style="box-sizing: inherit;">=</span> Promise<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">.</span>then<span class="token punctuation" style="box-sizing: inherit;">;</span>

    Promise<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">then</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span><span class="token punctuation" style="box-sizing: inherit;">(</span>resolve<span class="token punctuation" style="box-sizing: inherit;">,</span> reject<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> promiseThen<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">call</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_wrapPromiseFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>resolve<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">,</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_wrapPromiseFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>reject<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>

<span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">/**
* 输入一个函数,将函数内代码包裹进try-catch执行,then的resolve、reject和普通函数不一样
*
* @param {any} fn
* @returns 一个新的函数
*/</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_wrapPromiseFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>fn<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>

    <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 如果fn是个函数,则直接放到try-catch中运行,否则要将类的方法包裹起来,promise中的fn要返回null,不能返回空函数</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">typeof</span> fn <span class="token operator" style="box-sizing: inherit;">!==</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'function'</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">null</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">try</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
            <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> fn<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">apply</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">this</span><span class="token punctuation" style="box-sizing: inherit;">,</span> arguments<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token punctuation" style="box-sizing: inherit;">}</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">catch</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">e</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
            <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_errorProcess</span><span class="token punctuation" style="box-sizing: inherit;">(</span>e<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
            <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">throw</span> e<span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token punctuation" style="box-sizing: inherit;">}</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div></li></ol><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">iframe 错误</h2><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">父窗口直接使用 window.onerror 是无法直接捕获,如果你想要捕获 iframe 的异常的话,有分好几种情况。</p><ul style="box-sizing: inherit; margin-bottom: 1.5em; padding-left: 1.5em; list-style: circle;"><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">如果你的 iframe 页面和你的主站是同域名的话,直接给 iframe 添加 onerror 事件即可。</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token operator" style="box-sizing: inherit;">&lt;</span>iframe src<span class="token operator" style="box-sizing: inherit;">=</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">"./iframe.html"</span> frameborder<span class="token operator" style="box-sizing: inherit;">=</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">"0"</span><span class="token operator" style="box-sizing: inherit;">&gt;</span><span class="token operator" style="box-sizing: inherit;">&lt;</span><span class="token operator" style="box-sizing: inherit;">/</span>iframe<span class="token operator" style="box-sizing: inherit;">&gt;</span>
<span class="token operator" style="box-sizing: inherit;">&lt;</span>script<span class="token operator" style="box-sizing: inherit;">&gt;</span>
window<span class="token punctuation" style="box-sizing: inherit;">.</span>frames<span class="token punctuation" style="box-sizing: inherit;">[</span><span class="token number" style="box-sizing: inherit; color: rgb(174, 129, 255);">0</span><span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">onerror</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道 iframe 的错误了,也知道错误信息'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
      msg<span class="token punctuation" style="box-sizing: inherit;">,</span>url<span class="token punctuation" style="box-sizing: inherit;">,</span>row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error
    <span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token operator" style="box-sizing: inherit;">&lt;</span><span class="token operator" style="box-sizing: inherit;">/</span>script<span class="token operator" style="box-sizing: inherit;">&gt;</span></code></pre></div></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">如果你嵌入的 iframe 页面和你的主站不是同个域名的,但是 iframe 内容不属于第三方,是你可以控制的,那么可以通过与 iframe 通信的方式将异常信息抛给主站接收。与 iframe 通信的方式有很多,常用的如:postMessage,hash 或者 name 字段跨域等等</p></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">如果是非同域且网站不受自己控制的话,除了通过控制台看到详细的错误信息外,没办法捕获,这是出于安全性的考虑,你引入了一个百度首页,人家页面报出的错误凭啥让你去监控呢,这会引出很多安全性的问题。</p></li></ul><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">ES6 Class</h2><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">我们是没办法把构造函数A直接装入try-catch中运行的,因为需要通过关键字new进行实例化,并创建新的作用域。</p><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">JavaScript中函数有个特殊的属性prototype,当函数作为构造函数是,prototype中的属性就成了实例化后的属性方法,而且这一属性对class同样生效。那么我们可以对React中class的prototype这个特殊属性的内容进行处理,对Component中的方法函数进行封装。</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">/**
* 封装React方法的错误处理,改成使用入参的prototype中是否有render生命周期函数来判断
* @param{object} Component 传入组件
* @return {object} 返回包裹后的组件
*/</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_defineReact</span><span class="token punctuation" style="box-sizing: inherit;">(</span>Component<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> proto <span class="token operator" style="box-sizing: inherit;">=</span> Component<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> key<span class="token punctuation" style="box-sizing: inherit;">;</span>

    <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 封装本身constructor中的构造方法,React组件编译为ES5后是一个构造函数,ES6下面为class</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_isTrueFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>Component<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      Component <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">wrapFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>Component<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> componnetKeys <span class="token operator" style="box-sizing: inherit;">=</span> Object<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">getOwnPropertyNames</span><span class="token punctuation" style="box-sizing: inherit;">(</span>proto<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>

    <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 支持ES6类的属性方法错误捕获</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">for</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> i <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token number" style="box-sizing: inherit; color: rgb(174, 129, 255);">0</span><span class="token punctuation" style="box-sizing: inherit;">,</span> len <span class="token operator" style="box-sizing: inherit;">=</span> componnetKeys<span class="token punctuation" style="box-sizing: inherit;">.</span>length<span class="token punctuation" style="box-sizing: inherit;">;</span> i <span class="token operator" style="box-sizing: inherit;">&lt;</span> len<span class="token punctuation" style="box-sizing: inherit;">;</span> i<span class="token operator" style="box-sizing: inherit;">++</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      key <span class="token operator" style="box-sizing: inherit;">=</span> componnetKeys<span class="token punctuation" style="box-sizing: inherit;">[</span>i<span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      proto<span class="token punctuation" style="box-sizing: inherit;">[</span>key<span class="token punctuation" style="box-sizing: inherit;">]</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">wrapFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>proto<span class="token punctuation" style="box-sizing: inherit;">[</span>key<span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>

    <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 支持ES5下的属性方法错误捕获</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">for</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>key <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">in</span> proto<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">typeof</span> proto<span class="token punctuation" style="box-sizing: inherit;">[</span>key<span class="token punctuation" style="box-sizing: inherit;">]</span> <span class="token operator" style="box-sizing: inherit;">===</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'function'</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
            proto<span class="token punctuation" style="box-sizing: inherit;">[</span>key<span class="token punctuation" style="box-sizing: inherit;">]</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">wrapFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>proto<span class="token punctuation" style="box-sizing: inherit;">[</span>key<span class="token punctuation" style="box-sizing: inherit;">]</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      <span class="token punctuation" style="box-sizing: inherit;">}</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> Component<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>

<span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">/**
* 判断是否为真实的函数,而不是class
* @param{Function} fn
* @return {Boolean}   
*/</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_isTrueFunction</span><span class="token punctuation" style="box-sizing: inherit;">(</span>fn<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> isTrueFunction <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">false</span><span class="token punctuation" style="box-sizing: inherit;">;</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">try</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      isTrueFunction <span class="token operator" style="box-sizing: inherit;">=</span> fn<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">.</span>constructor<span class="token punctuation" style="box-sizing: inherit;">.</span>arguments <span class="token operator" style="box-sizing: inherit;">===</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">null</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">catch</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">e</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      isTrueFunction <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">false</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>

    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">for</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> key <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">in</span> fn<span class="token punctuation" style="box-sizing: inherit;">.</span>prototype<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">false</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> isTrueFunction<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">这样通过实例化产生的React组件中的内部方法中的错误就可以被捕获到了。即使代码不通过babel编译为ES5,class里面的异常也可以被捕获到。</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">class</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">component</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">extends</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">React<span class="token punctuation" style="box-sizing: inherit; color: rgb(248, 248, 242);">.</span>Component</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">componentDidMount</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> a <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token punctuation" style="box-sizing: inherit;">{</span><span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
      console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span>a<span class="token punctuation" style="box-sizing: inherit;">.</span>b<span class="token punctuation" style="box-sizing: inherit;">.</span>c<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>
    <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">render</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token operator" style="box-sizing: inherit;">&lt;</span>div<span class="token operator" style="box-sizing: inherit;">&gt;</span>hello world<span class="token operator" style="box-sizing: inherit;">&lt;</span><span class="token operator" style="box-sizing: inherit;">/</span>div<span class="token operator" style="box-sizing: inherit;">&gt;</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">export</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">default</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">_defineReact</span><span class="token punctuation" style="box-sizing: inherit;">(</span>component<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span></code></pre></div><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">异常上报</h2><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">主要有两种方式:</p><ol style="box-sizing: inherit;"><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">通过 Ajax 发送数据</p></li><li style="box-sizing: inherit; margin-top: 0.7em; margin-bottom: 0.7em; margin-left: 0px; line-height: 1.5;"><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">动态创建 img 标签的形式</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">report</span><span class="token punctuation" style="box-sizing: inherit;">(</span>error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">var</span> reportUrl <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'http://xxxx/report'</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">new</span> <span class="token class-name" style="box-sizing: inherit; color: rgb(230, 219, 116);">Image</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">.</span>src <span class="token operator" style="box-sizing: inherit;">=</span> reportUrl <span class="token operator" style="box-sizing: inherit;">+</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'error='</span> <span class="token operator" style="box-sizing: inherit;">+</span> error<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div></li></ol><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">在 CDN 下的脚本都是捕获到<code class="language-text" style="box-sizing: inherit; padding: 0.1em 0.3em 0.2em; color: inherit; background: rgb(236, 235, 234); text-shadow: none; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; border-radius: 0.1em;">Script error</code>异常,如何正确捕获异常?</p><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">script 标签添加 crossOrigin 属性</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;"><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">const</span> script <span class="token operator" style="box-sizing: inherit;">=</span> document<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">createElement</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'script'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
script<span class="token punctuation" style="box-sizing: inherit;">.</span>crossOrigin <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'anonymous'</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
script<span class="token punctuation" style="box-sizing: inherit;">.</span>src <span class="token operator" style="box-sizing: inherit;">=</span> url<span class="token punctuation" style="box-sizing: inherit;">;</span>
document<span class="token punctuation" style="box-sizing: inherit;">.</span>body<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">appendChild</span><span class="token punctuation" style="box-sizing: inherit;">(</span>script<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span></code></pre></div><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">如何解决一些类库中没有提供 crossOrigin 的能力?</p><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">劫持 document.createElement,从根源上为每个动态生成的脚本添加 crossOrigin 字段:</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;">document<span class="token punctuation" style="box-sizing: inherit;">.</span>createElement <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">const</span> fn <span class="token operator" style="box-sizing: inherit;">=</span> document<span class="token punctuation" style="box-sizing: inherit;">.</span>createElement<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">bind</span><span class="token punctuation" style="box-sizing: inherit;">(</span>document<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span><span class="token punctuation" style="box-sizing: inherit;">(</span>type<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">const</span> result <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">fn</span><span class="token punctuation" style="box-sizing: inherit;">(</span>type<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span><span class="token punctuation" style="box-sizing: inherit;">(</span>type <span class="token operator" style="box-sizing: inherit;">===</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'script'</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
      result<span class="token punctuation" style="box-sizing: inherit;">.</span>crossOrigin <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'anonymous'</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
    <span class="token punctuation" style="box-sizing: inherit;">}</span>
    <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> result<span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
window<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">onerror</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>msg<span class="token punctuation" style="box-sizing: inherit;">,</span> url<span class="token punctuation" style="box-sizing: inherit;">,</span> row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'我知道错误了,也知道错误信息'</span><span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
    msg<span class="token punctuation" style="box-sizing: inherit;">,</span>url<span class="token punctuation" style="box-sizing: inherit;">,</span>row<span class="token punctuation" style="box-sizing: inherit;">,</span> col<span class="token punctuation" style="box-sizing: inherit;">,</span> error
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">return</span> <span class="token boolean" style="box-sizing: inherit; color: rgb(174, 129, 255);">true</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
$<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">ajax</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">{</span>
url<span class="token punctuation" style="box-sizing: inherit;">:</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'http://localhost:8081/data'</span><span class="token punctuation" style="box-sizing: inherit;">,</span>
dataType<span class="token punctuation" style="box-sizing: inherit;">:</span> <span class="token string" style="box-sizing: inherit; color: rgb(166, 226, 46);">'jsonp'</span><span class="token punctuation" style="box-sizing: inherit;">,</span>
success<span class="token punctuation" style="box-sizing: inherit;">:</span> <span class="token punctuation" style="box-sizing: inherit;">(</span>data<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">=&gt;</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    console<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">log</span><span class="token punctuation" style="box-sizing: inherit;">(</span>data<span class="token punctuation" style="box-sizing: inherit;">)</span><span class="token punctuation" style="box-sizing: inherit;">;</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span><span class="token punctuation" style="box-sizing: inherit;">)</span></code></pre></div><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">其他</h2><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">收集异常信息量太多,怎么办?</p><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;">如果你的网站访问量很大,假如网页的 PV 有 1kw,那么一个必然的错误发送的信息就有 1kw 条,我们可以给网站设置一个采集率:</p><div class="gatsby-highlight" data-language="javascript" style="box-sizing: inherit;"><pre class="language-javascript" style="box-sizing: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: rgb(248, 248, 242); background: rgb(39, 40, 34); text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none; overflow: auto; border-radius: 0.3em;"><code class="language-javascript" style="box-sizing: inherit; background: none; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; word-spacing: normal; word-break: normal; overflow-wrap: normal; line-height: 1.5; tab-size: 4; hyphens: none;">Reporter<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function-variable function" style="box-sizing: inherit; color: rgb(230, 219, 116);">send</span> <span class="token operator" style="box-sizing: inherit;">=</span> <span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">function</span><span class="token punctuation" style="box-sizing: inherit;">(</span>data<span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
<span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 只采集 30%</span>
<span class="token keyword" style="box-sizing: inherit; color: rgb(102, 217, 239);">if</span><span class="token punctuation" style="box-sizing: inherit;">(</span>Math<span class="token punctuation" style="box-sizing: inherit;">.</span><span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">random</span><span class="token punctuation" style="box-sizing: inherit;">(</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token operator" style="box-sizing: inherit;">&lt;</span> <span class="token number" style="box-sizing: inherit; color: rgb(174, 129, 255);">0.3</span><span class="token punctuation" style="box-sizing: inherit;">)</span> <span class="token punctuation" style="box-sizing: inherit;">{</span>
    <span class="token function" style="box-sizing: inherit; color: rgb(230, 219, 116);">send</span><span class="token punctuation" style="box-sizing: inherit;">(</span>data<span class="token punctuation" style="box-sizing: inherit;">)</span>      <span class="token comment" style="box-sizing: inherit; color: rgb(112, 128, 144);">// 上报错误信息</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span>
<span class="token punctuation" style="box-sizing: inherit;">}</span></code></pre></div><h2 style="box-sizing: inherit; margin-top: 1.5em; margin-bottom: 1em; line-height: 1.2; letter-spacing: -0.03em; font-size: 1.7em;">参考</h2><p style="box-sizing: inherit; margin-bottom: 1.5em; font-size: 1.1em; line-height: 1.6;"><a href="https://github.com/joeyguo/blog/issues/13" style="box-sizing: inherit; color: rgb(112, 148, 37); font-weight: 600;">脚本错误量极致优化-监控上报与Script error</a>&nbsp;<a href="https://jixianqianduan.com/frontend-weboptimize/2018/02/22/front-end-react-error-capture.html" style="box-sizing: inherit; color: rgb(112, 148, 37); font-weight: 600;">前端一站式异常捕获方案(全)</a>&nbsp;<a href="http://hongweipeng.com/index.php/archives/1608/" style="box-sizing: inherit; color: rgb(112, 148, 37); font-weight: 600;">前端监听资源加载错误</a></p><div><div class="blockcode"><blockquote>https://zenghongtu.com/可能是最全一篇的前端异常监控总结/</blockquote></div><br></div></div><footer style="box-sizing: inherit; color: rgb(0, 0, 0); font-family: &quot;Open Sans&quot;, sans-serif; font-size: medium;"><div class="jsx-3767557462 share" style="box-sizing: inherit; margin: 40px; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; flex-direction: row; -webkit-box-pack: center; justify-content: center; -webkit-box-align: center; align-items: center;"></div></footer><p></p>
页: [1]
查看完整版本: 可能是最全一篇的前端异常监控总结