/** * Monaco Editor Loader configuration */ export function loadMonaco(): Promise { if (typeof (window as any).monaco !== "undefined") { return Promise.resolve((window as any).monaco); } return new Promise((resolve, reject) => { const globalAny = window as any; const customLoaderUrl = globalAny.__SCE_MONACO_LOADER_URL__; const customBasePath = globalAny.__SCE_MONACO_BASE_PATH__; const fallbackUrls = ["/package/min/vs/loader.js", "/package/vs/loader.js"]; const loaderUrls = customLoaderUrl ? [customLoaderUrl] : customBasePath ? [`${String(customBasePath).replace(/\/$/, "")}/loader.js`] : fallbackUrls; const tryLoad = (index: number) => { if (index >= loaderUrls.length) { reject(new Error("Monaco loader not found")); return; } const loaderUrl = loaderUrls[index]; const loaderScript = document.createElement("script"); loaderScript.src = loaderUrl; loaderScript.onload = () => { const vsBase = loaderUrl.replace(/\/loader\.js(\?.*)?$/, ""); // @ts-ignore window.require.config({ paths: { vs: vsBase, }, }); // @ts-ignore window.require(["vs/editor/editor.main"], () => { resolve((window as any).monaco); }); }; loaderScript.onerror = () => { loaderScript.remove(); tryLoad(index + 1); }; document.body.appendChild(loaderScript); }; tryLoad(0); }); } /** * 防抖函数 */ export function debounce(func: Function, wait: number) { let timeout: any; return function (this: any, ...args: any[]) { clearTimeout(timeout); timeout = setTimeout(() => { func.apply(this, args); }, wait); }; }