isv-zebra-page-generator
Version:
斑马页面(solution)生成器
146 lines (102 loc) • 4.94 kB
JavaScript
var _ = require('lodash');
var path = require('path');
var url = require('url');
var preview = require('isv-wh-preview');
var transform = require('isv-seed-transform');
var Debug = require('debug');
var debug = Debug('zebra');
var debugMini = Debug('zebra:mini');
var debugError = Debug('zebra:error');
var debugExtra = Debug('zebra:extra');
var util = require('./util');
var renderBaseUpx = require('./renderBaseUpx');
var CACHE_DIR = '.cachefile'; // 缓存文件夹
var CACHE_SOURCE_NATIVE = 'source.native.js'; // native对应的source文件
var CACHE_SOURCE_ORIGIN = 'source.origin.js'; // index对应的source文件
// var mockData = require('./mock.json');
var env = 'pre'; //env 仅限(local, daily, pre, prod)
// var URL_SOLUTION_BASE = 'http://wh.alibaba-inc.com/prod/files/release/solution/';
module.exports = {
// removeDeps: function(deps){ // 去除pc端公共的库引用,比如io等,因为这些都是通过 solution 引入了;
// var str = JSON.stringify(deps); // 转换成str
// var list = ['loader','node','util','dom','event-gesture','event-dom','event-custom','event','io','ua','querystring','promise','path','json','feature','base','attribute','anim','url','cookie'];
// list.forEach(function(modName){
// var reg = new RegExp('\"'+modName+'\"','g');
// str = str.replace(reg,'\"\"');
// });
// debug('=====> 去除公共模块之后的依赖(字符串):',str);
// debug('=====> 去除公共模块之后的依赖(json);',JSON.parse(str));
// return JSON.parse(str);
// },
// 入口方法
render: function(pageData, runConfig){
var isBaseUpx = !!pageData.guideName;
/* ----------------------------------------------------
如果是基于 upx 的渲染逻辑,使用新的渲染方式
----------------------------------------------------- */
if(isBaseUpx){
return renderBaseUpx(pageData, runConfig);
}
// --- end ---
// === 最开始的斑马模块渲染逻辑
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') {
seed.modules = {};
}
// debugExtra('====> 合并之前的seed:', JSON.stringify(seed),' --- 模块deps:', JSON.stringify(pageData.layout.modules[0].depMap));
// 循环modules,将deps.json合并到seed中
pageData.layout.modules.forEach(function(mod){
debug('====> 模块的deps:', mod.depMap);
seed.modules = _.assign({}, util.removeDeps(mod.depMap), seed.modules);
// 去掉一些node等工具
if(mod.group){
// seed.modules[mod.name + '/index'] = seed.modules[baseModPath + '/index'];
// 如果存在.web依赖,使用该依赖
var baseModPath = mod.group + '/' + mod.name;
var depsForWeb = seed.modules[baseModPath + '/index.web'];
seed.modules[mod.name + '/index'] = depsForWeb ? depsForWeb : seed.modules[baseModPath + '/index'];
seed.modules[mod.name + '/index.web'] = seed.modules[mod.name + '/index']; // 兼容直接引 index.web 的情形
// seed.modules[mod.name + '/index-native.xtpl'] = seed.modules[mod.group + '/' + mod.name + '/index-native.xtpl'];
}
var pkg = {};
var urlObj = url.parse(mod.base);
var modPathInfo = urlObj.pathname.split('/');
// modPathInfo: [ '', 'mod', 'tb-countdown-1111' ]
debugMini('====> modPathInfo:', modPathInfo);
// 模拟 feload 转换seed
// if(runConfig.wh_ttid === 'native') {
var newSeed = transform(seed.modules, mod.name,'0.0.1','zebra-tb');
seed.packages = _.assign({}, seed.packages, newSeed.packages);
seed.modules = _.assign({}, seed.modules, newSeed.modules);
// }
seed.packages[mod.name] = { base : urlObj.protocol + '//' + urlObj.host + '/' + modPathInfo[1] + '/' + mod.name};
});
// 根据配置项生成xtpl
var xtpl = util.getXtpl(siteName, branch, runConfig, seed, pageData);
debugExtra('====> 合并之后的seed:', JSON.stringify(seed));
// 根据pageData组装成用于渲染的数据
var zebraData = util.reassemble(pageData, runConfig);
debug('====> $pageData:', zebraData.$pageData);
var config = util.zebraParams(seed, 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
}
});
}
}