// Monaco 本地加载配置 // // 离线 / 内网环境下,@monaco-editor/react 默认从 jsDelivr CDN 加载 monaco // (见 @monaco-editor/loader 默认 paths: jsdelivr 的 monaco-editor min/vs), // CDN 不可达时控制台报 "Monaco initialization: error", 永远停在 // 内部 loading 状态(Python 编辑与预览都依赖 ,全部打不开)。 // // 早期尝试:import * as monaco from "monaco-editor" 让 Vite 把 monaco ESM 打 // 进 client bundle + loader.config({ monaco })。但 monaco ESM 内部用 // new URL('./xxx/webWorkerBootstrap.js?esm', import.meta.url) // 这种深嵌套相对路径 bootstrap worker,Vite 8 / Rolldown 不会把它们改写成 // 产物的 hash asset URL,运行时 fallback 成 blob URL,浏览器解析相对 // specifier 直接抛 "Failed to resolve module specifier ...webWorkerBootstrap.js"。 // 此外手动 import '...editor.worker?worker' 也会被 Rolldown 报 // "failed to resolve import"。这是 Vite/Rolldown 与 monaco ESM 的兼容坑。 // // 最终方案:用 monaco 自带的预构建 `min/vs`(IIFE/AMD 分布),通过 // loader.config({ paths }) 自托管到 /monaco/vs。预构建版自带 worker // 加载(路径相对于 vs 根),完全不依赖 bundler 的 ?worker 行为,行为与 // 原 CDN 模式一一对应,自包含离线。min/vs 由 postinstall 脚本从 // node_modules/monaco-editor/min/vs 复制到 frontend/public/monaco/vs。 // // 必须用 .client 后缀:SPA 构建的 server 预渲染阶段不会执行该模块。 import { loader } from "@monaco-editor/react"; loader.config({ paths: { vs: "/monaco/vs" } });