UNPKG

monitor-rcl

Version:

monitor-rcl

1,405 lines (1,198 loc) 128 kB
(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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