fis3-postpackager-robot
Version:
128 lines (106 loc) • 3.64 kB
JavaScript
/**
* 分析依赖,将同步文件和异步文件分别打包
* @param {Object} entry 每个模板入口文件
* @param {Object} ret
* @param {Object} options
* @return {undefined}
*/
var pkgCount = 0;
module.exports = function(entry, ret, options) {
var packed = {};
var root = fis.project.getProjectPath();
var map = {
pkg: {},
res: Object.assign({}, ret.map.res)
}
var asyncFiles = [entry]
function pack(file) {
var pkgBaseName = 'pkg/pkg_' + file.filename + '_' + pkgCount++;
var jsDeps = [];
var cssDeps = [];
if(!parseDeps(file, jsDeps, cssDeps, pkgBaseName)) {
return
}
var _content = file.getContent();
if (jsDeps.length > 0) {
var jsPkgId = pkgBaseName + '.js';
var jsPkg = fis.file(root, options.releasePathPrefix + jsPkgId);
jsPkg.setContent(jsDeps.reduce(function(content, id) {
return content + ret.ids[id].getContent()
}, ''));
ret.pkg[jsPkgId] = jsPkg;
map.pkg[jsPkgId] = {
type: 'js',
uri: options.urlPrefix + jsPkgId,
has: jsDeps,
injected: false
}
if(~_content.indexOf(options.scriptPlaceHolder)) {
map.pkg[jsPkgId].injected = true;
_content = _content.replace(options.scriptPlaceHolder, '<script type="text/javascript" src="'+ options.urlPrefix + jsPkgId+'"></script>');
}
}
if (cssDeps.length > 0) {
var cssPkgId = pkgBaseName + '.css';
var cssPkg = fis.file(root, options.releasePathPrefix + cssPkgId);
cssPkg.setContent(cssDeps.reduceRight(function(content, id) {
return content + ' ' + ret.ids[id].getContent()
}, ''));
ret.pkg[cssPkgId] = cssPkg;
map.pkg[cssPkgId] = {
type: 'css',
uri: options.urlPrefix + cssPkgId,
has: cssDeps,
injected: false
}
if(~_content.indexOf(options.stylePlaceHolder)) {
map.pkg[cssPkgId].injected = true;
_content = _content.replace(options.stylePlaceHolder, '<link type="text/css" rel="stylesheet" href="'+options.urlPrefix + cssPkgId+'"></link>')
}
}
file.setContent(_content);
}
function parseDeps(file, jsDeps, cssDeps, pkgBaseName) {
var id = file.id;
if (packed[id]) {
return false
}
packed[id] = true;
if (file.rExt === '.js') {
jsDeps.unshift(file.id);
} else if (file.rExt === '.css') {
cssDeps.unshift(file.id);
}
var resInfo = map.res[id];
if (resInfo) {
map.res[id] = Object.assign({}, resInfo, {
pkg: pkgBaseName + file.rExt
})
}
for (var len = file.requires.length; len--;) {
var nextFile = ret.ids[file.requires[len]];
parseDeps(nextFile, jsDeps, cssDeps, pkgBaseName);
}
for (var asyncIndex = file.asyncs.length; asyncIndex--;) {
var nextFile = ret.ids[file.asyncs[asyncIndex]];
if (!packed[nextFile.id] && !existInAsyncFiles(file)) {
asyncFiles.push(nextFile)
}
}
return true
}
function existInAsyncFiles(file) {
const idx = asyncFiles.findIndex(function(f){
return f.id == file.id
})
return idx != -1
}
while(asyncFiles.length > 0) {
pack(asyncFiles.shift())
}
var content = entry.getContent()
if (~content.indexOf(options.resourceMapPlaceHolder)) {
content = content.replace(options.resourceMapPlaceHolder, '<script type="text/javascript">require.resourceMap(' + JSON.stringify(map) + ')</script>');
}
entry.setContent(content)
}