UNPKG

@wenbo/fis3-postpackager-loader

Version:
188 lines (151 loc) 6.59 kB
var createResource = require('./lib/resource.js'); var allInOnePack = require('./lib/pack.js'); var _ = fis.util; var reg = /"(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*'|(\/\/[^\r\n\f]+|\/\*[\s\S]*?(?:\*\/|$))|\b(__inline|__uri|__require|__id|__moduleId|__hash)\s*\(\s*("(?:[^\\"\r\n\f]|\\[\s\S])*"|'(?:[^\\'\n\r\f]|\\[\s\S])*')\s*\)/g; /** * 粗暴的打包器,纯前端嘛,不能识别模板语言,所以处理所有分析到的资源。 */ function rudePackager(ret, pack, settings, opt) { var index = 1; var files = ret.src; var sources = _.toArray(files); var cssPkgSets = [], jsPkgSets = []; // 生成映射表,方便快速查找! var idmapping = ret.idmapping = {}; var urlmapping = ret.urlmapping = {}; Object.keys(files).forEach(function (subpath) { var file = files[subpath]; idmapping[file.id] = file; if (file.release) { urlmapping[file.getUrl()] = file; } }); var includeList = []; // 如果有设置需要额外的模块加入到 resouceMap 当中 if (settings.include) { var patterns = settings.include; if (!Array.isArray(patterns)) { patterns = [patterns]; } patterns.forEach(function (pattern, index) { var exclude = typeof pattern === 'string' && pattern.substring(0, 1) === '!'; if (exclude) { pattern = pattern.substring(1); // 如果第一个规则就是排除用法,都没有获取结果就排除,这是不合理的用法。 // 不过为了保证程序的正确性,在排除之前,通过 `**` 先把所有文件获取到。 // 至于性能问题,请用户使用时规避。 index === 0 && (includeList = find('**')); } var mathes = find(pattern); includeList = _[exclude ? 'difference' : 'union'](includeList, mathes); }); } Object.keys(files).forEach(function (subpath) { var file = files[subpath]; compile(file); }); function find(reg) { if (files[reg]) { return [files[reg]]; } else if (reg === '**') { // do nothing } else if (typeof reg === 'string') { reg = _.glob(reg); } return sources.filter(function (file) { reg.lastIndex = 0; return (reg === '**' || reg.test(file.subpath)); }); } function compile(file) { var processor = rudePackager.lang[file.loaderLang] || rudePackager.lang[settings.processor[file.ext]] || rudePackager.lang.html; // 非 htmlLike 或者 没有处理器,或者已经处理过了,则跳过。 if (file.release === false || file.loaderLang === false || file.loaderLang === null || !processor || file._resource) { return; } if(!file.isHtmlLike && file.loaderLang === 'jsEntry'){ var jsResource = createResource(ret, file, settings); processor.init&&processor.init(file, jsResource, settings); require('./lib/js_pack')(file, jsResource, ret, settings.allInOne === true ? {} : settings.allInOne,index); file.useCache = false; // 让其缓存失效,watch 的时候,下次需要重新发布过去。 return; } if(!file.isHtmlLike ){ return; } //components目录下的html不被该插件编译处理 if(file.subpath.indexOf('/components/') === 0){ return; } // 可以让 processor 调用。 processor._compile = compile; // 修改之前先,先备份。 file._rudeBackup = file.getContent(); var resource = createResource(ret, file, settings); file._resource = resource; processor.init && processor.init(file, resource, settings); processor.beforePack && processor.beforePack(file, resource, settings, includeList); if (settings.allInOne) { // console.log("postpackager-loader:compile "+ file.subpath + " and " + file.release); index = allInOnePack(file, resource, ret, settings.allInOne === true ? {} : settings.allInOne,index); } processor.before && processor.before(file, resource, settings); processor(file, resource, settings); processor.after && processor.after(file, resource, settings); file.useCache = false; // 让其缓存失效,watch 的时候,下次需要重新发布过去。 ret.pkg[file.subpath] = file; } } rudePackager.lang = { html: require('./lib/lang/html.js'), jsEntry: require('./lib/lang/jsEntry.js'), cssEntry: require('./lib/lang/cssEntry.js') }; // 默认配置信息 rudePackager.defaultOptions = { // 脚本占位符 scriptPlaceHolder: '<!--SCRIPT_PLACEHOLDER-->', // 样式占位符 stylePlaceHolder: '<!--STYLE_PLACEHOLDER-->', // 资源占位符 resourcePlaceHolder: '<!--RESOURCEMAP_PLACEHOLDER-->', dependenciesInjectPlaceHolder: '<!--DEPENDENCIES_INJECT_PLACEHOLDER-->', // 资源表格式。 // 可选: // - `auto` 根据用户选择的 js 来自动设置。 // - `mod` 生成适合 mod.js 的版本。 // - `amd` 生成适合 require.js 的版本。 // - `cmd` 生成适合 sea.js 的版本 // - `system` 生成适合 system.js 的版本 resourceType: 'auto', // 页面类型 // 可选: // - `html` 普通 html 页面 processor: { '.html': 'html' }, // 是否将所有零散文件合并成一个文件。 // 如果用户配置 pack, 则 用户配置的 pack 优先。 allInOne: false/*{ css: '', // 打包后 css 的文件路径。 js: '', // 打包后 js 的文件路径。 includeAsyncs: false, // 可以配置成 true 用来包含异步依赖。 ignore: null // 忽略列表,可以配置部分文件不被 all in one. }*/, // 是否捕获页面内的 <script src="xxx"> 资源 // 捕获完后,会合并部分资源, 统一放在页面底部。 obtainScript: true, // 是否捕获页面内的 <link ref="stylesheet"></link> // 捕获后,会合并部分资源,统一放在页首。 obtainStyle: true, // 生成的 resourcemap 是内联呢?还是生成 js 文件外链? useInlineMap: false, loaderScripts: ['require.js', 'esl.js', 'mod.js', 'sea.js', 'system.js'] }; module.exports = rudePackager;