interface ProxyLoader { loadCss(src: string): any loadScript(src: string): Promise loadScriptConcurrent(src: Array): Promise } class loaderProxy implements ProxyLoader { constructor() { } protected scriptLoaderCache: Array = [] public loadCss = (src: string): any => { let element = document.createElement("link") element.rel = "stylesheet" element.href = src document.body.appendChild(element) } public loadScript = async (src: string): Promise => { if (this.scriptLoaderCache.includes(src)) { return src } else { let element: Element = document.createElement("script") element.src = src document.body.appendChild(element) element.onload = () => { return this.scriptLoaderCache.push(src) } } } public loadScriptConcurrent = async (srcList: Array): Promise => { if (Array.isArray(srcList)) { const len: number = srcList.length if (len > 0) { let count: number = 0 srcList.map(src => { if (src) { this.loadScript(src).then(() => { count++ if (count === len) { return } }) } }) } } } } export const loader = new loaderProxy()