Add resilient CDN loader for Meilisearch browser client

This commit is contained in:
Jürgen Mummert
2026-02-24 12:58:34 +01:00
parent c790a1c312
commit d874fe4274
@@ -60,16 +60,45 @@ Contao 5 Frontend Module Template
</div>
</div>
<script type="module">
<script src="https://cdn.jsdelivr.net/npm/meilisearch@0.39.0/dist/bundles/meilisearch.umd.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', () => {
(function () {
const CDN_URLS = [
'https://cdn.jsdelivr.net/npm/meilisearch@0.39.0/dist/bundles/meilisearch.umd.min.js',
'https://unpkg.com/meilisearch@0.39.0/dist/bundles/meilisearch.umd.min.js'
];
if (typeof MeiliSearch === 'undefined') {
console.error('[Meilisearch] Browser client konnte nicht geladen werden');
function loadClient(urls, onDone) {
if (typeof MeiliSearch !== 'undefined') {
onDone(true, null);
return;
}
if (!urls.length) {
onDone(false, 'Alle CDN-Quellen fehlgeschlagen (mögliche CSP-Blockierung von script-src).');
return;
}
const url = urls.shift();
const script = document.createElement('script');
script.src = url;
script.async = true;
script.crossOrigin = 'anonymous';
script.onload = () => {
if (typeof MeiliSearch !== 'undefined') {
onDone(true, null);
} else {
loadClient(urls, onDone);
}
};
script.onerror = () => loadClient(urls, onDone);
document.head.appendChild(script);
}
function initSearch() {
const wrapper = document.querySelector('.meilisearch-search');
if (!wrapper) return;
@@ -226,7 +255,19 @@ Contao 5 Frontend Module Template
results.appendChild(node);
}
}
}
document.addEventListener('DOMContentLoaded', () => {
loadClient([...CDN_URLS], (ok, reason) => {
if (!ok) {
console.error('[Meilisearch] Browser client konnte nicht geladen werden. ' + reason);
return;
}
initSearch();
});
});
})();
</script>
{% endblock %}
<!-- indexer::continue -->