monitor-rcl
Version:
monitor-rcl
1,405 lines (1,198 loc) • 128 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else {
var a = factory();
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* retcode/log
*
* @Author xianqian.rxq@alibaba-inc.com
* @Date 2016-10-09
* @copyright(c) Alibaba Group Holding Limited.
*/
// var isBrowser = typeof window === 'object' && !!window.navigator;
// var isNodejs = typeof process === 'object' && (process + '' === '[object process]');
// var isWeex = typeof callNative === 'function';
// // weex
// if (isWeex) {
// module.exports = require('./log-weex')
// }
// // nodejs环境
// else if (isNodejs) {
// module.exports = require('./log-node');
// }
// // 默认browser端
// else {
module.exports = __webpack_require__(1);
// }
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
(function (win) {
var browserConf = __webpack_require__(2);
var wpo = win.__WPO || {},
status = 2;
// env设置
wpo.env = 'browser';
__webpack_require__(3)(wpo, win, browserConf);
var exec = function exec() {
__webpack_require__(4)(wpo);
__webpack_require__(5)(wpo);
__webpack_require__(6)(wpo, win, browserConf);
};
if (wpo.config.dynamic) {
//
// 自更新log.js
//
if (!(status = __webpack_require__(7)(wpo))) {
__webpack_require__(8)(wpo, function () {
exec();
if (wpo.reloaded) {
wpo.reloaded();
}
});
return;
}
}
if (status == 2) {
// support log.js async loaded
if (document.readyState === 'complete') {
wpo.ready();
} else {
wpo.on(win, 'load', function () {
wpo.ready();
}, true);
}
}
exec();
})(window);
module.exports = window.__WPO;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _make_rnd = function _make_rnd() {
return +new Date() + Math.floor(Math.random() * 1000);
};
var spmId = '';
var getSpmId = function getSpmId() {
var meta = document.getElementsByTagName('meta'),
id = [];
var spma = '';
if (spmId) {
return spmId;
}
//spm第一位
for (var i = 0; i < meta.length; i++) {
var tag = meta[i];
if (tag && tag.name && (tag.name == 'data-spm' || tag.name == 'spm-id')) {
spma = tag.content;
}
}
if (spma) {
id.push(spma);
}
//spm第二位
if (document.body && document.body.getAttribute('data-spm')) {
id.push(document.body.getAttribute('data-spm'));
}
id = id.length ? id.join('.') : 0;
if (id && id.indexOf('.') !== -1) {
spmId = id;
}
return spmId;
};
if (!getSpmId.bind) {
getSpmId.bind = function () {
return getSpmId;
};
}
module.exports = {
sendRequest: function sendRequest(src) {
var win = window;
var n = 'jsFeImage_' + _make_rnd(),
img = win[n] = new Image();
img.onload = img.onerror = function () {
win[n] = null;
};
img.src = src;
img = null;
},
getCookie: function getCookie() {
return document.cookie;
},
getSpmId: getSpmId
};
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
module.exports = function (wpo, root, conf) {
var cookies = {};
var count = 0;
var uid, timer;
var config = {
// 默认上报上报
imgUrl: '//retcode.taobao.com/r.png?',
// 默认抽样率
sample: 10,
modVal: 1,
// 是否开启动态配置功能
dynamic: false,
// API抽样率
retCode: {},
delayOfReady: null
};
var sendRequest = conf.sendRequest;
var _send = function _send() {
var params, obj;
// 发送log.js异步加载前的数据队列
if (wpo.asyncQueue && wpo.asyncQueue.length > 0) {
var asyncQueue = wpo.asyncQueue;
var item;
while (item = asyncQueue.shift()) {
var method = item.method;
if (typeof wpo[method] === 'function') {
wpo[method].apply(wpo, item.args || []);
}
}
}
while (params = core.dequeue()) {
obj = core.extend({
uid: uid,
userNick: wpo.getNick(),
times: params.times ? params.times : 1,
_t: ~new Date() + (count++).toString(),
tag: wpo.config.tag || ''
}, params);
// 最后一次尝试补齐spm值
if (!obj.spm) {
obj.spm = wpo.getSpmId();
}
if (!obj.spm) {
break;
}
if (wpo.debug && (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && window.console) {
console.log(obj);
}
sendRequest.call(wpo, config.imgUrl + core.query.stringify(obj));
}
timer = null;
};
/**
* 延时发送
*
* @param _clear 是否立即发送
* @param delay 延时多久发送
* @private
*/
var _wait = function _wait(_clear) {
if (_clear && timer) {
clearTimeout(timer);
_send();
}
if (!timer) {
timer = setTimeout(_send, 1000);
}
};
var core = {
_key: 'wpokey',
// 版本号
ver: '<%= pkg.version %>',
// dynamically updates itself without queue
requestQueue: wpo.requestQueue || [],
/**
* 获取cookie
*
* @param name
* @returns {*}
*/
getCookie: function getCookie(name) {
var reg,
matches,
cookie = '';
if (!cookies[name]) {
reg = new RegExp(name + '=([^;]+)');
//
// to make it compatible with nodejs
//
try {
cookie = conf.getCookie(this);
} catch (e) {}
matches = reg.exec(cookie);
if (matches) {
cookies[name] = matches[1];
}
}
return cookies[name];
},
/**
* 设置cookie
*
* @param key
* @param value
* @param expires
* @param domain
* @param path
*/
setCookie: function setCookie(key, value, expires, domain, path) {
var str = key + '=' + value;
if (domain) {
str += '; domain=' + domain;
}
if (path) {
str += '; path=' + path;
}
if (expires) {
str += '; expires=' + expires;
}
document.cookie = str;
},
/**
* 扩展对象
*
* @param target
* @returns {*}
*/
extend: function extend(target) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0, len = args.length, arg; i < len; i++) {
arg = args[i];
for (var name in arg) {
if (arg.hasOwnProperty(name)) {
target[name] = arg[name];
}
}
}
return target;
},
/**
* 获取guid
*
* @returns {string}
*/
guid: function guid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : r & 0x3 | 0x8;
return v.toString(16);
});
},
/**
* 发送请求
*
* @param params
*/
send: function send(params) {
// 如果没有禁用wpo则上报, e.g., daily环境可禁用wpo上报,防止数据污染
if (params && !wpo.config.disabled) {
var spm = core.getSpmId();
// 如果尚未设置过spm,并且成功获取到spm,则锁定spm值
// 加入队列的时候即固定了此次上报的spm,方便SPA应用通过setConfig动态修改spm
if (!params.spm && spm) {
params.spm = spm;
}
this.queue(params);
}
},
query: {
/**
* 对象转url字符串
*
* @param params
* @returns {string}
*/
stringify: function stringify(params) {
var arr = [];
var str = '';
// encodeURIComponent异常保护
try {
for (var name in params) {
if (params.hasOwnProperty(name) && params[name] !== undefined) {
var encodeInfo = '';
if (name == 'spm') {
encodeInfo = encodeURI(params[name]);
} else {
encodeInfo = encodeURIComponent(params[name]);
}
arr.push(name + '=' + encodeInfo);
}
}
if (arr.length > 0) {
str = arr.join('&');
}
} catch (e) {}
return str;
},
/**
* url字符串转对象
*
* @param str
* @returns {{}}
*/
parse: function parse(str) {
var pairs = str.split('&'),
obj = {},
pair;
// decodeURIComponent异常保护
try {
for (var i = 0, len = pairs.length; i < len; i++) {
pair = pairs[i].split('=');
obj[pair[0]] = decodeURIComponent(pair[1]);
}
} catch (e) {}
return obj;
}
},
/**
* 获取spmId
*
* @returns {*}
*/
getSpmId: function getSpmId() {
if (config.spmId) {
return config.spmId;
} else if (typeof conf.getSpmId === 'function') {
return conf.getSpmId.call(this);
}
return 0;
},
/**
* 事件绑定
*
* @param el
* @param type
* @param func
* @param isRemoving
*/
on: function on(el, type, func, isRemoving) {
if (el.addEventListener) {
el.addEventListener(type, isRemoving ? function () {
el.removeEventListener(type, func, false);
func();
} : func, false);
} else if (el.attachEvent) {
el.attachEvent('on' + type, function () {
if (isRemoving) {
el.detachEvent('on' + type, arguments.callee);
}
func();
});
}
},
/**
* 获取用户的taobao nick
*
* @returns {*}
*/
getNick: function getNick() {
var nick = '';
try {
// 优先取业务方主动配置的nick
if (wpo.config.nick) {
nick = wpo.config.nick;
}
// 否则从cookie中读取
else {
// 分别取淘宝PC,淘宝无线,商家子账号cookie
nick = this.getCookie('_nk_') || this.getCookie('lgc') || this.getCookie('_w_tb_nick') || this.getCookie('sn') || '';
nick = decodeURIComponent(nick);
}
} catch (e) {}
return nick;
},
/**
* 设置config
* @param inConfig
* @returns {*}
*/
setConfig: function setConfig(conf) {
if (conf && (typeof conf === 'undefined' ? 'undefined' : _typeof(conf)) !== 'object') {
throw 'args of wpo.setConfig is not object';
return;
}
// weex环境
if (conf && conf.user && typeof conf.user.getUserInfo === 'function' && this.env === 'weex') {
// 设置nick
conf.user.getUserInfo(function (resStr) {
try {
var res = JSON.parse(resStr);
core.extend(config, {
nick: res.info && res.info.nick
});
} catch (e) {}
});
}
return core.extend(config, conf);
},
/**
* 快捷配置spm,返回wpo自身方便链式调用
*
* @param spm
* @returns {core}
*/
spm: function spm(_spm) {
if (_spm) {
this.setConfig({
spmId: _spm
});
}
return this;
},
/**
* 动态配置
*
* @param obj
*/
dynamicConfig: function dynamicConfig(obj) {
var config = this.query.stringify(obj);
try {
localStorage.setItem(this._key, config);
} catch (e) {
this.setCookie(this._key, config, new Date(obj.expTime));
}
this.setConfig({
sample: parseInt(obj.sample, 10)
});
this.ready();
},
/**
* ready
*
*/
ready: function ready() {
var _ready = function _ready() {
wpo._ready = true;
_wait();
};
if (wpo.config.delayOfReady) {
setTimeout(function () {
_ready();
}, wpo.config.delayOfReady);
} else {
_ready();
}
},
/**
* 加入请求队列
*
* @param obj
*/
queue: function queue(obj) {
var queue = this.requestQueue,
compare;
if (obj.type === 'jserror') {
if (queue.length) {
compare = queue[queue.length - 1];
if (obj.msg === compare.msg) {
compare.times++;
return;
}
}
if (!obj.times) {
obj.times = 1;
}
}
queue.push(obj);
if (this._ready) {
if (obj.type === 'jserror') {
// js error延时1s发送,方便合并大量同类错误
_wait(false, 1000);
} else {
_send();
}
}
},
/**
* 从请求队列取头部取一个(第一个)
*
* @returns {T}
*/
dequeue: function dequeue() {
return this.requestQueue.shift();
},
/**
* clear
*/
clear: function clear() {
_wait(true);
}
};
core.uid = uid = core.guid();
core.config = core.setConfig(wpo.config);
core.extend(wpo, core);
root.__WPO = wpo;
return wpo;
};
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
//
// 修改抽样算法,以前以uid作为抽样的key,在大于100抽样率下会呈现正态分布
// 改用random可以规避这个问题
//
// (function (n) {
// var guid = function () {
// return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
// var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r&0x3|0x8);
// return v.toString(16);
// });
// };
// var parseGuid = function (uid) {
// var num = 0;
// for (var i = 0, len = uid.length; i < len; i++) {
// num += uid.charCodeAt(i);
// }
// return num;
// };
// var arr = [];
// for (var i = 0, n = n || 1000000; i++ < n;) {
// // arr.push(parseGuid(guid()) % 100);
// arr.push(Math.floor(Math.random() * 100));
// }
// var map = {};
// arr.forEach(function (num) {
// if (!map[num]) {
// map[num] = 0;
// }
// map[num]++;
// });
// console.log(map);
// })();
module.exports = function (wpo) {
var map = {};
wpo.sampling = function (mod) {
var uid = wpo.uid,
num = 0;
if (mod == 1) {
return 1; // 100%
} else if (typeof map[mod] == 'number') {
return map[mod];
}
//
// 抽样算法改为Math.random
//
map[mod] = Math.floor(Math.random() * mod);
return map[mod];
};
};
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
module.exports = function (wpo, undef) {
// startTime配置兼容
var startTime = wpo.startTime || wpo.config.startTime;
var scriptStart = startTime;
if (!startTime) {
try {
startTime = window.performance.timing.responseStart || +new Date();
scriptStart = +new Date();
} catch (e) {
scriptStart = startTime = +new Date();
}
}
var send = function send(params, sampling) {
sampling = sampling || wpo.config.sample;
//
// 双十一当天统计数据抽样率降低
//
// if ((curDate.getUTCDate() == 10 && curDate.getUTCMonth() == 10 && curDate.getUTCHours() >= 16) ||
// (curDate.getUTCDate() == 11 && curDate.getUTCMonth() == 10)) {
// sampling *= 10;
// }
if (wpo.sampling(sampling) == (wpo.config.modVal || 1)) {
params.sampling = sampling;
wpo.send(params);
}
};
/**
* [custom description]
* @param {[int/string]} category [0/'time',1/'count']
* @param {[string]} key [自定义值]
* @param {[any]} value [自定义值,如果type为count,自动忽略该值]
* @return {[void]}
*/
wpo.custom = function (category, key, value) {
var customParam = {
type: 'custom'
},
arr = ['time', 'count'];
category = arr[category] || category;
if (category == 'time' || category == 'count') {
customParam['category'] = category;
}
if (customParam.type) {
customParam['key'] = key;
customParam['value'] = category == 'time' ? value : undef;
send(customParam);
}
};
/**
* [error description]
* @param {[str]} category [可选参,错误类型,默认为sys]
* @param {[str]} msg [自定义错误信息]
* @return {[void]}
*/
wpo.error = function (category, msg, file, line, col, stack) {
var errorParam = {
type: 'jserror'
};
if (arguments.length === 1) {
msg = category;
category = undefined;
}
// 有错误信息才上报
if (msg) {
errorParam['category'] = category || 'sys';
if ((typeof msg === 'undefined' ? 'undefined' : _typeof(msg)) == 'object' && msg.message) {
//event处理https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent
var msgEvent = msg;
try {
msg = msgEvent.message;
file = file || msgEvent.filename;
line = line || msgEvent.lineno;
col = col || msgEvent.colno;
} catch (e) {}
} else {
if ((typeof msg === 'undefined' ? 'undefined' : _typeof(msg)) === 'object') {
try {
msg = JSON.stringify(msg);
} catch (e) {}
}
}
try {
if (msg) {
msg = msg.substring(0, 1e3);
} else {
msg = '';
}
} catch (e) {
msg = '';
}
stack = stack ? stack.substring(0, 1e3) : ''; //限制1000个字符
errorParam['msg'] = msg;
// separate msg file name
if (file) {
errorParam['file'] = file;
}
if (line) {
errorParam['line'] = line;
}
if (col) {
errorParam['col'] = col;
}
if (stack) {
errorParam['stack'] = stack;
}
send(errorParam, 1);
}
};
/**
* [performance description]
* @param {[obj]} params [性能相关信息]
* @return {[void]}
*/
wpo.performance = function (params) {
var perParam = {
type: 'per'
};
send(wpo.extend(perParam, params));
};
/**
* [retCode description]
* @param {[str / obj]} api [所调用的api]
* @param {[boolean]} issuccess [是否成功,不成功会100%发送,成功按照抽样发送]
* @param {[type]} delay [调用时间]
* @param {[type]} code [错误码]
* @param {[type]} msg [错误详情]
* @return {[void]}
*/
wpo.retCode = function (api, issuccess, delay, code, msg) {
var retParam = {
type: 'retcode',
sampling: this.config.retCode[api]
};
if ((typeof api === 'undefined' ? 'undefined' : _typeof(api)) === 'object') {
//新接口
try {
api.msg = api.msg ? api.msg.substring(0, 1e3) : '';
} catch (e) {
api.msg = '';
}
retParam.api = api.api;
retParam.issucess = api.issuccess;
retParam.delay = typeof api.delay == 'number' ? parseInt(api.delay, 10) : new Date() - startTime;
retParam.msg = api.msg || (api.issuccess ? 'success' : 'fail');
retParam.detail = api.detail || '';
retParam.traceId = api.traceId || '';
retParam = wpo.extend(api, retParam);
delete retParam['issuccess'];
} else {
//兼容老的接口
try {
msg = msg ? msg.substring(0, 1e3) : '';
} catch (e) {
msg = '';
}
retParam = wpo.extend({
api: api,
issucess: issuccess,
delay: typeof delay == 'number' ? parseInt(delay, 10) : new Date() - startTime,
msg: code || (issuccess ? 'success' : 'fail'),
detail: msg || ''
}, retParam);
}
if (typeof retParam.delay !== 'undefined' && typeof retParam.issucess !== 'undefined') {
send(retParam, retParam.issucess ? retParam.sampling : 1);
}
};
var sendSpeed = function sendSpeed() {
var perParam = {
type: 'speed'
},
val;
for (var i = 0, len = wpo.speed.points.length; i < len; i++) {
val = wpo.speed.points[i];
if (val) {
perParam['s' + i] = val;
wpo.speed.points[i] = null;
}
}
send(perParam);
};
/**
* [speed description]
* @param {[int/str]} pos [0/'s0',1/'s1',2/'s2'....10/'s10']
* @param {[int]} delay [耗时,如果没有定义,这按照当前时间减去页面起始时间]
* @param {[boolean]} _immediately [内部使用,是否强制发送,不强制发送会尽量收集3s内的所有点的数据一次性发送]
* @return {[void]}
*/
wpo.speed = function (pos, delay, _immediately) {
var sArr;
if (typeof pos == 'string') {
pos = parseInt(pos.slice(1), 10);
}
if (typeof pos == 'number') {
sArr = wpo.speed.points || new Array(11);
sArr[pos] = typeof delay == 'number' ? delay > 86400000 ? delay - startTime : delay : new Date() - startTime;
if (sArr[pos] < 0) {
sArr[pos] = new Date() - scriptStart;
}
wpo.speed.points = sArr;
}
clearTimeout(wpo.speed.timer);
if (!_immediately) {
wpo.speed.timer = setTimeout(sendSpeed, 3000);
} else {
sendSpeed();
}
};
/**
* [log 日志统计]
* @param {[string]} msg [发送的内容]
* @param {[int]} sampling [可以自定义发送的抽样]
* @return {[void]}
*/
wpo.log = function (msg, sampling) {
var param = {
type: 'log',
msg: msg
};
send(param, sampling);
};
};
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function (wpo, win, browserConf) {
// performance初始数据
var performanceData = {
spm: wpo.getSpmId() //首次尝试获取spm值
};
// 页面已绑定的onerror事件
var onErrorHandler = win.onerror;
var browser = {
/**
* 初始化浏览器端调用
*
* @return {void}
*/
init: function init() {
this.lockPerformanceSpm();
this.sendPerformance();
this.bind();
// debug模式
if (/wpodebug\=1/.test(location.search)) {
wpo.config.sample = 1;
wpo.config.modVal = 1;
wpo.debug = true;
}
},
/**
* 事件绑定
*
* @return {void}
*/
bind: function bind() {
// unload
wpo.on(win, 'beforeunload', function () {
wpo.clear();
if (wpo.speed.points) {
wpo.speed(null, null, true);
}
}, true);
// error处理
win.onerror = function (msg, file, line, col, error) {
if (onErrorHandler) {
onErrorHandler(msg, file, line, col, error);
}
var stack = error && error.stack;
if (file) {
wpo.error('sys', msg, file, line, col, stack);
} else {
wpo.error(msg);
}
};
},
/**
* 获取performance性能数据
*
* @returns {{}}
*/
analyzeTiming: function analyzeTiming() {
var datas = {
"rrt": ["responseStart", "requestStart"], // 整个网络请求时间(不包括unload)
"dns": ["domainLookupEnd", "domainLookupStart"], // dns lookup
"cnt": ["connectEnd", "connectStart"], // 建立 tcp 时间
"ntw": ["responseStart", "fetchStart"], // network time
"dct": ["domContentLoadedEventStart", "responseStart"], // dom content loaded time
"flt": ["loadEventStart", "responseStart"] // full load time 页面完全加载时间
// "flv": this._getFlashVersion(),
};
try {
var timing = performance.timing;
for (var name in datas) {
var start = timing[datas[name][1]];
var end = timing[datas[name][0]];
// 脏数据过滤: 部分浏览器,特别是移动端(如UC,windvane容器)某些时间点可能返回0或者null,排除掉此部分
if (start && end) {
var cost = end - start;
// 脏数据过滤: 耗时大于0并且小于1天(1e3 * 3600 * 24)
if (cost >= 0 && cost < 86400000) {
performanceData[name] = cost;
}
}
}
} catch (e) {
// console.log('error');
}
return performanceData;
},
/**
* 在body标签完成渲染后,提前锁定测速上报的spm值
*
* @returns {void}
*/
lockPerformanceSpm: function lockPerformanceSpm() {
// 如果首次没有成功锁定spm,则在domReady后,再尝试在meta和body上取一次
if (!performanceData.spm) {
var lockSpm = function lockSpm() {
var spm = browserConf && browserConf.getSpmId && browserConf.getSpmId();
if (spm) {
performanceData.spm = spm;
}
};
var ready = function ready() {
if (document.readyState === 'complete') {
lockSpm();
} else if (document.addEventListener) {
document.removeEventListener('DOMContentLoaded', ready, false);
lockSpm();
} else if (document.readyState === 'complete') {
document.detachEvent('onreadystatechange', ready);
lockSpm();
}
};
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', ready, false);
} else if (document.attachEvent) {
document.attachEvent('onreadystatechange', ready);
}
}
},
/**
* 上报performance性能数据
*/
sendPerformance: function sendPerformance() {
var me = this;
// support log.js async loaded
if (document.readyState === 'complete') {
wpo.performance(me.analyzeTiming());
} else {
wpo.on(win, 'load', function () {
wpo.performance(me.analyzeTiming());
}, true);
}
}
};
browser.init();
};
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/*
*
* return status
* 0 -> need to load new version log
* 1 -> need to load config
* 2 -> latest version of config as well as log
*
*/
module.exports = function (wpo) {
var key = wpo._key,
str,
config,
tag,
url;
var compareVer;
var loadScript = function loadScript(url) {
var scriptTag = document.createElement('script');
scriptTag.src = url;
document.getElementsByTagName('script')[0].parentNode.appendChild(scriptTag);
return scriptTag;
};
var isReady,
loadConfigByDomReady = function loadConfigByDomReady() {
if (isReady) {
return;
}
isReady = true;
loadConfig();
};
var loadConfig = function loadConfig() {
var url = '//retcode.alicdn.com/retcode/pro/config/' + wpo.getSpmId() + '.js',
tag = loadScript(url);
tag.onerror = function () {
tag.onerror = null;
wpo.error('sys', 'dynamic config error', url, 0);
wpo.ready();
};
};
var loadConfigWhenReady = function loadConfigWhenReady() {
if (document.readyState === 'complete') {
loadConfigByDomReady();
} else if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', function () {
document.removeEventListener('DOMContentLoaded', arguments.callee, false);
loadConfigByDomReady();
}, false);
} else if (document.attachEvent) {
document.attachEvent("onreadystatechange", function () {
if (document.readyState === "complete") {
document.detachEvent("onreadystatechange", arguments.callee);
loadConfigByDomReady();
}
});
if (document.documentElement.doScroll && typeof window.frameElement === "undefined") (function () {
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch (error) {
setTimeout(arguments.callee, 0);
return;
}
// and execute any waiting functions
loadConfigByDomReady();
})();
wpo.on(window, 'load', function () {
loadConfigByDomReady();
}, true);
}
};
//
// key has been overriden
//
if (!key) {
return 2;
}
try {
str = localStorage.getItem(key);
} catch (e) {
str = wpo.getCookie(key);
}
if (!str) {
loadConfigWhenReady();
return 1;
} else {
config = wpo.query.parse(str);
//
// current ver is behind dynamic ver
//
selfUpdate = function selfUpdate() {
var versions = wpo.ver && wpo.ver.split('.'),
compareVersions = config.ver && config.ver.split('.');
//
// force not updating
//
if (!versions || !compareVersions) {
return false;
}
for (var i = 0, len = versions.length; i < len; i++) {
if (compareVersions[i]) {
if (parseInt(versions[i], 10) < parseInt(compareVersions[i], 10)) {
return true;
}
}
}
return false;
};
//
// 动态更新脚本自己
//
if (selfUpdate()) {
// url = '//g-assets.daily.taobao.net/retcode/retcodelog/' + config.ver + '/log.js';
url = '//g.alicdn.com/retcode/log/' + config.ver + '/log.js';
tag = loadScript(url);
tag.onload = function () {
tag.onload = null;
wpo.reloaded();
};
tag.onerror = function () {
tag.onerror = null;
wpo.error('sys', 'self update error', url, 0);
wpo.reloadFailed();
};
return 0;
}
//
// 从localstorage里读取数据
//
else if (parseInt(config.exp, 10) < new Date().getTime()) {
loadConfigWhenReady();
return 1;
}
wpo.setConfig({
sample: parseInt(config.sample, 10)
});
}
return 2;
};
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function (wpo, failedCallback) {
var awaits = [],
apis = ['custom', 'error', 'performance', 'retCode', 'speed', 'log'],
name,
i = 0;
var awaitFunc = function awaitFunc(apiName) {
return function () {
awaits.push({
type: apiName,
params: Array.prototype.slice.call(arguments)
});
};
};
while (name = apis[i++]) {
wpo[name] = awaitFunc(name);
}
wpo.reloaded = function () {
wpo.ready();
for (var i = 0, len = awaits.length; i < len; i++) {
wpo[awaits[i].type].apply(wpo, awaits[i].params);
}
};
wpo.reloadFailed = function () {
if (typeof failedCallback === 'function') {
failedCallback();
// wpo.reloaded();
}
};
};
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAwZDNhYTAyNGMxODU3MDY1YWM3ZSIsIndlYnBhY2s6Ly8vLi9zcmMvbG9nLmpzIiwid2VicGFjazovLy8uL3NyYy9sb2ctYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZi1icm93c2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb3JlLmpzIiwid2VicGFjazovLy8uL3NyYy9zYW1wbGluZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBpcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYnJvd3Nlci1wZXJmb3JtYW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2VydmVyLWNvbmZpZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBpLWF3YWl0LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJyZXF1aXJlIiwid2luIiwiYnJvd3NlckNvbmYiLCJ3cG8iLCJfX1dQTyIsInN0YXR1cyIsImVudiIsImV4ZWMiLCJjb25maWciLCJkeW5hbWljIiwicmVsb2FkZWQiLCJkb2N1bWVudCIsInJlYWR5U3RhdGUiLCJyZWFkeSIsIm9uIiwid2luZG93IiwiX21ha2Vfcm5kIiwiRGF0ZSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInNwbUlkIiwiZ2V0U3BtSWQiLCJtZXRhIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJpZCIsInNwbWEiLCJpIiwibGVuZ3RoIiwidGFnIiwibmFtZSIsImNvbnRlbnQiLCJwdXNoIiwiYm9keSIsImdldEF0dHJpYnV0ZSIsImpvaW4iLCJpbmRleE9mIiwiYmluZCIsInNlbmRSZXF1ZXN0Iiwic3JjIiwibiIsImltZyIsIkltYWdlIiwib25sb2FkIiwib25lcnJvciIsImdldENvb2tpZSIsImNvb2tpZSIsInJvb3QiLCJjb25mIiwiY29va2llcyIsImNvdW50IiwidWlkIiwidGltZXIiLCJpbWdVcmwiLCJzYW1wbGUiLCJtb2RWYWwiLCJyZXRDb2RlIiwiZGVsYXlPZlJlYWR5IiwiX3NlbmQiLCJwYXJhbXMiLCJvYmoiLCJhc3luY1F1ZXVlIiwiaXRlbSIsInNoaWZ0IiwibWV0aG9kIiwiYXBwbHkiLCJhcmdzIiwiY29yZSIsImRlcXVldWUiLCJleHRlbmQiLCJ1c2VyTmljayIsImdldE5pY2siLCJ0aW1lcyIsIl90IiwidG9TdHJpbmciLCJzcG0iLCJkZWJ1ZyIsImNvbnNvbGUiLCJsb2ciLCJjYWxsIiwicXVlcnkiLCJzdHJpbmdpZnkiLCJfd2FpdCIsIl9jbGVhciIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJfa2V5IiwidmVyIiwicmVxdWVzdFF1ZXVlIiwicmVnIiwibWF0Y2hlcyIsIlJlZ0V4cCIsImUiLCJzZXRDb29raWUiLCJrZXkiLCJ2YWx1ZSIsImV4cGlyZXMiLCJkb21haW4iLCJwYXRoIiwic3RyIiwidGFyZ2V0IiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImFyZ3VtZW50cyIsImxlbiIsImFyZyIsImhhc093blByb3BlcnR5IiwiZ3VpZCIsInJlcGxhY2UiLCJjIiwiciIsInYiLCJzZW5kIiwiZGlzYWJsZWQiLCJxdWV1ZSIsImFyciIsInVuZGVmaW5lZCIsImVuY29kZUluZm8iLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJwYXJzZSIsInBhaXJzIiwic3BsaXQiLCJwYWlyIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZWwiLCJ0eXBlIiwiZnVuYyIsImlzUmVtb3ZpbmciLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImF0dGFjaEV2ZW50IiwiZGV0YWNoRXZlbnQiLCJjYWxsZWUiLCJuaWNrIiwic2V0Q29uZmlnIiwidXNlciIsImdldFVzZXJJbmZvIiwicmVzU3RyIiwicmVzIiwiSlNPTiIsImluZm8iLCJkeW5hbWljQ29uZmlnIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsImV4cFRpbWUiLCJwYXJzZUludCIsIl9yZWFkeSIsImNvbXBhcmUiLCJtc2ciLCJjbGVhciIsIm1hcCIsInNhbXBsaW5nIiwibW9kIiwibnVtIiwidW5kZWYiLCJzdGFydFRpbWUiLCJzY3JpcHRTdGFydCIsInBlcmZvcm1hbmNlIiwidGltaW5nIiwicmVzcG9uc2VTdGFydCIsImN1c3RvbSIsImNhdGVnb3J5IiwiY3VzdG9tUGFyYW0iLCJlcnJvciIsImZpbGUiLCJsaW5lIiwiY29sIiwic3RhY2siLCJlcnJvclBhcmFtIiwibWVzc2FnZSIsIm1zZ0V2ZW50IiwiZmlsZW5hbWUiLCJsaW5lbm8iLCJjb2xubyIsInN1YnN0cmluZyIsInBlclBhcmFtIiwiYXBpIiwiaXNzdWNjZXNzIiwiZGVsYXkiLCJjb2RlIiwicmV0UGFyYW0iLCJpc3N1Y2VzcyIsImRldGFpbCIsInRyYWNlSWQiLCJzZW5kU3BlZWQiLCJ2YWwiLCJzcGVlZCIsInBvaW50cyIsInBvcyIsIl9pbW1lZGlhdGVseSIsInNBcnIiLCJwYXJhbSIsInBlcmZvcm1hbmNlRGF0YSIsIm9uRXJyb3JIYW5kbGVyIiwiYnJvd3NlciIsImluaXQiLCJsb2NrUGVyZm9ybWFuY2VTcG0iLCJzZW5kUGVyZm9ybWFuY2UiLCJ0ZXN0IiwibG9jYXRpb24iLCJzZWFyY2giLCJhbmFseXplVGltaW5nIiwiZGF0YXMiLCJzdGFydCIsImVuZCIsImNvc3QiLCJsb2NrU3BtIiwibWUiLCJ1cmwiLCJjb21wYXJlVmVyIiwibG9hZFNjcmlwdCIsInNjcmlwdFRhZyIsImNyZWF0ZUVsZW1lbnQiLCJwYXJlbnROb2RlIiwiYXBwZW5kQ2hpbGQiLCJpc1JlYWR5IiwibG9hZENvbmZpZ0J5RG9tUmVhZHkiLCJsb2FkQ29uZmlnIiwibG9hZENvbmZpZ1doZW5SZWFkeSIsImRvY3VtZW50RWxlbWVudCIsImRvU2Nyb2xsIiwiZnJhbWVFbGVtZW50IiwiZ2V0SXRlbSIsInNlbGZVcGRhdGUiLCJ2ZXJzaW9ucyIsImNvbXBhcmVWZXJzaW9ucyIsInJlbG9hZEZhaWxlZCIsImV4cCIsImdldFRpbWUi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