-
Notifications
You must be signed in to change notification settings - Fork 0
/
resources.js
27 lines (26 loc) · 903 Bytes
/
resources.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;
}