Skip to content

Epic: LibreOffice 迁移 Phase 1 执行(Phase 0 已 GO)/ LibreOffice migration Phase 1 execution (Phase 0 = GO) #43

Description

@zeweihan

承接 RFC #13docs/LIBREOFFICE_MIGRATION_PLAN.md)与 Phase 0 原型 #39Phase 0 已完成、结论 GO(走路线 A / ZetaOffice WASM),正式立项 Phase 1。所有工作在分支 feat/libreoffice-migration,master 继续发 WPS 稳定版,互不影响。

Phase 0 验收结论(GO)/ Phase 0 verdict

四个生死项的 PoC 均在真机/浏览器跑通(截图与日志见 #39):

  • CJK 渲染:CDN 默认 LOWA 无中文字体→豆腐块;注入 CJK 字体即正确渲染(简繁皆可)。
  • 中文输入:Qt5-WASM 上游无 IME;自建"真 input 承接系统 IME → compositionend → UNO 在光标处 insertString"输入桥可正常连续中文输入(焦点交还、追加不替换/不选中均已修)。
  • zetajs 程序化能力:取选区 / 模型原生搜索(XSearchablefindFirst/findNext)/ RecordChanges 修订留痕——RFC §0.2"弃整数 offset、用模型原生"主张功能性验证通过。
  • ⚠️ 性能/包体:50 页批量生成 ≈26.5s(程序化写入、非真实编辑);加载既有 docx 的真实耗时与安装包体积增量待量化补测(Phase 1 任务 ⑤)。

Phase 1 任务(可认领)/ Phase 1 tasks (claimable)

  • ① 字体焙进自托管 LOWA bundle:自托管运行时到安装包 + 把 Noto Sans CJK/思源(OFL)放进 /instdir/share/fonts/truetype/,构建期由 fontconfig 原生扫到(替代 PoC 的运行时注入)。area: desktop
  • ② IME 输入桥工程化:PoC 的"真 input 承接 IME"→做成覆盖 canvas 光标处的透明可编辑层(跟随 LO 光标、合成中预览、Backspace/方向键/Enter 转 UNO 命令),体验="直接在文档里打字"。area: frontend
  • ③ 后端工具契约改名(小重构、先行)WpsTools/WpsActionService/useWpsBridge 等 WPS 命名 → 编辑器无关命名(后端命令逻辑不动,仅命名解耦)。area: ai
  • ④ 前端 executor 按模型重写(核心 ~2–3k 行):定位→XSearchable+XParagraphCursor+书签锚点(弃整数 offset);修订→RecordChanges 默认开;选区/插入/替换→UNO 游标+XReplaceablearea: frontend
  • ⑤ 性能/包体量化补测:加载既有 50 页 docx 打开/保存耗时 + 编辑流畅度;WASM+data 对安装包体积增量。
  • ⑥ Electron 集成:spike 的 onHeadersReceived(COOP/COEP)+ WASM 渲染窗,按独立 session/partition 接进 desktop/main/main.js(不动主应用现有 webSecurity 设置)。area: desktop
  • ⑦ Phase 3 灰度:WPS 与 LibreOffice executor 并存、开关切换、真实合同回归"定位/修订"准确率;稳定后默认切换、移除 WPS SDK 依赖。

接手者必读·关键工程事实 / Key facts

  1. LOWA 运行时=cdn.zetaoffice.net/zetaoffice_latest/soffice.{js,wasm,data},但 zeta.js 桥不在 CDN,须本地 vendored
  2. 主线程线程端口=Module.uno_main Module.zetajs,后者只在 office worker 里),且须在 soffice.jsonload 里挂。
  3. WASM 需 SharedArrayBuffer → 页面须跨源隔离(COOP same-origin + COEP require-corp);Electron 用 session.webRequest.onHeadersReceived 注入。
  4. emscripten 全局 out(stdout)会覆盖页面全局 out —— 勿用 out 当全局名(spike 已改 zlog)。
  5. 字体注入须在 fontconfig 启动扫描前(Module.preRun;LOWA data 挂载是 merge 进 MEMFS,故 preRun 写入有效)。
  6. 跑 spike:cd experiments/zetaoffice-spike && node serve.mjs → 真 Chrome:8777;或 ../../desktop/node_modules/.bin/electron .(真机)。

English (summary). Phase 0 of the LibreOffice migration (RFC #13, spike #39) is complete — verdict GO (route A / ZetaOffice WASM). All four make-or-break checks have working PoCs on branch feat/libreoffice-migration: CJK rendering (inject a CJK font into the LOWA font dir), Chinese input (a real <input> hosts the system IME → compositionend → UNO insertString at the cursor; focus-handoff + append-not-replace fixed), and zetajs programmatic ops (selection, model-native XSearchable search, RecordChanges redline). Perf/bundle is partial (50-page bulk-gen ~26.5s; real load/edit timing + installer size increment TBD). This Epic tracks the claimable Phase 1 tasks: font into self-hosted bundle, IME overlay, backend tool-contract rename, frontend executor rewrite (drop integer offsets → model-native), perf re-measure, Electron integration (COOP/COEP via onHeadersReceived), and gray rollout. master keeps shipping the WPS-based release; migration work stays isolated on the branch. Key engineering facts above.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: desktopElectron 桌面端 / Electron desktop shellarea: frontendVue/uni-app 前端 / Vue frontendenhancementNew feature or requesthelp wantedExtra attention is neededpriority: high高优先级 / High priority

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions