init
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
(() => {
|
||||
const references = [...document.querySelectorAll('[data-component-src]')];
|
||||
const componentPaths = [...new Set(references.map((reference) => reference.dataset.componentSrc.split('#')[0]))];
|
||||
const registriesReady = Promise.all(componentPaths.map((path) => new Promise((resolve) => {
|
||||
const script = document.createElement('script');
|
||||
script.src = path.replace(/index\.html$/, 'component.js');
|
||||
script.onload = resolve;
|
||||
script.onerror = resolve;
|
||||
document.head.append(script);
|
||||
})));
|
||||
|
||||
window.componentsReady = registriesReady.then(() => Promise.all(references.map(async (reference) => {
|
||||
const specifier = reference.dataset.componentSrc;
|
||||
const [path, fragmentId] = specifier.split('#');
|
||||
const registered = window.componentRegistry?.[path]?.[fragmentId];
|
||||
if (registered !== undefined) {
|
||||
const template = document.createElement('template');
|
||||
template.innerHTML = registered;
|
||||
reference.replaceWith(template.content.cloneNode(true));
|
||||
return;
|
||||
}
|
||||
const response = await fetch(path);
|
||||
if (!response.ok) throw new Error(`Component load failed: ${specifier} (${response.status})`);
|
||||
const source = await response.text();
|
||||
const documentFragment = new DOMParser().parseFromString(source, 'text/html');
|
||||
const template = fragmentId ? documentFragment.getElementById(fragmentId) : null;
|
||||
if (!(template instanceof HTMLTemplateElement)) throw new Error(`Component fragment missing: ${specifier}`);
|
||||
reference.replaceWith(template.content.cloneNode(true));
|
||||
}))).then(() => {
|
||||
document.documentElement.dataset.componentsReady = 'true';
|
||||
}).catch((error) => {
|
||||
document.documentElement.dataset.componentsReady = 'error';
|
||||
const overlay = document.createElement('pre');
|
||||
overlay.className = 'component-load-error';
|
||||
overlay.textContent = error.stack || error.message;
|
||||
document.body.prepend(overlay);
|
||||
throw error;
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user