moles-packer
Version:
Builder for React Native projects.
129 lines (106 loc) • 3.69 kB
JavaScript
/**
* 资源处理方法集。
* @author jiangjing
*/
;
var MODULE_REQUIRE
, fs = require('fs')
, path = require('path')
, yuancon = require('yuan-console')
;
var LIB_REQUIRE
, CONFIG = require('./parseConfig')()
, OPTIONS = require('./parseOptions')()
, exporter = require('./exporter')
, inform = require('./inform')
, transform
;
var _ME = {};
_ME.getTransform = function(that) {
transform = that;
};
// 获取目前所支持的所有模块。
_ME.PLUGINS = {};
fs.readdirSync(path.join(__dirname, './AssetsPlugin')).forEach((name) => {
_ME.PLUGINS[name] = require('./AssetsPlugin/' + name);
});
_ME.registered = [];
/**
* @param {object} options
* @param {UglifyJS.AST_Node}
* options.node
* @param {String} options.sourceRealpath
* @param {String} options.requireName
*
* @param {object} asset
* @param {String} asset.componentName
*/
_ME.getRequireName = (options, asset) => {
var ComponentName = asset.componentName;
var relapth = path.relative(OPTIONS.input, path.join(options.sourceRealpath, '..', options.requireName));
// 获取模块的注册名称。
// 以 / 起始代表这是一个特殊模块(不同于基于真实脚本的模块)。
var moduleName = exporter.uniformModuleName(path.join('/', CONFIG.path.assetModules, ComponentName, relapth + '.js'));
// 如果模块尚未注册,则:
// 0. 调用插件,拷贝相关资源文件,并生成注册脚本代码;
// 1. 创建注脚脚本文件;
if (_ME.registered.indexOf(moduleName) < 0) {
// 注册脚本文件的真实路径。
let jsRealpath = exporter.name2realpath(moduleName);
// 由于生成注册脚本代码的过程是异步的,
// 故,如果需要捆绑输出代码,则需要先预留该信息(表明相关模块脚本正在创建中)。
if (OPTIONS.bundle) {
transform.waitByModuleName(moduleName);
}
// 创建 Asset 模块脚本。
// 注意:这是一个异步调用。
options.sourceRoot = OPTIONS.input;
options.moduleName = moduleName;
options.outputRoot = OPTIONS.output;
// 创建事务序列号,默认注册该事务。
var eventId = inform.genEventId();
_ME.PLUGINS[ComponentName].generateCode(options, (err, code) => {
if (err) {
return inform.exit(err);
}
code = exporter.format(code);
// 通知主流程,模块脚本创建完成。
if (OPTIONS.bundle) {
transform.addModule({
name: moduleName,
type: 'asset',
code: code
});
transform.setReadyByModuleInfo(moduleName);
}
else {
inform.log({ target: jsRealpath , type: 'asset' });
// 写入脚本文件。
fs.writeFileSync(jsRealpath, code, 'utf8');
}
// 通知主流程该项事务完成。
inform.end(eventId);
});
// 登记为已注册。
_ME.registered.push(moduleName);
}
return moduleName;
};
/**
* options.node
* options.sourceRealpath
* options.requireName
*/
_ME.findRequireName = (options) => {
for (var name in _ME.PLUGINS) {
var asset = _ME.PLUGINS[name].match(options);
if (asset) {
asset.componentName = name;
/**
* asset.componentName
*/
return _ME.getRequireName(options, asset);
}
}
};
module.exports = _ME;