const scripts = {}; const defaultOptions = { async: true, defer: true, }; function getGlobalLib(name, url, options = defaultOptions) { if (scripts[name]) return scripts[name]; if (window[name]) { scripts[name] = window[name]; return scripts[name]; } const mergedOptions = { ...defaultOptions, ...options }; const promise = new Promise((resolve, reject) => { let script = document.createElement("script"); script.async = mergedOptions.async; script.defer = mergedOptions.defer; function onloadHander(_, isAbort) { if ( isAbort || !script.readyState || /loaded|complete/.test(script.readyState) ) { script.onload = null; script.onreadystatechange = null; if (isAbort) { reject(); } else { scripts[name] = window[name]; resolve(scripts[name]); } document.body.removeChild(script); script = undefined; } } // It's important that the script is appended before onload and src are set. document.body.appendChild(script); script.onload = script.onreadystatechange = onloadHander; script.src = url; }); scripts[name] = promise; return scripts[name]; } export default getGlobalLib;