协同编辑

插件信息

让多个用户打开同一份 演示文稿,实时查看彼此的修改。先按协同集成接入服务端、登录、权限和持久化存储,再完成许可证配置。

配置并加载文档

在已有 Slides 编辑器中加入 Collaboration Client 配置,具体步骤见 协同快速开始。示例演示 Sheets;业务后端需要创建和保存 Slides 类型的文档,并将文档 ID 返回给前端。

先设置当前用户,再加载文档;详见协同集成。

TypeScript
import '@univerjs-pro/slides/facade'import { UserManagerService } from '@univerjs/core'import '@univerjs-pro/collaboration-client/facade'univer.__getInjector().get(UserManagerService).setCurrentUser({ userID, name, avatar })const document = await univerAPI.getCollaboration().loadSlideAsync('your-document-id')if (!document) throw new Error('Document could not be loaded')

重新打开或分享文档时使用同一个 ID。不要创建本地空白文档来代替加载服务端文档。

通过同步状态、重发与冲突恢复实现保存提示,并在刷新前保护尚未确认的修改。

移除内置 URL 加载协同文档

注意事项

从 1.2.0 版本开始,Univer 移除了内置的 URL 协同文档加载逻辑,不再自动读取 URL 中的 unit 和 type 参数来加载协同文档。

如果你的应用依赖这一行为,可以通过自定义插件恢复。

接入自定义插件

将下方四个文件按以下目录结构复制到项目中:

text
custom-url-load/├── plugin.ts├── controllers/│   └── data-loader.controller.ts└── services/    ├── url.service.ts    └── web-url.service.ts

在完成编辑器和协同插件初始化后,先设置当前用户,再注册 CustomUrlLoadPlugin。

TypeScript
import { UserManagerService } from '@univerjs/core'import { CustomUrlLoadPlugin } from './custom-url-load/plugin'univer.__getInjector().get(UserManagerService).setCurrentUser({ userID, name, avatar })univer.registerPlugin(CustomUrlLoadPlugin)

注册该插件后,由插件负责加载文档,无需再为同一文档调用 loadSlideAsync()。如果应用已经通过 Facade 加载文档,可以继续使用上一节的方式,并根据业务需要自行处理 URL。

完整插件代码

TypeScript
import { UniverCollaborationClientPlugin } from '@univerjs-pro/collaboration-client'import { DependentOn, Inject, Injector, Plugin } from '@univerjs/core'import { CollaborationDataLoaderController } from './controllers/data-loader.controller'import { IURLService } from './services/url.service'import { WebURLService } from './services/web-url.service'@DependentOn(UniverCollaborationClientPlugin)export class CustomUrlLoadPlugin extends Plugin {  static override pluginName = 'CUSTOM_URL_LOAD_PLUGIN'  constructor(    _config: undefined,    @Inject(Injector) protected override readonly _injector: Injector  ) {    super()  }  override onStarting(): void {    this._injector.add([IURLService, { useClass: WebURLService }])    this._injector.add([CollaborationDataLoaderController])    this.disposeWithMe(this._injector.get(IURLService))    this.disposeWithMe(this._injector.get(CollaborationDataLoaderController))  }}

验证同步和权限

用两个独立浏览器会话加载同一个 ID,在一端修改幻灯片文字或移动形状,确认另一端收到变化。刷新页面、断线重连和重启服务后,再检查内容是否保留。使用查看者和无权限用户检查服务端是否拒绝未授权的修改或读取。

历史记录和导入导出需要另外配置,启用协同不会自动启用这些功能。

你觉得这篇文档如何?

© 2026 DreamNum Co., Ltd.