isv-zebra-page-generator
Version:
斑马页面(solution)生成器
157 lines (111 loc) • 4.51 kB
JavaScript
var preview = require('isv-wh-preview');
var SeedUtil = require('isv-upx-seed-util');
var Filter = SeedUtil.Filter; // 使用 SeedUtil 中的 Filter
var util = require('./util');
var url = require('url');
var _ = require('lodash');
var Promise = require('bluebird');
var Debug = require('debug');
var debug = Debug('zebra');
var debugMini = Debug('zebra:mini');
var debugError = Debug('zebra:error');
var debugExtra = Debug('zebra:extra');
var env = 'pre'; //env 仅限(local, daily, pre, prod)
var PATH_MOD_BASE = 'upx'; // 模块的基准路径
var PATH_COM_BASE = 'npm'; // 组件的基准路径
var CDN_BASE = '//g.alicdn.com';
function getSeedJson(modules, endType, upxClient){
var modInfoArr = modules.map(function(mod){
return {
"name": mod.name,
"version": mod.version,
"deps": mod.depMap
}
});
debugExtra('=====> 传入的 modInfoArr:', JSON.stringify(modInfoArr));
var seedConfig = {
"gitGroupName" : modules[0].group,
"host": CDN_BASE + '/',
"type": endType,
"suffix": '.cmd',
"upxClient": upxClient,
"modules": modInfoArr
}
debugExtra('=====> seedConfig:', JSON.stringify(seedConfig));
var seedUtil = new SeedUtil(seedConfig);
return seedUtil.exportSeed().then(function(newSeed){
debugExtra('=====> 获取的 defaultSeed:', JSON.stringify(newSeed));
_.forEach(modules, function(mod){
// var pkg = {};
var urlObj = url.parse(mod.base);
var modPathInfo = urlObj.pathname.split('/');
var baseModPath = [PATH_MOD_BASE, mod.group, mod.name].join('/');
newSeed.packages[baseModPath] = { base : urlObj.protocol + '//' + urlObj.host + '/' + modPathInfo[1] + '/' + mod.name};
});
return newSeed;
});
}
function getAllDepsArr(depsMap){
// 将所有依赖数组扔到页面里,外加入口文件的,upx 开始的需要取其 requires 内容
var depsArr = _.keys(depsMap).reduce(function(arr, current){
if(current.indexOf('upx/')==0){
var value = depsMap[current];
var deps = value && value.requires || [];
arr.concat(deps);
} else {
arr.push(current);
}
return arr;
},[]);
return _.uniq(depsArr); // 需要去重
}
module.exports = function(pageData, runConfig){
var siteName = runConfig.siteName || 'tb-rx-native'; // 默认使用 'tb-rx-native' 的 solution站点
var self = this;
var branch = runConfig.siteBranch || 'master'; // 默认读取master分支
console.log('=== 所使用solution的信息:',siteName,'(',branch,')(通用形)');
// 获取基础seed.json文件,只有h5页面会用到
var seed = util.getFileContent(siteName, branch, 'seed.json', true);
// native页面不需要 seed.modules (因为写到solution中去了)
if(runConfig.wh_ttid === 'native') {
newSeed.modules = {};
}
var endType = util.getEndType(runConfig);
return Promise.resolve().then(function(){
return getSeedJson(pageData.layout.modules, endType, util.upxClient);
}).then(function(newSeed){
// 合并原来的seed信息
newSeed.packages = _.assign({}, seed.packages, newSeed.packages);
newSeed.modules = _.assign({}, seed.modules, newSeed.modules);
debugExtra('=====> 处理后的 seed:', JSON.stringify(newSeed));
// 为了air顺利去重,只保留高版本、磨平入口文件差异;
newSeed.modules = Filter.maxVersionUniq(newSeed.modules, endType);
debugExtra('=====> seed 抹平版本号差异:', JSON.stringify(newSeed));
// 根据配置项生成xtpl
var xtpl = util.getXtpl(siteName, branch, runConfig, newSeed, pageData);
var extraDeps = getAllDepsArr(newSeed.modules); // 获取所有的额外依赖
debugExtra('=====> extraDeps require:', '<body>{{require("'+extraDeps.join(',')+'")');
// 注入到页面中去
xtpl = xtpl.replace('<body>', '<body>{{require("'+extraDeps.join(',')+'")}}');
debugExtra('====> 用于渲染的 xtpl:', xtpl);
// 根据pageData组装成用于渲染的数据
var zebraData = util.reassemble(pageData, runConfig);
debug('====> $pageData:', zebraData.$pageData);
newSeed.modules = _.assign({}, util.removeDeps(newSeed.modules));
var config = util.zebraParams(newSeed, xtpl, zebraData);
return preview(config, env);
}).then(data => {
debugMini('=====> tmall斑马渲染内容成功');
// debug('=====> tmall斑马渲染内容:',data);
return {
success: true,
content: data
}
}).catch( err =>{
debugError('=====> tmall斑马渲染失败,失败信息:', err);
return {
success: false,
content: err
}
});
}