@vue-async/module-loader
Version:
Module Loader Core.
101 lines • 3.56 kB
JavaScript
/**
* @author Hubert
* fork from https://github.com/kuitos/import-html-entry/blob/master/src/utils.js
*/
import warning from 'warning';
var isIE11 = typeof navigator !== 'undefined' && navigator.userAgent.indexOf('Trident') !== -1;
function shouldSkipProperty(global, p) {
if (!global.hasOwnProperty(p) || (!isNaN(p) && parseInt(p) < global.length))
return true;
if (isIE11) {
// https://github.com/kuitos/import-html-entry/pull/32,最小化 try 范围
try {
return global[p] && global[p].parent === window;
}
catch (err) {
return true;
}
}
else {
return false;
}
}
// safari unpredictably lists some new globals first or second in object order
var firstGlobalProp, secondGlobalProp, lastGlobalProp;
function getGlobalProp(global) {
var cnt = 0;
var lastProp;
var hasIframe = false;
for (var p in global) {
if (shouldSkipProperty(global, p))
continue;
// 遍历 iframe,检查 window 上的属性值是否是 iframe,是则跳过后面的 first 和 second 判断
for (var i = 0; i < window.frames.length && !hasIframe; i++) {
var frame = window.frames[i];
if (frame === global[p]) {
hasIframe = true;
break;
}
}
if (!hasIframe && ((cnt === 0 && p !== firstGlobalProp) || (cnt === 1 && p !== secondGlobalProp)))
return p;
cnt++;
lastProp = p;
}
if (lastProp !== lastGlobalProp)
return lastProp;
return;
}
function noteGlobalProps(global) {
// alternatively Object.keys(global).pop()
// but this may be faster (pending benchmarks)
firstGlobalProp = secondGlobalProp = undefined;
for (var p in global) {
if (shouldSkipProperty(global, p))
continue;
if (!firstGlobalProp)
firstGlobalProp = p;
else if (!secondGlobalProp)
secondGlobalProp = p;
lastGlobalProp = p;
}
return lastGlobalProp;
}
/** 加载 entry 脚本 */
export function execScript(entry, proxy) {
if (proxy === void 0) { proxy = window; }
return new Promise(function (resolve, reject) {
noteGlobalProps(proxy);
var script = proxy.document.createElement('script');
script.src = entry;
script.onload = function () {
var propName = getGlobalProp(proxy);
var exports = propName ? proxy[propName] || {} : {};
resolve(exports);
};
script.onerror = function (err) {
warning(process.env.NODE_ENV === 'production', "[moduleLoader] script had a problem to create, entry\uFF1A".concat(entry));
reject(new Error("script load error, error: ".concat(err)));
};
proxy.document.body.appendChild(script);
});
}
/** 加载 styles */
export function execStyles(styles, styleFor) {
if (styles.length) {
return Promise.all(styles.map(function (href) {
return new Promise(function (resolve) {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = href;
styleFor && (link.dataset.styleFor = styleFor);
link.onload = resolve;
link.onerror = resolve;
document.getElementsByTagName('head')[0].appendChild(link);
});
}));
}
return Promise.resolve();
}
//# sourceMappingURL=spa.js.map