isv-page-json-to-xtpl
Version:
abs 将页面 json 转换成 html
78 lines (77 loc) • 2.05 kB
JavaScript
/**
* 页面调试相关的处理逻辑
*/
;
let _ = require('lodash');
let req = require('request');
let Promise = require('bluebird');
let pageAssets = module.exports = {
/**
* 获取不存在的资源
* @param content 页面内容
*/
noExistAssetPaths: function*(content){
let assetPaths = [];
let scripts = pageAssets.getAssetsFromHtml('js',content,true);
if(scripts.length){
yield Promise.map(scripts,function(script){
return pageAssets.getAssetContent(script).then(function(result){
//不存在 asset 内容
if(!result.success){
assetPaths.push(result.path);
}
});
})
}
return assetPaths;
},
/**
* 从 html 中获取asset
*/
getAssetsFromHtml: function(type,content,openCombo){
let patt = type === 'js' && /<script[^>]+src=['"]([^'"]+)['"]+/g || /<link[^>]+href=['"]([^'"]+)['"]+/g;
let temp;
let assets = [];
while( (temp= patt.exec(content)) != null ) {
let url = temp[1];
//解开combo
if(openCombo){
let aUrl = url.split('??');
//带有combo的 url
if(aUrl[1]){
let modUrls = aUrl[1].split(',');
_.each(modUrls,function(modUrl){
assets.push(aUrl[0].replace(/\/$/,'')+'/'+modUrl);
})
}else{
assets.push(url);
}
}else{
assets.push(url);
}
}
return assets;
},
/**
* 获取 asset 内容
* @param assetPath
* @returns {*}
*/
getAssetContent: function(assetPath){
return new Promise(function(resolve, reject) {
assetPath = assetPath.replace(/^\/\//, 'http://');
req( {
url: assetPath,
headers: {
'User-Agent': 'request'
}
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve({success:true,content:body,path:assetPath});
}else{
resolve({success:false,content:null,path:assetPath});
}
});
});
}
};