Files
Nexus/docs/design/specs/2026-06-02-monaco-core-preload-design.md
T
Your Name 4b5602a719 feat(files): fix editor freeze, EOL gates, server form and session UX
- FilesPage storeToRefs + remotePath coercion; Monaco preload; list action buttons
- text_io for UTF-8/LF; install/sync EOL; check_shell_eol + check_text_eol gates
- ServerFormDialog, hash login redirect, AppAuth keep-session; design docs and audits

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 00:42:55 +08:00

2.1 KiB
Raw Blame History

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.tsserverId && items.length 且目录预读 preloadDirectoryFiles 同级调用。

非变更

  • ts/json/css/html.worker 仍按打开文件语言按需加载。
  • 目录内 ≤300KB 文件内容预读逻辑(filePreload.ts)不变。
  • FileEditorWorkbench 仍由 FilesPagedefineAsyncComponent 挂载;预加载仅提前拉取同一 chunk。

安全与性能

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

验收标准

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