This commit is contained in:
2026-08-04 17:57:01 +08:00
parent 768fd4a3a9
commit f77034edd7
641 changed files with 26137 additions and 0 deletions
+39
View File
@@ -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;
});
})();