fis3-postprocessor-yymonitor
Version:
yy前端监控系统 页面组件 fis3 版本
89 lines (66 loc) • 2.85 kB
JavaScript
/*
* YY前端监控
* http://fed.yy.com/
*/
;
var path = require('path'),
fs = require('fs'),
cheerio = require('cheerio'),
request = require('sync-request'),
async = require("async");
var loadFunMap = {
"onerror": "__FEQUALITY__.lostCallBack(this)"
};
var baseClass = "__fequality__base",
emptyClass = "__fequality_empty",
loadClass = "__fequality_load",
loadId = "__FEQUALITY__QID";
var loadScriptSrc = "http://szhuodong.duowan.com/s/rp/fequality/yy-loadScript.min.js";
var baseTpl = '<script class="' + baseClass + '">\n window.__FEQUALITY__ = {}; \n window.__FEQUALITY__.errorQueue = [];\n window.__FEQUALITY__.lostSrcQueue = [];\n window.__FEQUALITY__.lostCallBack = function(el){\n el.onerror = null; \n window.__FEQUALITY__.lostSrcQueue.push(el.src);\n }\n window.onerror = function(){\n window.__FEQUALITY__.errorQueue.push(arguments);\n return "yyF2E_ErrorRerport";\n }\n \n</script>',
emptyTime = '<script class="' + emptyClass + '">\n !window.__FEQUALITY__ &&( window.__FEQUALITY__ = {});\n window.__FEQUALITY__.yy_reportEmptyTimeEnd = new Date().getTime();\n</script>';
var lostSrcReport = function($){
var $scriptTagSet = $("script");
if($scriptTagSet.length){
$scriptTagSet.each(function(index, item){
var $t = $(item);
if ($t.attr("src")) {
$t.attr(loadFunMap);
}
});
}
return $;
}
var initDoc = function($, loadScript, options){
$("." + baseClass).remove();
$("." + emptyClass).remove();
$("." + loadClass).remove();
var headTag = $("head"),
firstScriptTag = headTag.find("script").first(),
bodyTag = $("body"),
loadScriptTag = "\n<script id='" + loadId + "' qid=" + options.qid + " class='" + loadClass + "'>\n\n" + loadScript + "\n\n</script>\n";
if(firstScriptTag.length) {
firstScriptTag.before(baseTpl);
}else{
headTag.append(baseTpl);
}
headTag.append(emptyTime);
bodyTag.append(loadScriptTag);
}
var processFile = function($, scriptContent, conf){
fis.log.info('开始注入监控脚本.');
initDoc($, scriptContent, conf);
// 注入丢失上报
if(conf.lostSrcReport){
$ = lostSrcReport($);
}
return $.html({decodeEntities: false});
}
module.exports = function(content, file, conf){
fis.log.info('正在加载远程监控脚本.');
var res = request('GET', loadScriptSrc);
var scriptContent = res.getBody().toString();
var $ = cheerio.load(content, {lowerCaseAttributeNames: false});
// 处理文件,添加监控脚本
var newContent = processFile($, scriptContent, conf);
return newContent;
};