协同编辑

协同编辑需要前端编辑器和服务端共同接入。请先按协同集成运行示例,再接入业务身份、权限和数据存储。前后端的配置代码见 协同快速开始。

文档由经过认证的业务 API 创建。前端拿到服务端返回的 Unit 标识后,使用下面的方法加载;再次打开同一份文档时,继续使用这个标识。

加载文档

先设置当前用户,再加载文档。当前用户决定协同编辑的身份和本地离线缓存的归属。设置当前用户后调用 Facade 方法显式加载:

TypeScript
import { UserManagerService } from '@univerjs/core'import '@univerjs-pro/collaboration-client/facade'univer.__getInjector().get(UserManagerService).setCurrentUser({ userID, name, avatar })const collaboration = univerAPI.getCollaboration()const unit = await collaboration.loadSheetAsync('your-unit-id')

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

移除内置 URL 加载协同文档

注意事项

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

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

接入自定义插件

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

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)

注册该插件后,由插件负责加载文档,无需再为同一文档调用 loadSheetAsync()。如果应用已经通过 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))  }}

Node.js / AI SDK · OT

你觉得这篇文档如何?

© 2026 DreamNum Co., Ltd.