安装和基本使用
本章介绍 Univer Sheets 的安装与基本使用,包含预设模式与插件模式的配置流程。若你还不熟悉 Univer 的基础术语与两种模式的差异,建议先阅读 基本概念。
Univer 提供预设模式和插件模式两种集成方式。预设模式通过预先组合好的插件简化配置,上手更简单;如果需要深度扩展,推荐使用插件模式,按需组合和配置插件。
通过插件模式创建
Univer 以插件的形式提供了一系列功能,除了一些产品所必需的核心插件外,你还可以根据需要选择性地引入其它插件。这里仅以最基础的 Univer Sheets 应用为例,介绍如何手动组合安装插件。
与预设模式不同,插件模式默认并不包含 Facade API1,以下代码示例中有关 Facade API 的部分都是可选的,你可以根据自己的需求来决定是否删除。
使用包管理器
安装
Univer 使用了 React 开发视图(当然这并不影响你在 Vue 或者 Angular 中使用 Univer),使用 Rxjs 来处理数据流,由于这两个库被广泛使用在现代前端开发中,因此我们将它们作为 peerDependencies2。而不同的包管理工具在对于 peerDependencies 有着不同的行为策略,因此你可能需要注意一些细节。
pnpm add @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui @univerjs/engine-formula @univerjs/engine-render @univerjs/sheets @univerjs/sheets-formula @univerjs/sheets-formula-ui @univerjs/sheets-numfmt @univerjs/sheets-numfmt-ui @univerjs/sheets-ui @univerjs/uinpm install @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui @univerjs/engine-formula @univerjs/engine-render @univerjs/sheets @univerjs/sheets-formula @univerjs/sheets-formula-ui @univerjs/sheets-numfmt @univerjs/sheets-numfmt-ui @univerjs/sheets-ui @univerjs/uiyarn add @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui @univerjs/engine-formula @univerjs/engine-render @univerjs/sheets @univerjs/sheets-formula @univerjs/sheets-formula-ui @univerjs/sheets-numfmt @univerjs/sheets-numfmt-ui @univerjs/sheets-ui @univerjs/ui react react-dom rxjsbun add @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui @univerjs/engine-formula @univerjs/engine-render @univerjs/sheets @univerjs/sheets-formula @univerjs/sheets-formula-ui @univerjs/sheets-numfmt @univerjs/sheets-numfmt-ui @univerjs/sheets-ui @univerjs/ui使用
注意事项
- 并非所有的插件都包含了 facade 包、语言包和样式文件,我们会在每个功能的文档对此进行说明。
- 样式文件的引入顺序很重要,确保你在依次引入
@univerjs/design、@univerjs/ui的 CSS 样式后再引入其他插件的样式文件。
你需要在项目中引入 Univer 的样式文件、语言包,以及一些必要的插件:
TypeScriptimport { LocaleType, mergeLocales, Univer, UniverInstanceType } from '@univerjs/core'import { FUniver } from '@univerjs/core/facade'import DesignZhCN from '@univerjs/design/locale/zh-CN'import { UniverDocsPlugin } from '@univerjs/docs'import { UniverDocsUIPlugin } from '@univerjs/docs-ui'import DocsUIZhCN from '@univerjs/docs-ui/locale/zh-CN'import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'import { UniverRenderEnginePlugin } from '@univerjs/engine-render'import { UniverSheetsPlugin } from '@univerjs/sheets'import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'import { UniverSheetsFormulaUIPlugin } from '@univerjs/sheets-formula-ui'import SheetsFormulaUIZhCN from '@univerjs/sheets-formula-ui/locale/zh-CN'import { UniverSheetsNumfmtPlugin } from '@univerjs/sheets-numfmt'import { UniverSheetsNumfmtUIPlugin } from '@univerjs/sheets-numfmt-ui'import SheetsNumfmtUIZhCN from '@univerjs/sheets-numfmt-ui/locale/zh-CN'import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'import SheetsUIZhCN from '@univerjs/sheets-ui/locale/zh-CN'import SheetsZhCN from '@univerjs/sheets/locale/zh-CN'import { UniverUIPlugin } from '@univerjs/ui'import UIZhCN from '@univerjs/ui/locale/zh-CN'import '@univerjs/design/lib/index.css'import '@univerjs/ui/lib/index.css'import '@univerjs/docs-ui/lib/index.css'import '@univerjs/sheets-ui/lib/index.css'import '@univerjs/sheets-formula-ui/lib/index.css'import '@univerjs/sheets-numfmt-ui/lib/index.css'如果你需要使用 Facade API,你可以在这里引入相关的 facade 包,这是可选的,但建议引入:
TypeScriptimport '@univerjs/engine-formula/facade'import '@univerjs/ui/facade'import '@univerjs/docs-ui/facade'import '@univerjs/sheets/facade'import '@univerjs/sheets-ui/facade'import '@univerjs/sheets-formula/facade'import '@univerjs/sheets-numfmt/facade'然后创建一个 Univer 实例,并注册这些插件:
TypeScriptconst univer = new Univer({ locale: LocaleType.ZH_CN, locales: { [LocaleType.ZH_CN]: mergeLocales( DesignZhCN, UIZhCN, DocsUIZhCN, SheetsZhCN, SheetsUIZhCN, SheetsFormulaUIZhCN, SheetsNumfmtUIZhCN, ), },})univer.registerPlugin(UniverRenderEnginePlugin)univer.registerPlugin(UniverFormulaEnginePlugin)univer.registerPlugin(UniverUIPlugin, { container: 'app',})univer.registerPlugin(UniverDocsPlugin)univer.registerPlugin(UniverDocsUIPlugin)univer.registerPlugin(UniverSheetsPlugin)univer.registerPlugin(UniverSheetsUIPlugin)univer.registerPlugin(UniverSheetsFormulaPlugin)univer.registerPlugin(UniverSheetsFormulaUIPlugin)univer.registerPlugin(UniverSheetsNumfmtPlugin)univer.registerPlugin(UniverSheetsNumfmtUIPlugin)univer.createUnit(UniverInstanceType.UNIVER_SHEET, {})const univerAPI = FUniver.newAPI(univer)
univer.registerPlugin 与 univer.registerPlugins 方法
univer.registerPlugin 方法用于注册一个插件到 Univer 实例中。你可以在创建 Univer 实例后调用这个方法来注册插件。
你可以通过 univer.registerPlugin(Plugin, options) 的方式来注册插件,其中 Plugin 是要注册的插件,options 是可选的配置项,每个插件可能有不同的配置项。
你也可以通过 univer.registerPlugins 传入一个数组,一次性注册多个插件。这对于需要集中管理插件的场景非常有用。
univer.registerPlugins([ UniverRenderEnginePlugin, UniverFormulaEnginePlugin, [UniverUIPlugin, { container: 'app', }], UniverDocsPlugin, UniverDocsUIPlugin, UniverSheetsPlugin, UniverSheetsUIPlugin, UniverSheetsFormulaPlugin, UniverSheetsFormulaUIPlugin, UniverSheetsNumfmtPlugin, UniverSheetsNumfmtUIPlugin,])懒加载部分插件
使用插件模式的一个优势是你可以更加灵活地控制插件的加载时机,一种常见的方式是在应用初始化时仅加载必须的插件,而将部分插件的加载时机延迟到首次渲染完成之后。
// ...univer.createUnit(UniverInstanceType.UNIVER_SHEET, {})import('@univerjs/watermark').then(({ UniverWatermarkPlugin }) => { univer.registerPlugin(UniverWatermarkPlugin, { textWatermarkSettings: { content: 'Hello, Univer!', fontSize: 36, }, })})Univer 的 官方 demo 就使用了这样的优化技巧,可供参考。
移动端适配
这些示例要求所安装的 SDK 包包含下列移动端导出。所有 @univerjs/* 和 @univerjs-pro/* 依赖应保持相同版本。
在 Univer Sheets 中使用移动端 UI 插件提供触摸操作界面。6 请在创建编辑器前确定 UI 模式。
Sheets 移动端支持仍属于实验性质,请在目标设备上验证应用实际使用的功能。
在上方插件模式示例中,替换以下 UI 插件的导入和注册,并在 createUnit() 前完成;不要追加到已初始化的桌面端编辑器中。保留模型插件、引擎、语言包、CSS 和 Facade 导入。桌面端和移动端类是同一个包入口的不同具名导出。
import { UniverSheetsFormulaMobileUIPlugin } from '@univerjs/sheets-formula-ui'import { UniverSheetsNumfmtMobileUIPlugin } from '@univerjs/sheets-numfmt-ui'import { UniverSheetsMobileUIPlugin } from '@univerjs/sheets-ui'import { UniverMobileUIPlugin } from '@univerjs/ui'univer.registerPlugin(UniverMobileUIPlugin, { container: 'app' })univer.registerPlugin(UniverSheetsMobileUIPlugin)univer.registerPlugin(UniverSheetsFormulaMobileUIPlugin)univer.registerPlugin(UniverSheetsNumfmtMobileUIPlugin)Sheets 中保留 UniverDocsUIPlugin。 UniverSheetsMobileUIPlugin 依赖它提供单元格内的文档编辑能力。独立的 Docs 编辑器才使用 UniverDocsMobileUIPlugin。
当前 UniverSheetsCorePreset 和 UniverDocsCorePreset 注册的是桌面端 UI 插件,没有 mobile: true 选项。移动端需要显式组合插件;在桌面端预设之后追加移动端插件不会替换原有 UI。
插件对照
仅注册需要的功能,并保留其模型插件和必要依赖。存在移动端 UI 导出不代表两端的操作界面完全相同。Pro 功能仍需相应的许可证;需要后端的功能,请在业务应用中通过 Univer Server SDK 接入相应能力。
| 来源包 | 桌面端注册 | 移动端注册 |
|---|---|---|
@univerjs/ui | UniverUIPlugin | UniverMobileUIPlugin |
@univerjs/sheets-ui | UniverSheetsUIPlugin | UniverSheetsMobileUIPlugin |
@univerjs/sheets-formula-ui | UniverSheetsFormulaUIPlugin | UniverSheetsFormulaMobileUIPlugin |
@univerjs/sheets-numfmt-ui | UniverSheetsNumfmtUIPlugin | UniverSheetsNumfmtMobileUIPlugin |
@univerjs/drawing-ui | UniverDrawingUIPlugin | UniverDrawingMobileUIPlugin |
@univerjs/thread-comment-ui | UniverThreadCommentUIPlugin | UniverThreadCommentMobileUIPlugin |
@univerjs-pro/shape-editor-ui | UniverShapeEditorUIPlugin | UniverShapeEditorMobileUIPlugin |
@univerjs-pro/chart-ui | UniverChartUIPlugin | UniverChartMobileUIPlugin |
@univerjs-pro/exchange-client | UniverExchangeClientPlugin | UniverExchangeClientMobileUIPlugin |
@univerjs/sheets-conditional-formatting-ui | UniverSheetsConditionalFormattingUIPlugin | UniverSheetsConditionalFormattingMobileUIPlugin |
@univerjs/sheets-crosshair-highlight | UniverSheetsCrosshairHighlightPlugin | UniverSheetsCrosshairHighlightMobileUIPlugin |
@univerjs/sheets-data-validation-ui | UniverSheetsDataValidationUIPlugin | UniverSheetsDataValidationMobileUIPlugin |
@univerjs/sheets-drawing-ui | UniverSheetsDrawingUIPlugin | UniverSheetsDrawingMobileUIPlugin |
@univerjs/sheets-filter-ui | UniverSheetsFilterUIPlugin | UniverSheetsFilterMobileUIPlugin |
@univerjs/sheets-find-replace | UniverSheetsFindReplacePlugin | UniverSheetsFindReplaceMobileUIPlugin |
@univerjs/sheets-hyper-link-ui | UniverSheetsHyperLinkUIPlugin | UniverSheetsHyperLinkMobileUIPlugin |
@univerjs/sheets-sort-ui | UniverSheetsSortUIPlugin | UniverSheetsSortMobileUIPlugin |
@univerjs/sheets-table-ui | UniverSheetsTableUIPlugin | UniverSheetsTableMobileUIPlugin |
@univerjs/sheets-thread-comment-ui | UniverSheetsThreadCommentUIPlugin | UniverSheetsThreadCommentMobileUIPlugin |
@univerjs-pro/sheets-chart-ui | UniverSheetsChartUIPlugin | UniverSheetsChartMobileUIPlugin |
@univerjs-pro/sheets-exchange-client | UniverSheetsExchangeClientPlugin | UniverSheetsExchangeClientMobileUIPlugin |
@univerjs-pro/sheets-history-ui | UniverSheetsHistoryUIPlugin | UniverSheetsHistoryMobileUIPlugin |
@univerjs-pro/sheets-outline-ui | UniverSheetsOutlineUIPlugin | UniverSheetsOutlineMobileUIPlugin |
@univerjs-pro/sheets-pivot-ui | UniverSheetsPivotTableUIPlugin | UniverSheetsPivotTableMobileUIPlugin |
@univerjs-pro/sheets-print | UniverSheetsPrintPlugin | UniverSheetsPrintMobileUIPlugin |
@univerjs-pro/sheets-shape-ui | UniverSheetsShapeUIPlugin | UniverSheetsShapeMobileUIPlugin |
@univerjs-pro/sheets-sparkline-ui | UniverSheetSparklineUIPlugin | UniverSheetSparklineMobileUIPlugin |
@univerjs/find-replace | UniverFindReplacePlugin | UniverFindReplaceMobileUIPlugin |
容器与触摸交互
为容器指定明确高度,并配置页面 viewport。100dvh 随动态视口高度变化。请在目标移动浏览器上检查滚动、双指缩放、文字选择、剪贴板访问和软键盘弹出后的布局。仅缩小桌面端编辑器不会切换到移动端插件。
UniverMobileUIPlugin 默认使用 disableAutoFocus: true,避免编辑器在初始化时自动获取焦点。
<meta name="viewport" content="width=device-width, initial-scale=1" /><div id="app" style="height: 100dvh"></div>通过 CDN 使用 Univer
如果你不想使用包管理器,或者只是想快速尝试 Univer 的功能,你可以通过 CDN 引入 Univer 的相关资源。详情请参考 通过 CDN 使用 Univer。
通过预设模式创建
在这里我们将简单介绍下如何通过不到二十行的代码来快速搭建一个 Univer Sheets 应用。
使用包管理器
如果你的项目中已经引入了现代前端开发工具,那么引入 Univer 将会非常简单。我们推荐使用 Vite、esbuild 或 Webpack 5 等对 ES Module 支持较好的构建工具来构建 Univer 应用。如果你使用了其它构建工具(例如 Webpack 4),可能会需要一些额外的配置。
安装
选择你所使用的包管理器以安装 @univerjs/presets:
pnpm add @univerjs/presets @univerjs/preset-sheets-corenpm install @univerjs/presets @univerjs/preset-sheets-coreyarn add @univerjs/presets @univerjs/preset-sheets-corebun add @univerjs/presets @univerjs/preset-sheets-core使用
如果你的构建工具不支持 package.json 的 exports 字段(常见于 Webpack 4),你需要手动将映射的路径修改为实际的路径。
通过以下代码,你就可以快速创建一个 Univer Sheets 应用:
<div id="app" style="height: 600px"></div>import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import UniverPresetSheetsCoreZhCN from '@univerjs/preset-sheets-core/locales/zh-CN'import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'import '@univerjs/preset-sheets-core/lib/index.css'const { univer, univerAPI } = createUniver({ locale: LocaleType.ZH_CN, locales: { [LocaleType.ZH_CN]: mergeLocales( UniverPresetSheetsCoreZhCN, ), }, presets: [ UniverSheetsCorePreset({ container: 'app', }), ],})univerAPI.createWorkbook({})这里返回的 univerAPI 对象被称为 Univer 的面板 API(Facade API),通过它可以调用 Univer 提供的许多功能。
你也可以通过 @univerjs/presets/preset-sheets-core 来引入 UniverSheetsCorePreset,但必须确保你的构建工具支持 package.json 的 exports 字段。
createUniver 方法
createUniver 方法接受一个配置对象,其中包含了 Univer 的配置信息,例如语言、主题、插件等。这个方法会返回一个包含了 Univer 实例和 Univer Facade API 实例的对象。
配置对象的部分属性如下:
locale:语言环境,可以是LocaleType枚举值。locales:语言包,一个对象,键为语言环境,值为语言包对象。theme:主题,一个可选主题对象。presets:一个 preset 数组,包含了需要注册的预设包,例如UniverSheetsCorePreset。plugins:一个插件数组,包含了需要额外注册的插件。
当你使用了一个未包含在任何预设包中的插件或者你自己实现了一个插件时,可以通过 plugins 属性来注册这些插件。也可以选择在获得 Univer 实例后通过 univer.registerPlugin 方法来注册插件。
你可以在 API Reference / createUniver 找到更多关于 createUniver 方法的详细信息。
通过 CDN 使用 Univer
如果你不想使用包管理器,或者只是想快速尝试 Univer 的功能,你可以通过 CDN 引入 Univer 的相关资源。详情请参考 通过 CDN 使用 Univer。
其他发布版本
除了稳定版本之外,Univer 还提供了 alpha / beta 通道。这些版本可以让你提前体验到尚未正式发布的最新功能。但请记住,更多的功能同时意味着更多的风险。这些版本可能包含错误、不完整的功能或者不稳定的特性。请尽可能避免在生产环境中使用这些版本。
Alpha / Beta 版本
当 Univer 开发团队完成了一个新功能或重大更改时,可能会将其预发布到 alpha 或 beta 通道,你可以通过以下命令安装 alpha / beta 版本的 Univer 包:
pnpm add @univerjs/<package-name>@alpha # Alpha 版本
pnpm add @univerjs/<package-name>@beta # Beta 版本npm install @univerjs/<package-name>@alpha # Alpha 版本
npm install @univerjs/<package-name>@beta # Beta 版本yarn add @univerjs/<package-name>@alpha # Alpha 版本
yarn add @univerjs/<package-name>@beta # Beta 版本bun add @univerjs/<package-name>@alpha # Alpha 版本
bun add @univerjs/<package-name>@beta # Beta 版本如果你在使用 alpha / beta 版本时遇到任何问题或者有任何反馈,请通过 GitHub Issues 向 Univer 开发团队报告。
我们欢迎你对于这些早期版本的反馈。
下一步
Footnotes
你觉得这篇文档如何?