mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
77 lines
1.8 KiB
JavaScript
77 lines
1.8 KiB
JavaScript
import PackageList from './PackageList';
|
|
import CssLoader from '../utils/CssLoader';
|
|
import JsLoader from '../utils/JsLoader';
|
|
|
|
const loaded = new Map();
|
|
|
|
/**
|
|
* 包管理器
|
|
* @author tengge / https://github.com/tengge1
|
|
*/
|
|
function PackageManager() {
|
|
|
|
};
|
|
|
|
/**
|
|
* 加载包
|
|
* @param {*} names 包名或包名列表
|
|
*/
|
|
PackageManager.prototype.require = function (names) {
|
|
names = Array.isArray(names) ? names : [names];
|
|
|
|
var assets = [];
|
|
|
|
names.forEach(n => {
|
|
if (loaded.has(n)) { // 该包已经加载
|
|
return true;
|
|
}
|
|
|
|
loaded.set(n, true);
|
|
|
|
var packages = PackageList.filter(m => m.name === n);
|
|
if (packages.length === 0) {
|
|
console.warn(`PackageManager: 包${n}不存在!`);
|
|
return true;
|
|
} else if (packages.length > 1) {
|
|
console.warn(`PackageManager: 包名${n}重复!`);
|
|
}
|
|
packages.forEach(m => {
|
|
assets.push.apply(assets, m.assets);
|
|
});
|
|
});
|
|
|
|
if (assets.length === 0) {
|
|
return new Promise(resolve => {
|
|
resolve();
|
|
});
|
|
}
|
|
|
|
return this._load(assets);
|
|
};
|
|
|
|
PackageManager.prototype._load = function (assets = []) {
|
|
var cssLoader = new CssLoader();
|
|
var jsLoader = new JsLoader();
|
|
|
|
var promises = assets.map(n => {
|
|
if (n.toLowerCase().endsWith('.css')) {
|
|
return cssLoader.load(n);
|
|
} else if (n.toLowerCase().endsWith('.js')) {
|
|
return jsLoader.load(n);
|
|
} else {
|
|
console.warn(`PackageManager: 未知资源类型${n}。`);
|
|
return new Promise(resolve => {
|
|
resolve();
|
|
});
|
|
}
|
|
});
|
|
|
|
return new Promise(resolve => {
|
|
Promise.all(promises).then(() => {
|
|
jsLoader.eval();
|
|
resolve();
|
|
});
|
|
});
|
|
};
|
|
|
|
export default PackageManager; |