jssdk 改成私有模块化加载器

This commit is contained in:
2betop 2020-06-28 11:50:09 +08:00
parent 8eb0e26e4e
commit 2724063947
2 changed files with 218 additions and 245 deletions

View File

@ -1,292 +1,265 @@
/** /**
* @file: mod.js * @file mod-sandbox.js.
* @author fis
* ver: 1.0.13
* update: 2016/01/27
* https://github.com/fex-team/mod
*/ */
var require; /* eslint-disable */
/* eslint-disable no-unused-vars */
var define;
(function (global) { (function (global) {
var require, define;
var amis = window.amis || {};
var amis = window.amis || {}; // 避免重复加载而导致已定义模块丢失
// 避免重复加载而导致已定义模块丢失 if (amis.require) {
if (require) { return;
return; }
var head = document.getElementsByTagName('head')[0];
var loadingMap = {};
var factoryMap = {};
var modulesMap = {};
var scriptsMap = {};
var resMap = {};
var pkgMap = {};
var createScripts = function (queues, onerror) {
var docFrag = document.createDocumentFragment();
for (var i = 0, len = queues.length; i < len; i++) {
var id = queues[i].id;
var url = queues[i].url;
if (url in scriptsMap) {
continue;
}
scriptsMap[url] = true;
var script = document.createElement('script');
if (onerror) {
(function (script, id) {
var tid = setTimeout(function () {
onerror(id);
}, require.timeout);
script.onerror = function () {
clearTimeout(tid);
onerror(id);
};
var onload = function () {
clearTimeout(tid);
};
if ('onload' in script) {
script.onload = onload;
} else {
script.onreadystatechange = function () {
if (
this.readyState === 'loaded' ||
this.readyState === 'complete'
) {
onload();
}
};
}
})(script, id);
}
script.type = 'text/javascript';
script.src = url;
docFrag.appendChild(script);
} }
var head = document.getElementsByTagName('head')[0]; head.appendChild(docFrag);
var loadingMap = {}; };
var factoryMap = {};
var modulesMap = {};
var scriptsMap = {};
var resMap = {};
var pkgMap = {};
var createScripts = function (queues, onerror) { var loadScripts = function (ids, callback, onerror) {
var queues = [];
for (var i = 0, len = ids.length; i < len; i++) {
var id = ids[i];
var queue = loadingMap[id] || (loadingMap[id] = []);
queue.push(callback);
var docFrag = document.createDocumentFragment(); //
// resource map query
//
var res = resMap[id] || resMap[id + '.js'] || {};
var pkg = res.pkg;
var url;
for (var i = 0, len = queues.length; i < len; i++) { if (pkg) {
var id = queues[i].id; url = pkgMap[pkg].url || pkgMap[pkg].uri;
var url = queues[i].url; } else {
url = res.url || res.uri || id;
}
if (url in scriptsMap) { queues.push({
continue; id: id,
} url: url
});
}
scriptsMap[url] = true; createScripts(queues, onerror);
};
var script = document.createElement('script'); define = function (id, factory) {
if (onerror) { id = id.replace(/\.js$/i, '');
(function (script, id) { factoryMap[id] = factory;
var tid = setTimeout(function () {
onerror(id);
}, require.timeout);
script.onerror = function () { var queue = loadingMap[id];
clearTimeout(tid); if (queue) {
onerror(id); for (var i = 0, n = queue.length; i < n; i++) {
}; queue[i]();
}
delete loadingMap[id];
}
};
var onload = function () { require = function (id) {
clearTimeout(tid); // compatible with require([dep, dep2...]) syntax.
}; if (id && id.splice) {
return require.async.apply(this, arguments);
}
if ('onload' in script) { id = require.alias(id);
script.onload = onload;
}
else {
script.onreadystatechange = function () {
if (this.readyState === 'loaded' || this.readyState === 'complete') {
onload();
}
};
}
})(script, id);
}
script.type = 'text/javascript';
script.src = url;
docFrag.appendChild(script); var mod = modulesMap[id];
} if (mod) {
return mod.exports;
}
head.appendChild(docFrag); //
// init module
//
var factory = factoryMap[id];
if (!factory) {
throw '[ModJS] Cannot find module `' + id + '`';
}
mod = modulesMap[id] = {
exports: {}
}; };
var loadScripts = function (ids, callback, onerror) { //
var queues = []; // factory: function OR value
for (var i = 0, len = ids.length; i < len; i++) { //
var id = ids[i]; var ret =
var queue = loadingMap[id] || (loadingMap[id] = []); typeof factory === 'function'
queue.push(callback); ? factory.apply(mod, [require, mod.exports, mod])
: factory;
// if (ret) {
// resource map query mod.exports = ret;
// }
var res = resMap[id] || resMap[id + '.js'] || {};
var pkg = res.pkg;
var url;
if (pkg) { return mod.exports;
url = pkgMap[pkg].url || pkgMap[pkg].uri; };
}
else {
url = res.url || res.uri || id;
}
queues.push({ require.async = function (names, onload, onerror) {
id: id, if (typeof names === 'string') {
url: url names = [names];
}); }
}
createScripts(queues, onerror); var needMap = {};
}; var needNum = 0;
var needLoad = [];
define = function (id, factory) { function findNeed(depArr) {
id = id.replace(/\.js$/i, ''); var child;
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;
}
for (var i = 0, n = depArr.length; i < n; i++) {
// //
// init module // skip loading or loaded
// //
var factory = factoryMap[id]; var dep = require.alias(depArr[i]);
if (!factory) {
throw '[ModJS] Cannot find module `' + id + '`'; if (dep in needMap) {
continue;
} }
mod = modulesMap[id] = { needMap[dep] = true;
exports: {}
};
// if (dep in factoryMap) {
// factory: function OR value // check whether loaded resource's deps is loaded or not
// child = resMap[dep] || resMap[dep + '.js'];
var ret = (typeof factory === 'function') ? factory.apply(mod, [require, mod.exports, mod]) : factory; if (child && 'deps' in child) {
findNeed(child.deps);
if (ret) { }
mod.exports = ret; continue;
} }
return mod.exports; needLoad.push(dep);
}; needNum++;
require.async = function (names, onload, onerror) { child = resMap[dep] || resMap[dep + '.js'];
if (typeof names === 'string') { if (child && 'deps' in child) {
names = [names]; 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]);
} }
var needMap = {}; onload && onload.apply(global, args);
var needNum = 0; }
var needLoad = []; }
function findNeed(depArr) { findNeed(names);
var child; loadScripts(needLoad, updateNeed, onerror);
updateNeed();
};
for (var i = 0, n = depArr.length; i < n; i++) { require.ensure = function (names, callback) {
// require.async(names, function () {
// skip loading or loaded callback && callback.call(this, require);
// });
var dep = require.alias(depArr[i]); };
if (dep in needMap) { require.resourceMap = function (obj) {
continue; var k;
} var col;
needMap[dep] = true; // merge `res` & `pkg` fields
col = obj.res;
for (k in col) {
if (col.hasOwnProperty(k)) {
resMap[k] = col[k];
}
}
if (dep in factoryMap) { col = obj.pkg;
// check whether loaded resource's deps is loaded or not for (k in col) {
child = resMap[dep] || resMap[dep + '.js']; if (col.hasOwnProperty(k)) {
if (child && 'deps' in child) { pkgMap[k] = col[k];
findNeed(child.deps); }
} }
continue; };
}
needLoad.push(dep); require.loadJs = function (url) {
needNum++; if (url in scriptsMap) {
return;
}
child = resMap[dep] || resMap[dep + '.js']; scriptsMap[url] = true;
if (child && 'deps' in child) {
findNeed(child.deps);
}
}
}
function updateNeed() { var script = document.createElement('script');
if (0 === needNum--) { script.type = 'text/javascript';
var args = []; script.src = url;
for (var i = 0, n = names.length; i < n; i++) { head.appendChild(script);
args[i] = require(names[i]); };
}
onload && onload.apply(global, args); require.alias = function (id) {
} return id.replace(/\.js$/i, '');
} };
findNeed(names); require.timeout = 5000;
loadScripts(needLoad, updateNeed, onerror);
updateNeed();
};
require.ensure = function (names, callback) {
require.async(names, function () {
callback && callback.call(this, require);
});
};
require.resourceMap = function (obj) {
var k;
var 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) {
if (url in scriptsMap) {
return;
}
scriptsMap[url] = true;
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
head.appendChild(script);
};
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;
amis.require = require;
amis.define = define;
window.amis = amis;
amis.require = require;
amis.define = define;
window.amis = amis;
// window.require = window.require || require;
})(this); })(this);

View File

@ -7,7 +7,7 @@ export interface ApiObject {
withCredentials?: boolean; withCredentials?: boolean;
cancelExecutor?: (cancel: Function) => void; cancelExecutor?: (cancel: Function) => void;
}; };
autoRefresh: boolean; // 是否自动刷新,当 url 中的取值结果变化时,自动刷新数据。 autoRefresh?: boolean; // 是否自动刷新,当 url 中的取值结果变化时,自动刷新数据。
reload?: string; reload?: string;
sendOn?: string; sendOn?: string;
adaptor?: (payload: object, response: fetcherResult, api: ApiObject) => any; adaptor?: (payload: object, response: fetcherResult, api: ApiObject) => any;