Headless Univer

Headless Univer es el runtime de contenido de Univer sin interfaz de edición interactiva. Comparte modelos de contenido, comandos, cálculos y API Facade con el editor web. Puede procesar contenido en Node.js o ejecutar tareas sin interfaz en un navegador. Las capacidades disponibles dependen de los plugins de producto y función registrados.

En Node.js puede crear o cargar documentos, editar párrafos, texto, estructura y estilos, y guardar instantáneas Univer. Tablas, listas, columnas, fórmulas y formas necesitan sus plugins de contenido. Editar contenido no genera capturas de páginas.

El ejemplo usa el modo plugin. @univerjs/core y los plugins de contenido del producto pertenecen a Headless; @univerjs/ui, los paquetes de producto *-ui y los presets básicos del navegador quedan fuera de esta configuración. @univerjs/engine-render se mantiene como dependencia compartida sin montar Canvas ni editor. Consulte los límites de paquetes Headless.

Las instantáneas locales no necesitan colaboración. El ejemplo colaborativo requiere además cliente, servidor y autenticación. La conversión Office y las capturas necesitan Server SDK y un runtime de renderizado, respectivamente. Importar /facade no registra los plugins ni convierte las API UI en API Headless.

Instalación

Shell
pnpm add @univerjs/core @univerjs/engine-render @univerjs/engine-formula @univerjs/docs

Uso

TypeScript
import { LocaleType, Univer } from '@univerjs/core'import { FUniver } from '@univerjs/core/facade'import { UniverDocsPlugin } from '@univerjs/docs'import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'import { UniverRenderEnginePlugin } from '@univerjs/engine-render'import '@univerjs/docs/facade'const univer = new Univer({  locale: LocaleType.ES_ES,  locales: {    [LocaleType.ES_ES]: {},  },})univer.registerPlugin(UniverRenderEnginePlugin)univer.registerPlugin(UniverFormulaEnginePlugin)univer.registerPlugin(UniverDocsPlugin)const univerAPI = FUniver.newAPI(univer)univerAPI.createDocument({})

Ejemplo de colaboración en Node.js

Node.js puede actuar como cliente de colaboración: cargar un documento existente del servidor, modificar su contenido mediante la API de Facade y sincronizar los cambios con otros clientes que tengan abierto el mismo documento. Antes de ejecutarlo, prepara un servicio de colaboración, una licencia de cliente y un ID de documento accesible.

Archivos del ejemplo

Organiza los archivos con esta estructura:

text
src/docs/node/├── main.ts└── univer.ts
  • univer.ts: crea Univer y registra los plugins de funciones de documentos, las extensiones de Facade y el cliente de colaboración de Node.js.
  • main.ts: carga un documento colaborativo y muestra las API de párrafos, texto, encabezados y pies de página, bloques destacados, bloques de código, citas, listas, formas, tablas y columnas.

Sustituye your-license, la URL del servidor y la Cookie en univer.ts, así como el ID del documento en main.ts.

TypeScript
import { UniverCollaborationPlugin } from '@univerjs-pro/collaboration'import { UniverCollaborationClientPlugin } from '@univerjs-pro/collaboration-client'import {  NodeCollaborationSocketService,  UniverCollaborationClientNodePlugin,} from '@univerjs-pro/collaboration-client-node'import { UniverDocsCalloutPlugin } from '@univerjs-pro/docs-callout'import { UniverDocsCodePlugin } from '@univerjs-pro/docs-code'import { UniverDocsColumnPlugin } from '@univerjs-pro/docs-column'import { UniverDocsLatexPlugin } from '@univerjs-pro/docs-latex'import { UniverDocsListPlugin } from '@univerjs-pro/docs-list'import { UniverDocsQuotePlugin } from '@univerjs-pro/docs-quote'import { UniverDocsReferencePlugin } from '@univerjs-pro/docs-reference'import { UniverDocsShapePlugin } from '@univerjs-pro/docs-shape'import { UniverDocsTablePlugin } from '@univerjs-pro/docs-table'import { UniverLicensePlugin } from '@univerjs-pro/license'import {  IAuthzIoService,  IImageIoService,  IMentionIOService,  IUndoRedoService,  LocaleType,  Univer,} from '@univerjs/core'import { UniverDocsPlugin } from '@univerjs/docs'import { UniverDocsDrawingPlugin } from '@univerjs/docs-drawing'import { UniverDocsHyperLinkPlugin } from '@univerjs/docs-hyper-link'import { UniverDrawingPlugin } from '@univerjs/drawing'import { UniverRenderEnginePlugin } from '@univerjs/engine-render'import { UniverNetworkPlugin } from '@univerjs/network'import { UniverThreadCommentPlugin } from '@univerjs/thread-comment'import '@univerjs/docs/facade'import '@univerjs/docs-drawing/facade'import '@univerjs-pro/docs-shape/facade'import '@univerjs-pro/docs-callout/facade'import '@univerjs-pro/docs-reference/facade'import '@univerjs-pro/docs-code/facade'import '@univerjs-pro/docs-list/facade'import '@univerjs-pro/docs-quote/facade'import '@univerjs-pro/docs-table/facade'import '@univerjs-pro/docs-column/facade'import '@univerjs-pro/docs-latex/facade'import '@univerjs-pro/collaboration-client/facade'export function createUniverOnNode(): Univer {  const univer = new Univer({    locale: LocaleType.ES_ES,    locales: {},    override: [      [IAuthzIoService, null],      [IUndoRedoService, null],      [IMentionIOService, null],    ],  })  univer.registerPlugin(UniverLicensePlugin, {    license: 'your-license',  })  univer.registerPlugin(UniverRenderEnginePlugin)  univer.registerPlugin(UniverThreadCommentPlugin)  univer.registerPlugin(UniverDrawingPlugin, {    override: [[IImageIoService, null]],  })  univer.registerPlugin(UniverDocsPlugin)  univer.registerPlugin(UniverDocsDrawingPlugin)  univer.registerPlugin(UniverDocsHyperLinkPlugin)  univer.registerPlugin(UniverDocsReferencePlugin)  univer.registerPlugin(UniverDocsCalloutPlugin)  univer.registerPlugin(UniverDocsCodePlugin)  univer.registerPlugin(UniverDocsListPlugin)  univer.registerPlugin(UniverDocsQuotePlugin)  univer.registerPlugin(UniverDocsShapePlugin)  univer.registerPlugin(UniverDocsTablePlugin)  univer.registerPlugin(UniverDocsColumnPlugin)  univer.registerPlugin(UniverDocsLatexPlugin)  registerCollaborationPlugins(univer)  return univer}function registerCollaborationPlugins(univer: Univer): void {  const serverUrl = 'https://your-univer-server.example.com'  univer.registerPlugin(UniverNetworkPlugin)  univer.registerPlugin(UniverCollaborationPlugin)  univer.registerPlugin(UniverCollaborationClientPlugin, {    socketService: NodeCollaborationSocketService,    enableOfflineEditing: false,    enableSingleActiveInstanceLock: false,    snapshotServerUrl: `${serverUrl}/universer-api/snapshot`,    collabSubmitChangesetUrl: `${serverUrl}/universer-api/comb`,    collabWebSocketUrl: `${serverUrl}/universer-api/comb/connect`,    wsSessionTicketUrl: `${serverUrl}/universer-api/user/session-ticket`,    uploadFileServerUrl: `${serverUrl}/universer-api/stream/file/upload`,    signUrlServerUrl: `${serverUrl}/universer-api/file/{fileID}/sign-url`,    downloadEndpointUrl: serverUrl,    authzUrl: `${serverUrl}/universer-api/authz`,    sendChangesetTimeout: 200,    retryConnectingInterval: 1000,    customHeaders: {      // Ejemplo: si tu servidor Univer requiere autenticación mediante cookies, puedes definir aquí la cabecera 'cookie'.      cookie: 'your-cookie',      // ... más cabeceras    },  })  univer.registerPlugin(UniverCollaborationClientNodePlugin)}

Notas de ejecución

loadDocAsync() carga un documento existente del servidor; no necesitas llamar a createDocument(). El servicio de colaboración identifica al usuario y comprueba sus permisos mediante la información de autenticación, como la Cookie incluida en customHeaders. El servidor devuelve el memberID de la conexión.

Este ejemplo desactiva la caché sin conexión del navegador y el bloqueo de instancia entre pestañas, por lo que no es necesario llamar a setCurrentUser() para aislar la caché por cuenta. Si más adelante usas funciones como comentarios, que dependen del usuario actual local, puedes establecer el usuario de la aplicación mediante UserManagerService; esto no sustituye la autenticación del servidor.

El ejemplo de encabezado y pie de página solo se aplica a documentos paginados; el de columnas, a documentos modernos. El ejemplo comprueba el modo del documento con isModern() y omite las operaciones no compatibles.

El ejemplo inserta contenido en un documento existente, por lo que se recomienda usar un documento de prueba. El ejemplo mantiene la conexión colaborativa después de ejecutarse. Abre el mismo documento en un navegador para ver los cambios. flush() espera la confirmación del servidor para los cambios pendientes. Si lo conviertes en un script de una sola ejecución, llama a univer.dispose() cuando hayan terminado todas las operaciones asíncronas y la sincronización.

¿Cómo es esta guía?

© 2026 DreamNum Co., Ltd.