# Monaco 编辑器核心预加载 — 设计说明

## 背景与目标

文件管理页双击打开编辑器时，浏览器需首次下载 Monaco 核心 `editor.api2`（约 3.6MB）及通用 `editor.worker`（约 280KB），导致首开卡顿甚至触发浏览器「网页拖慢」提示。

目标：在用户**选中服务器并成功列出目录**后，于空闲时段后台预热上述资源，使后续双击打开文件近乎瞬时。语言专用 Worker（`ts.worker` 等）维持按需，不纳入预加载。

## 方案对比

| 方案 | 优点 | 缺点 |
|------|------|------|
| 进入 Files 页即预加载 | 首开最快 | 仅路过 Files 也会下载 3.6MB |
| **选服务器 + 列目录成功后 idle 预加载（选定）** | 贴近真实使用、不抢首屏 | 选服务器后需等一次 browse 成功 |
| 双击时再加载 | 零额外流量 | 首开仍卡 |

## 选定方案

1. `preloadMonacoCore()`：模块级 `warmed` 守卫，全会话仅执行一次。
2. `requestIdleCallback`（降级 `setTimeout(300)`）延后执行。
3. 预拉 `import('@/components/FileEditorWorkbench.vue')` → 连带 Vite chunk `editor.api2` + 编辑器 CSS。
4. `warmGenericEditorWorker()`：`new editorWorker()` 后 `terminate()`，将 worker 脚本写入 HTTP 缓存。

挂载点：`useFilesBrowse.ts` 在 `serverId && items.length` 且目录预读 `preloadDirectoryFiles` 同级调用。

## 非变更

- `ts/json/css/html.worker` 仍按打开文件语言按需加载。
- 目录内 ≤300KB 文件内容预读逻辑（`filePreload.ts`）不变。
- `FileEditorWorkbench` 仍由 `FilesPage` 的 `defineAsyncComponent` 挂载；预加载仅提前拉取同一 chunk。

## 安全与性能

- 预加载失败被吞，不影响正常懒加载路径。
- idle 调度避免与目录列表渲染争抢主线程。
- 无额外 API、无凭据暴露。

## 验收标准

1. 选服务器列目录后，Network 在空闲期出现 `editor.api2`、`editor.worker` 请求（非双击瞬间）。
2. 双击打开 `.conf`/`.php` 等文件，编辑器在 1s 内可交互（二次访问依赖缓存更快）。
3. 打开 `.ts` 时仍单独请求 `ts.worker`（按需未破坏）。
