refactor: monaco init (#6496)

This commit is contained in:
Slinetrac 2026-03-13 15:28:15 +08:00 committed by GitHub
parent b707dd264e
commit ece1862fae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 23 additions and 81 deletions

View File

@ -26,10 +26,6 @@ import {
UpdateStateProvider,
} from "./services/states";
import { disableWebViewShortcuts } from "./utils/disable-webview-shortcuts";
import {
isIgnoredMonacoWorkerError,
patchMonacoWorkerConsole,
} from "./utils/monaco-worker-ignore";
if (!window.ResizeObserver) {
window.ResizeObserver = ResizeObserver;
@ -91,22 +87,12 @@ bootstrap().catch((error) => {
});
});
patchMonacoWorkerConsole();
// Error handling
window.addEventListener("error", (event) => {
if (isIgnoredMonacoWorkerError(event.error ?? event.message)) {
event.preventDefault();
return;
}
console.error("[main.tsx] Global error:", event.error);
});
window.addEventListener("unhandledrejection", (event) => {
if (isIgnoredMonacoWorkerError(event.reason)) {
event.preventDefault();
return;
}
console.error("[main.tsx] Unhandled promise rejection:", event.reason);
});

View File

@ -1,38 +0,0 @@
// These warnings are safe to ignore: they occur when Monaco models or workers are manually disposed.
const ignoredGlobalErrorMessages = [
"Missing requestHandler or method:",
"Could not create web worker(s). Falling back to loading web worker code in main thread",
"Cannot use 'in' operator to search for 'then' in undefined",
];
const isIgnoredMessage = (message: string) =>
ignoredGlobalErrorMessages.some((snippet) => message.includes(snippet));
export const isIgnoredMonacoWorkerError = (reason: unknown) => {
const message = String(
reason instanceof Error ? reason.message : (reason ?? ""),
);
return isIgnoredMessage(message);
};
const shouldIgnoreConsoleArgs = (args: unknown[]) =>
args.some((arg) => {
const message =
typeof arg === "string" ? arg : arg instanceof Error ? arg.message : "";
return isIgnoredMessage(message);
});
export const patchMonacoWorkerConsole = () => {
const originalWarn = console.warn;
const originalError = console.error;
console.warn = (...args) => {
if (shouldIgnoreConsoleArgs(args)) return;
originalWarn(...args);
};
console.error = (...args) => {
if (shouldIgnoreConsoleArgs(args)) return;
originalError(...args);
};
};

View File

@ -5,40 +5,34 @@ import cssWorker from "monaco-editor/esm/vs/language/css/css.worker?worker";
import tsWorker from "monaco-editor/esm/vs/language/typescript/ts.worker?worker";
import yamlWorker from "monaco-yaml/yaml.worker?worker";
type WorkerConstructor = new () => Worker;
// Ensure monaco loader uses the bundled ESM instance instead of CDN.
loader.config({ monaco });
// Align with the former plugin mapping so Monaco can resolve its background workers.
const workerConstructors: Record<string, WorkerConstructor> = {
editorWorkerService: editorWorker,
typescript: tsWorker,
javascript: tsWorker,
"languages.typescript": tsWorker,
css: cssWorker,
less: cssWorker,
scss: cssWorker,
"languages.css": cssWorker,
yaml: yamlWorker,
};
const defaultWorker = workerConstructors.editorWorkerService;
if (typeof window !== "undefined") {
if (typeof self !== "undefined") {
const globalScope = self as typeof self & {
MonacoEnvironment?: {
getWorker: (moduleId: string, label: string) => Worker;
getWorker: (workerId: string, label: string) => Worker;
};
};
const getWorker = (_moduleId: string, label: string) => {
const WorkerCtor = workerConstructors[label] ?? defaultWorker;
return new WorkerCtor();
};
globalScope.MonacoEnvironment = {
...globalScope.MonacoEnvironment,
getWorker,
getWorker(_workerId: string, label: string) {
switch (label) {
case "css":
case "less":
case "scss":
return new cssWorker();
case "typescript":
case "javascript":
return new tsWorker();
case "yaml":
return new yamlWorker();
default:
return new editorWorker();
}
},
};
}
loader.config({ monaco });
void loader.init().catch((error: unknown) => {
console.error("[monaco] Monaco initialization failed:", error);
});