235 lines
5.8 KiB
JavaScript
Executable File
235 lines
5.8 KiB
JavaScript
Executable File
/**
|
|
* file: mod.js
|
|
* ver: 1.0.11
|
|
* update: 2015/05/14
|
|
*
|
|
* https://github.com/fex-team/mod
|
|
*/
|
|
'use strict';
|
|
|
|
var require, define;
|
|
|
|
(function (global) {
|
|
if (require) return; // 避免重复加载而导致已定义模块丢失
|
|
|
|
var head = document.getElementsByTagName('head')[0],
|
|
loadingMap = {},
|
|
factoryMap = {},
|
|
modulesMap = {},
|
|
scriptsMap = {},
|
|
resMap = {},
|
|
pkgMap = {};
|
|
|
|
function createScript(url, onerror) {
|
|
if (url in scriptsMap) return;
|
|
scriptsMap[url] = true;
|
|
|
|
var script = document.createElement('script');
|
|
if (onerror) {
|
|
var tid;
|
|
|
|
(function () {
|
|
var onload = function onload() {
|
|
clearTimeout(tid);
|
|
};
|
|
|
|
tid = setTimeout(onerror, require.timeout);
|
|
|
|
script.onerror = function () {
|
|
clearTimeout(tid);
|
|
onerror();
|
|
};
|
|
|
|
if ('onload' in script) {
|
|
script.onload = onload;
|
|
} else {
|
|
script.onreadystatechange = function () {
|
|
if (this.readyState == 'loaded' || this.readyState == 'complete') {
|
|
onload();
|
|
}
|
|
};
|
|
}
|
|
})();
|
|
}
|
|
script.type = 'text/javascript';
|
|
script.src = url;
|
|
head.appendChild(script);
|
|
return script;
|
|
}
|
|
|
|
function loadScript(id, callback, onerror) {
|
|
var queue = loadingMap[id] || (loadingMap[id] = []);
|
|
queue.push(callback);
|
|
|
|
//
|
|
// resource map query
|
|
//
|
|
var res = resMap[id] || resMap[id + '.js'] || {};
|
|
var pkg = res.pkg;
|
|
var url;
|
|
|
|
if (pkg) {
|
|
url = pkgMap[pkg].url;
|
|
} else {
|
|
url = res.url || id;
|
|
}
|
|
|
|
createScript(url, onerror && function () {
|
|
onerror(id);
|
|
});
|
|
}
|
|
|
|
define = function (id, factory) {
|
|
id = id.replace(/\.js$/i, '');
|
|
factoryMap[id] = factory;
|
|
|
|
var queue = loadingMap[id];
|
|
if (queue) {
|
|
for (var i = 0, n = queue.length; i < n; i++) {
|
|
queue[i]();
|
|
}
|
|
delete loadingMap[id];
|
|
}
|
|
};
|
|
|
|
require = function (id) {
|
|
|
|
// compatible with require([dep, dep2...]) syntax.
|
|
if (id && id.splice) {
|
|
return require.async.apply(this, arguments);
|
|
}
|
|
|
|
id = require.alias(id);
|
|
|
|
var mod = modulesMap[id];
|
|
if (mod) {
|
|
return mod.exports;
|
|
}
|
|
|
|
//
|
|
// init module
|
|
//
|
|
var factory = factoryMap[id];
|
|
if (!factory) {
|
|
throw '[ModJS] Cannot find module `' + id + '`';
|
|
}
|
|
|
|
mod = modulesMap[id] = {
|
|
exports: {}
|
|
};
|
|
|
|
//
|
|
// factory: function OR value
|
|
//
|
|
var ret = typeof factory == 'function' ? factory.apply(mod, [require, mod.exports, mod]) : factory;
|
|
|
|
if (ret) {
|
|
mod.exports = ret;
|
|
}
|
|
return mod.exports;
|
|
};
|
|
|
|
require.async = function (names, onload, onerror) {
|
|
if (typeof names == 'string') {
|
|
names = [names];
|
|
}
|
|
|
|
var needMap = {};
|
|
var needNum = 0;
|
|
|
|
function findNeed(depArr) {
|
|
for (var i = 0, n = depArr.length; i < n; i++) {
|
|
//
|
|
// skip loading or loaded
|
|
//
|
|
var dep = require.alias(depArr[i]);
|
|
|
|
if (dep in factoryMap) {
|
|
// check whether loaded resource's deps is loaded or not
|
|
var child = resMap[dep] || resMap[dep + '.js'];
|
|
if (child && 'deps' in child) {
|
|
findNeed(child.deps);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if (dep in needMap) {
|
|
continue;
|
|
}
|
|
|
|
needMap[dep] = true;
|
|
needNum++;
|
|
loadScript(dep, updateNeed, onerror);
|
|
|
|
var child = resMap[dep] || resMap[dep + '.js'];
|
|
if (child && 'deps' in child) {
|
|
findNeed(child.deps);
|
|
}
|
|
}
|
|
}
|
|
|
|
function updateNeed() {
|
|
if (0 == needNum--) {
|
|
var args = [];
|
|
for (var i = 0, n = names.length; i < n; i++) {
|
|
args[i] = require(names[i]);
|
|
}
|
|
|
|
onload && onload.apply(global, args);
|
|
}
|
|
}
|
|
|
|
findNeed(names);
|
|
updateNeed();
|
|
};
|
|
|
|
require.resourceMap = function (obj) {
|
|
var k, col;
|
|
|
|
// merge `res` & `pkg` fields
|
|
col = obj.res;
|
|
for (k in col) {
|
|
if (col.hasOwnProperty(k)) {
|
|
resMap[k] = col[k];
|
|
}
|
|
}
|
|
|
|
col = obj.pkg;
|
|
for (k in col) {
|
|
if (col.hasOwnProperty(k)) {
|
|
pkgMap[k] = col[k];
|
|
}
|
|
}
|
|
};
|
|
|
|
require.loadJs = function (url) {
|
|
createScript(url);
|
|
};
|
|
|
|
require.loadCss = function (cfg) {
|
|
if (cfg.content) {
|
|
var sty = document.createElement('style');
|
|
sty.type = 'text/css';
|
|
|
|
if (sty.styleSheet) {
|
|
// IE
|
|
sty.styleSheet.cssText = cfg.content;
|
|
} else {
|
|
sty.innerHTML = cfg.content;
|
|
}
|
|
head.appendChild(sty);
|
|
} else if (cfg.url) {
|
|
var link = document.createElement('link');
|
|
link.href = cfg.url;
|
|
link.rel = 'stylesheet';
|
|
link.type = 'text/css';
|
|
head.appendChild(link);
|
|
}
|
|
};
|
|
|
|
require.alias = function (id) {
|
|
return id.replace(/\.js$/i, '');
|
|
};
|
|
|
|
require.timeout = 5000;
|
|
})(undefined); |