UNPKG

fis3-postpackager-robot

Version:
128 lines (106 loc) 3.64 kB
/** * 分析依赖,将同步文件和异步文件分别打包 * @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) }