28 lines
904 B
JavaScript
28 lines
904 B
JavaScript
const resourceLoadPromises = {};
|
|
|
|
export function loadResource(url) {
|
|
if (resourceLoadPromises[url]) return resourceLoadPromises[url];
|
|
const loadPromise = new Promise((resolve, reject) => {
|
|
const dataAttribute = `data-${url.split("/").pop().replace(/\./g, "-")}`;
|
|
if (document.querySelector(`[${dataAttribute}]`)) {
|
|
resolve();
|
|
return;
|
|
}
|
|
let element;
|
|
if (url.endsWith(".css")) {
|
|
element = document.createElement("link");
|
|
element.setAttribute("rel", "stylesheet");
|
|
element.setAttribute("href", url);
|
|
} else if (url.endsWith(".js")) {
|
|
element = document.createElement("script");
|
|
element.setAttribute("src", url);
|
|
}
|
|
element.setAttribute(dataAttribute, "");
|
|
document.head.appendChild(element);
|
|
element.onload = resolve;
|
|
element.onerror = reject;
|
|
});
|
|
resourceLoadPromises[url] = loadPromise;
|
|
return loadPromise;
|
|
}
|