aiprompts/monaco-v0.53.md
Status: Deferred to next release.
Current: Pinned to [email protected] (works with @monaco-editor/loader).
Target: Switch to monaco-editor@≥0.53 ESM build and drop @monaco-editor/loader + AMD path copy.
paths: { vs: "monaco" }) becomes brittle.@monaco-editor/loader; remove viteStaticCopy of min/vs/*; delete loader.config/init calls.MonacoEnvironment.getWorker.monaco chunk.base: './' in Vite for packaged apps.# next cycle:
npm rm @monaco-editor/loader
npm i monaco-editor@^0.53
Delete viteStaticCopy({ targets: [{ src: "node_modules/monaco-editor/min/vs/*", dest: "monaco" }] }).
Delete:
loader.config({ paths: { vs: "monaco" } });
await loader.init();
Create monaco-setup.ts:
// monaco-setup.ts
import * as monaco from "monaco-editor/esm/vs/editor/editor.api";
import "monaco-editor/esm/vs/editor/editor.all.css";
(self as any).MonacoEnvironment = {
getWorker(_moduleId: string, label: string) {
switch (label) {
case "json":
return new Worker(new URL("monaco-editor/esm/vs/language/json/json.worker.js", import.meta.url), {
type: "module",
});
case "css":
return new Worker(new URL("monaco-editor/esm/vs/language/css/css.worker.js", import.meta.url), {
type: "module",
});
case "html":
return new Worker(new URL("monaco-editor/esm/vs/language/html/html.worker.js", import.meta.url), {
type: "module",
});
case "typescript":
case "javascript":
return new Worker(new URL("monaco-editor/esm/vs/language/typescript/ts.worker.js", import.meta.url), {
type: "module",
});
default:
return new Worker(new URL("monaco-editor/esm/vs/editor/editor.worker.js", import.meta.url), { type: "module" });
}
},
};
export { monaco };
// where the editor UI mounts
const { monaco } = await import("./monaco-setup");
const editor = monaco.editor.create(container, { language: "javascript", value: "" });
vite.config.ts:
import { defineConfig } from "vite";
export default defineConfig({
base: "./", // important for Electron packaged apps
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes("node_modules/monaco-editor")) return "monaco";
},
},
},
},
});
Note: Workers created via
new URL(..., import.meta.url)are emitted as separate chunks automatically.
Import editor.api instead of full editor (already done above).
Only include workers you use (drop json/css/html blocks if not needed).
Lazy‑load Monaco with import() behind the UI that needs it.
Optionally dynamic‑import language contributions on demand:
if (lang === "json") {
await import("monaco-editor/esm/vs/language/json/monaco.contribution");
}
base: './' in vite.config.ts so worker URLs resolve under file:// in packaged apps.{ type: 'module' } is required for Monaco’s ESM workers.If anything blocks the release, revert to:
npm i [email protected]
npm i -D @monaco-editor/loader
Restore the viteStaticCopy block and loader.config/init calls.
monaco-setup.ts (ESM + workers): see above.vite.config.ts (base: './' + manualChunks): see above.const { monaco } = await import('./monaco-setup');