petals-ui
Version:
Front-end UI components foundation
50 lines (49 loc) • 1.76 kB
JavaScript
import { registerIconProviders, setDefaultIconProvider, getIconProviders } from './register';
const loadedCache = {};
function isValidProviderUrl(url) {
return typeof url === 'string' && url.length > 0 && loadedCache[url] !== true;
}
function loadProviderUrls(urls, index = 0) {
const url = urls[index];
if (!isValidProviderUrl(url)) {
return;
}
let el;
let parentEl;
if (/.+\.css(\?.+)?$/gi.test(url)) {
el = document.createElement('link');
parentEl = document.head;
el.setAttribute('rel', 'stylesheet');
el.setAttribute('href', url);
}
else {
el = document.createElement('script');
parentEl = document.body;
el.setAttribute('src', url);
}
const nextIndex = index + 1;
if (urls.length > nextIndex) {
el.onload = el.onerror = () => loadProviderUrls(urls, nextIndex);
}
loadedCache[url] = true;
parentEl.appendChild(el);
}
function loadIconProviders() {
const providers = getIconProviders();
Object.keys(providers).forEach(k => {
const provider = providers[k];
const urls = [...(provider.urls || [])];
// 因为 iconfont 资源会把 SVG 插入 before,所以前加载相同 type 会覆盖后加载,为了数组覆盖顺序,倒序插入
loadProviderUrls(provider.type === 'svg' ? urls.reverse() : urls);
});
}
function registerAndLoadIconProviders(providers, defaultProvider) {
const providerAliases = Object.keys(providers);
if (providerAliases.length === 0) {
return;
}
registerIconProviders(providers);
setDefaultIconProvider(defaultProvider || providerAliases[0]);
loadIconProviders();
}
export { loadIconProviders, registerAndLoadIconProviders };