UNPKG

@_gz/browser-error

Version:

浏览器收集错误信息

2 lines (1 loc) 8.67 kB
function unwrapExports(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var _typeof_1=createCommonjsModule(function(t){function r(e){return t.exports=r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t.exports.__esModule=!0,t.exports.default=t.exports,r(e)}t.exports=r,t.exports.__esModule=!0,t.exports.default=t.exports}),_typeof=unwrapExports(_typeof_1),parseStack=function(e){try{var t=e.message,r=e.stack,n=r.split(/\r?\n/g)[1],o=n.indexOf("http"),a=n.indexOf(".js")+3,s=n.slice(o,a);console.log("source",s);var c=n.split(":");console.log("linenoSplit",c);var i=parseInt(c.pop());return{message:t,source:s,line:parseInt(c.pop()),column:i,stack:r}}catch(e){throw new Error(e)}},configInfo={data:null,get:function(){return this.data},set:function(e){this.data=e}},queue=[],t=null,MAX_RETRY_OF_REPORT_LOG=5;function sendByBeacon(e){var t=configInfo.get()||{},r=t.url,t=t.params;if(0!==e.length){try{if(navigator.sendBeacon&&navigator.sendBeacon(r,JSON.stringify({errors:e,params:t})))return void(queue=[])}catch(e){}sendByXhr(e)}}function sendByXhr(r){console.log("body",r);var e=configInfo.get()||{},n=e.url,e=e.params;if(r.length<1)return console.log("没有错误数据可上报,但触发了上报机制");var o=new XMLHttpRequest;o.withCredentials=!1,o.open("POST",n,!0),o.setRequestHeader("Access-Control-Allow-Origin","*"),o.onreadystatechange=function(){var e;4===o.readyState&&200!=+o.status?(e=r._re||0)<MAX_RETRY_OF_REPORT_LOG&&(r._re=e+1,sendLog(r)):(queue=[],clearTimeout(t))},o.setRequestHeader("Content-Type","application/json;charset=UTF-8"),o.send(JSON.stringify({errors:r,params:e}))}function batchFlushQueue(){clearTimeout(t),t=null,sendByXhr(queue)}function sendLog(e){e._re||queue.push(e),t=t||setTimeout(batchFlushQueue,3e3),window.addEventListener("pagehide",function(){return sendByBeacon(queue)},!1)}function errorHandler(e,t,r,n,o){var a=(configInfo.get()||{}).projectName,s=process.env.COMMITHASH||"";if(console.log("COMMITHASH",process.env.COMMITHASH),!s)return console.warn("当前环境变量{COMMITHASH}未配置,请配置检查webpack配置"),!1;var c=(null==t?void 0:t.slice(t.lastIndexOf("/")+1))||"";null!=o&&sendLog({type:"error",projectName:a,commitHash:s,message:e,source:t,sourceName:c,line:r,column:n,stack:o,request_times:Date.now()})}function stackInfo(e){var t=parseStack(e),r=t.message,n=t.source,o=t.line,e=t.column,t=t.stack;r&&r.includes("404")?console.warn("当前404不发送错误信息"):errorHandler(r,n,o,e,t)}function watchError(){window.addEventListener("error",function(e){console.log("addEventListener ------error",e),"object"===_typeof(e.error)&&e.error.stack&&stackInfo(e.error)},!0),window.addEventListener("unhandledrejection",function(e){"object"===_typeof(e.reason)&&e.reason.stack&&(console.log("unhandledrejection:event.reason",e.reason),stackInfo(e.reason))})}function watchApi(){}function _createForOfIteratorHelper(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=_unsupportedIterableToArray(e))||t&&e&&"number"==typeof e.length){r&&(e=r);function n(){}var o=0;return{s:n,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return s=e.done,e},e:function(e){c=!0,a=e},f:function(){try{s||null==r.return||r.return()}finally{if(c)throw a}}}}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(r="Object"===r&&e.constructor?e.constructor.name:r)||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}function watchResource(){function a(e){return"[object Function]"===Object.prototype.toString.call(e)}function e(){if(a(performance.getEntriesByType)){var e=performance.getEntriesByType("resource"),e=(o=function(e){return-1===["fetch","xmlhttprequest","beacon"].indexOf(e.initiatorType)},e.filter(function(e){return o(e)}));if(e.length){var t,r=_createForOfIteratorHelper((n=function(e){return{type:"resource",request_url:e.name,http_code:200,request_time:Math.round(e.duration)}},e.map(function(e){return n(e)})));try{for(r.s();!(t=r.n()).done;)sendLog(t.value)}catch(e){r.e(e)}finally{r.f()}}a(performance.clearResourceTimings)&&performance.clearResourceTimings()}var n,o}"complete"===document.readyState?e():window.addEventListener("load",e)}function watchPV(){function e(){sendLog({type:"pv",to_url:window.location.href})}function t(){sendLog({type:"pv",to_url:window.location.href})}window.addEventListener("hashchange",t),window.addEventListener("load",e),window.addEventListener("beforeunload",function(){window.removeEventListener("hashchange",t),window.removeEventListener("load",e)})}var classCallCheck=createCommonjsModule(function(e){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports}),_classCallCheck=unwrapExports(classCallCheck),createClass=createCommonjsModule(function(e){function n(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}e.exports=function(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e},e.exports.__esModule=!0,e.exports.default=e.exports}),_createClass=unwrapExports(createClass),CustomEventTrigger=function(){function e(){_classCallCheck(this,e)}return _createClass(e,[{key:"push",value:function(e){e instanceof Array&&e[0]&&sendLog.report({type:"custom",message:[{ext1:e[0],ext2:e[1]||"",ext3:e[2]||"",ext4:e[3]||"",ext5:e[4]||""}]})}}]),e}();function watchCustom(){var t=window.$watchDogEvents||[],r=new CustomEventTrigger;window.$watchDogEvents=r,setTimeout(function(){for(var e=0;e<t.length;e++)r.push(t[e])},0)}var defineProperty=createCommonjsModule(function(e){e.exports=function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e},e.exports.__esModule=!0,e.exports.default=e.exports}),_defineProperty=unwrapExports(defineProperty);function ownKeys(t,e){var r,n=Object.keys(t);return Object.getOwnPropertySymbols&&(r=Object.getOwnPropertySymbols(t),e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)),n}function _objectSpread(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?ownKeys(Object(r),!0).forEach(function(e){_defineProperty(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function watchPerf(){var e,t=window.performance;t?(e=t.timing,(t={}).loadPage=e.loadEventEnd-e.navigationStart,t.domReady=e.domComplete-e.responseEnd,t.redirect=e.redirectEnd-e.redirectStart,t.lookupDomain=e.domainLookupEnd-e.domainLookupStart,t.ttfb=e.responseStart-e.navigationStart,t.request=e.responseEnd-e.requestStart,t.loadEvent=e.loadEventEnd-e.loadEventStart,t.appcache=e.domainLookupStart-e.fetchStart,t.unloadEvent=e.unloadEventEnd-e.unloadEventStart,t.connect=e.connectEnd-e.connectStart,sendLog(_objectSpread({type:"performance"},t))):console.warn("你的浏览器不支持 performance 接口")}function initError(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=e||{},r=t.url,n=t.projectName,t=t.params;if(!r||!n)return console.warn("上传接口url或项目名称projectName: 未配置,请重新检查"),!1;if(t&&"[object Object]"!==Object.prototype.toString.call(t))return console.warn("params参数不是对象,重新检查"),!1;e=Object.assign({sendError:!0,sendPV:!1,sendApi:!1,sendResource:!1,sendPerf:!1,sendCustom:!1},e);configInfo.set(e),e.sendError&&watchError(),e.sendApi&&watchApi(),e.sendResource&&watchResource(),e.sendPV&&watchPV(),e.sendPerf&&watchPerf(),e.sendCustom&&watchCustom()}export{initError as default,errorHandler,parseStack};