pragma-views2
Version:
63 lines (53 loc) • 1.88 kB
JavaScript
export async function loadComponent(path, templated) {
loadScript(`${path}.js`);
if (templated == true) {
loadTemplates(`${path}.html`);
}
}
export async function loadScript(path) {
const script = document.createElement("script");
script.async = true;
script.src = path;
script.type = "module";
return script;
}
export async function loadModule(path, id) {
if (window.modules == undefined) {
window.modules = new Map();
}
return new Promise(async (resolve, reject) => {
if (window.modules.has(id)) {
return resolve(window.modules.get(id));
}
const srcPath = relToAbsPath(path);
const blobScript = `import * as module from "${srcPath}"; window.modules.set("${id}", module);`;
let blob = new Blob([blobScript], { type: "text/javascript" });
let url = URL.createObjectURL(blob);
let script = document.createElement("script");
script.src = url;
script.type = "module";
script.async = true;
script.onload = () => {
URL.revokeObjectURL(url);
blob = null;
url = null;
script.onload = null;
script.onerror = null;
script = null;
resolve(window.modules.get(id));
};
script.onerror = error => reject(error);
document.head.appendChild(script);
});
}
function relToAbsPath(url) {
const a = document.createElement("a");
a.setAttribute("href", url);
return a.cloneNode(false).href;
}
export async function loadTemplate(path) {
const result = await fetch(path).then(result => result.text());
const tdoc = document.createElement("template");
tdoc.innerHTML = result;
return tdoc.content.querySelector("template").content;
}