首页/新闻资讯/正文详情

univer 电子表格 SDK 深度解析:从架构到实战的插件化方案

发布时间:2026/11/3 6:15:14 来源:云帆数科 栏目:资讯中心
univer 电子表格 SDK 深度解析:从架构到实战的插件化方案
电子表格这个品类过去十几年几乎被一家产品定义死了打开浏览器加载一个几百KB到几MB不等的运行时然后在一个巨大的 Canvas 上重绘所有单元格。这套架构能跑但代价是——你很难把它拆开、嵌进自己的系统、按自己的业务逻辑去改。univer 想做的事情就是把这套整块交付的电子表格拆成一套可组合的 SDK让开发者像搭积木一样把表格能力嵌进自己的产品里。我最早接触 univer 是在一个内部数据填报系统的需求里业务方要一个看起来像 Excel、但只保留 20% 功能的在线表格还要能对接自己的权限体系和后端存储。用传统方案要么功能太重、要么改不动。univer 的 Facade API 和插件化架构正好卡在这个位置上。这篇内容我会从架构、核心 API、Canvas 渲染、Node.js 侧集成、以及实际踩过的坑几个角度把 univer 这套 SDK 讲透适合前端工程师、全栈开发者以及正在选型在线表格方案的技术负责人参考。1. univer 到底解决了什么问题从整块表格到可组合 SDK1.1 传统在线表格方案的三个死结先说清楚为什么需要 univer 这类东西。传统的在线表格无论是自研还是用现成组件基本都逃不开三个问题。第一个是耦合太重。一个完整的电子表格包含公式引擎、单元格渲染、选区交互、复制粘贴、撤销重做、协同、导入导出等一大堆模块。传统方案把这些打包成一个整体你想只用渲染 编辑对不起公式引擎和协同模块也一起进来了。包体积上去了可控性下来了。第二个是扩展点太少。业务方经常提一些奇怪需求某个单元格要根据外部数据源动态变色、某一列要接自定义的校验规则、工具栏要加一个自己的按钮。传统方案要么不给你钩子要么钩子藏在很深的地方文档还说不清楚。第三个是渲染和逻辑绑死。很多方案把数据模型和 Canvas 绘制揉在一起你想换个渲染层、想在服务端做计算、想把同一份数据渲染到不同终端几乎不可能。univer 的设计思路本质上是把这三个死结一个个解开用插件化解决耦合用Facade API解决扩展点用独立的渲染层和文档模型解决绑定问题。1.2 univer 的架构分层一张图看懂它的积木逻辑univer 的架构可以粗略分成四层从下往上理解最清楚。最底层是核心层Core负责最基础的能力文档模型Workbook / Worksheet / Cell、命令系统Command、事件总线、插件生命周期管理。这一层不关心你渲染成什么样也不关心你用什么框架。往上一层是功能插件层比如公式引擎插件、条件格式插件、数据验证插件、筛选插件、协同插件等。每个插件都是独立的你可以按需引入。这就是可组合的关键——不要公式不装公式插件就行。再往上是渲染层Render基于 Canvas 实现。它订阅文档模型的变化把数据画到画布上。渲染层和逻辑层是解耦的理论上你可以替换渲染实现。最上层是Facade API 层这是给业务开发者用的。它把底层复杂的命令、模型操作封装成一套相对友好的接口比如univerAPI.getActiveWorkbook()、worksheet.getRange(A1).setValue()这种。你不用关心底层命令怎么发、事件怎么传调 Facade 就行。提示理解这个分层非常重要。很多新手一上来就去翻 Core 的源码结果被命令系统绕晕。正确的姿势是先用 Facade API 把功能跑通遇到 Facade 覆盖不到的场景再往下钻。1.3 为什么是 Canvas 而不是 DOM这是绕不开的一个技术选型问题。用 DOM 做表格每个单元格一个元素几万个单元格就是几万个 DOM 节点浏览器直接卡死。Canvas 把整个表格画成一张位图节点数量恒定性能上限高得多。但 Canvas 也有代价没有原生的文本选择、没有无障碍支持、事件要自己算坐标命中。univer 在 Canvas 之上做了一套自己的命中检测和选区系统把点到了哪个单元格这件事用坐标换算解决。这也是为什么 univer 的渲染层代码量不小——它其实是在 Canvas 上重新实现了一套表格 UI 系统。我实测下来univer 在几千行、几十列的量级下滚动和编辑都很流畅这个量级已经覆盖了绝大多数企业内部系统的需求。真到十万行级别就得配合虚拟滚动和分页策略了这个后面会讲。2. Facade API 的正确打开方式别一上来就啃 Core2.1 Facade API 的设计哲学面向业务不面向框架Facade API 是 univer 最值得称道的设计之一。它的核心思想是业务开发者不应该关心底层用的是命令模式还是观察者模式只应该关心我要做什么。举个最直观的例子。你想给 A1 单元格赋值底层其实要经历构造 SetRangeValuesCommand → 通过命令服务派发 → 命令执行 → 触发模型变更 → 通知渲染层重绘这一长串流程。但用 Facade API你只需要const workbook univerAPI.getActiveWorkbook(); const worksheet workbook.getActiveSheet(); worksheet.getRange(A1).setValue(hello univer);这三行代码背后封装了上面所有流程。这就是 Facade 的价值——把复杂度留在框架内部把简单留给业务。2.2 从创建实例到操作单元格一条完整的调用链我把一个最小可运行实例的搭建过程拆开讲每一步都说明为什么这么做。第一步是准备容器。univer 需要一个 DOM 容器来挂载 Canvasdiv iduniver-container stylewidth: 100%; height: 600px;/div注意这里必须给容器明确的高度。Canvas 的尺寸依赖容器的实际渲染尺寸如果容器高度是 0 或者 auto画布就画不出来。这是新手最常踩的坑之一。第二步是创建 univer 实例。不同版本的 API 略有差异核心是传入容器 ID 和一系列配置import { createUniver, LocaleType, merge } from univerjs/presets; import { UniverSheetsCorePreset } from univerjs/preset-sheets-core; import sheetsCoreEnUS from univerjs/preset-sheets-core/locales/en-US; const { univerAPI } createUniver({ locale: LocaleType.EN_US, locales: { [LocaleType.EN_US]: merge({}, sheetsCoreEnUS), }, presets: [ UniverSheetsCorePreset({ container: univer-container, }), ], }); univerAPI.createWorkbook({});这里presets是关键。preset 是一组插件的集合UniverSheetsCorePreset把核心的表格能力渲染、编辑、选区、基础命令打包好了。如果你要公式再加公式 preset要协同再加协同 preset。这就是前面说的按需组合。第三步才是操作数据。拿到univerAPI之后通过getActiveWorkbook()拿到当前工作簿再拿工作表、拿区域、设值。2.3 Facade API 里几个高频但容易用错的接口用了一段时间后我总结出几个高频接口和它们的坑。getRange()的参数格式。它接受 A1 表示法比如getRange(A1:C3)。但要注意区域是左闭右闭的A1:C3包含 A1 到 C3 共 9 个单元格。如果你从别的库迁移过来有些库是左闭右开的容易算错。setValue()和setValues()的区别。单个单元格用setValue()批量用setValues()传二维数组。批量赋值性能好很多因为它只触发一次重绘。我做过对比1000 个单元格逐个setValue()大概要几百毫秒用setValues()一次性写入只要几十毫秒。onCellClicked这类事件监听。Facade 提供了不少事件钩子但要注意事件回调里的上下文。有些回调里拿到的worksheet可能不是你预期的那个建议在回调里重新通过univerAPI获取当前活动对象而不是依赖闭包捕获的引用。注意Facade API 在不同大版本之间有过调整尤其是从 0.x 到后续版本部分方法名和参数结构变了。选型时一定要锁定版本并对照该版本的官方文档不要拿旧教程硬套。3. Canvas 渲染层univer 性能的命门所在3.1 一次重绘到底发生了什么理解 Canvas 渲染先要理解重绘这件事。当文档模型发生变化比如你改了 A1 的值渲染层不会傻乎乎地把整个表格重画一遍而是走一套脏区域标记 局部重绘的机制。具体来说模型变更会触发一个渲染事件渲染层根据变更的范围计算出需要重绘的矩形区域然后只在这个区域内重新绘制。比如你只改了 A1那理论上只需要重绘 A1 所在的那一小块。这个机制是 univer 能在大数据量下保持流畅的核心原因。但这里有个细节局部重绘的粒度取决于变更的类型。改一个单元格的值粒度很细改列宽、插入行这种结构性变更影响范围大重绘区域就大。所以频繁做结构性操作比如循环插入行会比循环改值慢很多。3.2 虚拟滚动与可视区域计算表格数据量一大不可能把所有行都画出来。univer 用的是虚拟滚动只渲染当前可视区域内的行和列滚动时动态计算新的可视范围。这个机制对使用者是透明的但有几个地方会受影响。一是滚动性能如果可视区域计算逻辑写得不好快速滚动时会掉帧。univer 在这方面做得还行实测快速拖动滚动条基本能跟上。二是导出和截图因为只有可视区域被渲染如果你想截取整个表格的图得先把所有内容渲染出来或者用专门的导出接口。我遇到过一个需求要把表格内容导出成图片。直接对 Canvas 调toDataURL()只能拿到当前可视区域。正确做法是用 univer 提供的导出能力或者遍历数据自己用离屏 Canvas 重绘。3.3 Canvas 渲染下的交互难题选区、编辑、输入法Canvas 没有原生交互所有交互都得自己实现。univer 在这块做了不少工作但作为使用者有几个点需要知道。选区鼠标按下、拖动、松开每一步都要把屏幕坐标换算成单元格坐标。univer 内部有一套坐标系统处理了表头、冻结行列、合并单元格等复杂情况。你一般不用管但如果要自定义交互比如拖拽填充就得理解这套坐标换算。单元格编辑双击进入编辑态时univer 会在 Canvas 上方叠一个真正的输入框通常是 textarea 或 contenteditable让用户输入。输入完成后把值写回模型。这个叠输入框的做法是 Canvas 表格的通用方案因为 Canvas 本身没法接收键盘输入。输入法IME这是中文用户的痛点。输入中文时输入法会有一个候选词浮层如果输入框定位不准候选词会飘到奇怪的地方。univer 对 IME 做了处理但在某些浏览器和缩放下仍可能出问题。我实测在 Chrome 下正常在部分移动端浏览器上偶有偏移需要针对性地调输入框定位。提示如果你的场景涉及大量中文输入务必在目标浏览器上实测 IME 表现别等到上线才发现候选词位置不对。4. 在 Node.js 侧使用 univer服务端计算与批量处理4.1 为什么要在服务端跑 univeruniver 是前端 SDK但它的核心层文档模型、公式引擎、命令系统并不依赖浏览器 DOM。这意味着你可以在 Node.js 里引入 univer 的核心包做服务端计算。典型场景有几个。一是批量导入用户上传一个 Excel服务端解析后要计算所有公式、生成预览数据这时候在服务端跑一遍公式引擎比在浏览器里跑更可控。二是定时任务比如每天凌晨重算某些报表的公式结果。三是数据校验在数据入库前用 univer 的公式引擎验证一遍。4.2 Node.js 环境准备与依赖安装在 Node.js 里用 univer环境准备和普通前端项目差不多但要注意几点。Node.js 版本建议用 LTS比如 18.x 或 20.x。univer 的包是 ESM 优先的如果你的项目是 CommonJS可能需要配置构建工具做转换。安装核心包npm install univerjs/core univerjs/engine-formula如果你需要完整的表格能力还要装 sheets 相关的包。但服务端一般不需要渲染所以不要装渲染层的包能省不少体积和依赖。一个容易忽略的点是univer 的部分包依赖浏览器 API比如window、document即使你只用核心层某些间接依赖也可能在 import 时报错。解决办法是在 Node.js 里做环境垫片polyfill或者只引入确实不依赖 DOM 的子包。我一般会先写个最小脚本试跑确认没有 DOM 依赖报错再逐步加功能。4.3 服务端跑公式引擎的实操与边界服务端跑公式引擎核心是构造一个工作簿模型写入数据然后触发公式计算。import { Univer, LocaleType } from univerjs/core; import { UniverFormulaEnginePlugin } from univerjs/engine-formula; const univer new Univer({ locale: LocaleType.EN_US, }); univer.registerPlugin(UniverFormulaEnginePlugin); // 构造工作簿、写入数据、触发计算这里要注意公式计算是异步的。因为公式之间可能有依赖关系引擎需要做依赖分析、拓扑排序然后按顺序计算。所以你不能写完数据立刻读结果得等计算完成的事件或者用 await 等待。另一个边界是函数支持范围。univer 的公式引擎支持大部分常用函数但不是全部。一些冷门的、或者依赖外部数据的函数比如某些财务函数、Web 类函数可能不支持。上线前一定要拿真实数据测一遍把不支持的函数列出来要么自己扩展要么在业务层规避。5. 插件化扩展怎么把 univer 改成你自己的表格5.1 插件的生命周期与注册时机univer 的插件系统是它扩展性的核心。一个插件本质上是一个类实现特定的生命周期钩子在合适的时机被调用。插件的生命周期大致是onStarting启动前→ onReady就绪→ onRendered渲染完成→ onDispose销毁。你可以在不同阶段做不同的事。比如注册命令一般在 onStarting 或 onReady操作 DOM 一般在 onRendered。注册插件通过univer.registerPlugin()。注意注册顺序如果插件 B 依赖插件 A 提供的服务A 必须先注册。这个顺序错了运行时会报服务未找到。5.2 自定义命令从改一个单元格颜色说起假设业务需求是点一个按钮把选中区域的所有单元格背景改成红色。这个需求用自定义命令实现最规范。为什么要用命令而不是直接改模型因为命令系统提供了撤销重做、协同同步、事件通知这一整套能力。你直接改模型这些能力就都没了。命令是 univer 里改变状态的唯一正确入口。一个自定义命令大致包含三部分命令定义ID 和参数类型、命令处理器实际执行逻辑、以及可选的撤销逻辑。执行时通过命令服务派发框架会自动处理后续的模型更新和重绘。我踩过的一个坑是命令处理器里不要做耗时操作。命令执行是同步的如果你在里面发网络请求或者做大量计算会阻塞整个 UI。正确做法是把耗时逻辑放到命令之外命令只负责改状态。5.3 用 Facade API 做业务层封装的最佳实践对于大多数业务开发者其实不需要写底层插件用 Facade API 做一层业务封装就够了。我的做法是把常用的表格操作封装成一个业务服务类比如SheetService内部持有univerAPI引用对外暴露业务语义的方法比如fillReportData(data)、highlightAnomalies()。这样业务代码不直接依赖 univer 的 API将来换方案或者升级版本改动面小很多。这层封装还有个好处可以统一处理错误和边界。比如写入数据前先校验数据格式操作前先检查是否有活动工作表。这些检查散落在业务代码里很乱收拢到服务层就清爽了。6. 实战踩坑记录那些文档里不会写的问题6.1 容器尺寸与初始化时序的坑前面提过容器要有高度这里展开说。univer 初始化时会读取容器的尺寸来设置 Canvas 大小。如果初始化时容器还没渲染出来比如在 Vue 的onMounted之前、或者 React 的useEffect时机不对读到的尺寸就是 0Canvas 画不出来。解决办法有两个一是确保在容器挂载后再初始化二是监听容器尺寸变化用 ResizeObserver 在尺寸变化时通知 univer 重新计算布局。后者更稳妥因为容器尺寸可能在运行时变化比如侧边栏折叠。6.2 大数据量下的卡顿定位思路数据量上去之后如果卡顿别急着怪 univer先定位瓶颈在哪。我的排查顺序是先看是渲染卡还是计算卡。渲染卡的表现是滚动、编辑时掉帧计算卡的表现是改一个值后要等很久才更新。区分方法很简单打开浏览器性能面板录一段看时间花在绘制上还是脚本执行上。如果是渲染卡检查是不是一次性写入了太多数据、或者频繁触发了全量重绘。如果是计算卡多半是公式太多或者公式依赖链太深。公式这块有个优化技巧能预先算好的值就别用公式公式引擎再快也不如直接写值。6.3 版本升级与 API 变更的应对univer 还在快速迭代版本之间 API 有变动是常态。我的应对策略是锁定版本 封装隔离。锁定版本好理解package.json里写死版本号别用^。封装隔离就是前面说的业务服务层把 univer 的 API 调用收拢到少数几个文件里。这样升级时只需要改这几个文件而不是全项目搜索替换。升级前一定要看 changelog重点看 breaking changes。我一般会先在测试环境升跑一遍核心用例确认没问题再上生产。7. 选型对比univer 适合你还是该选别的7.1 univer 与主流在线表格方案的横向对比维度univer传统重型表格组件轻量只读表格架构插件化 SDK单体单体扩展性高可自定义插件中低低包体积按需组合可控大小公式引擎内置可服务端跑内置通常无协同能力有独立插件部分有无学习曲线较陡中平缓适用场景深度定制、嵌入自有系统快速搭建完整表格展示为主从表里能看出来univer 的定位很明确你要深度定制、要嵌入自己的系统、要控制包体积选它。如果你只是想要一个开箱即用的完整表格且不打算大改传统方案可能更省事。7.2 什么场景该选 univer什么场景别碰该选 univer 的场景企业内部系统需要嵌入表格能力、需要对接自有权限和后端、需要自定义交互和渲染、需要在服务端做表格计算、对包体积敏感。别碰 univer 的场景只是要一个静态展示的表格用轻量方案就行、团队没有前端深度定制能力、项目周期极短且需求就是和 Excel 一模一样直接用成熟产品更快。我个人的判断标准是如果你需要改它就选 univer如果你只需要用它选成熟产品。univer 的价值在于可改不在于开箱即用。8. 把 univer 用好的几个长期建议用了一段时间后我最大的体会是univer 不是那种装上就能用的库它更像一套需要你参与设计的框架。你得先想清楚自己的表格要什么、不要什么然后按需组合插件。第二个体会是别怕读源码。Facade API 覆盖了 80% 的常见场景剩下 20% 的定制需求最终还是要下到 Core 层去理解命令系统和插件机制。早点建立这个认知后面遇到问题不会慌。第三个是性能要早测。别等功能都做完了才发现大数据量下卡顿那时候改架构成本很高。建议在项目早期就用接近真实量级的数据压测一遍把瓶颈摸清楚。最后分享一个我常用的小技巧调试 univer 时善用它的命令日志。把命令派发和执行过程打出来能快速定位是哪个环节出了问题。很多看起来像渲染 bug的问题追下去其实是命令没发对或者模型没更新。这个习惯帮我省了大量排查时间。

相关推荐

RKE2集群中kube-proxy的iptables与nftables后端切换实践
RKE2集群中kube-proxy的iptables与nftables后端切换实践

1. 项目背景与核心需求在RKE2集群环境中,kube-proxy作为Kubernetes网络代理的核心组件,其底层数据包过滤机制的选择直接影响网络性能和兼容性。传统iptables与新一代nftables后端的取舍,成为近期运维人员关注的焦点问题。我最近在部署RKE2集群… · 2026/11/3 6:15:14

从PyTorch到TensorFlow 2.x:部署实战与选型指南
从PyTorch到TensorFlow 2.x:部署实战与选型指南

从去年开始,身边越来越多同事从 PyTorch 切回了 TensorFlow。倒不是说 PyTorch 不好,而是当你真正要落地一个工业级项目、要上移动端、要接生产服务时,TensorFlow 的部署链路确实能省掉很多自研的功夫。我最近的一个 OCR 识别项目就是活生生的… · 2026/11/3 6:15:14

hindsight式Agent记忆系统:从反思机制到MCP+Docker落地实践
hindsight式Agent记忆系统:从反思机制到MCP+Docker落地实践

1. 从“hindsight”说起:为什么Agent的记忆需要“事后诸葛亮”第一次看到“hindsight”这个词被拿来命名一个Agent记忆项目,我脑子里蹦出来的不是技术架构,而是一句大白话——事后诸葛亮。这个词在英文里本身就带着“回过头看才明白”的意思&… · 2026/11/3 6:15:14

Skills.md演进:从静态清单到动态能力接口
Skills.md演进:从静态清单到动态能力接口

1. 项目背景与核心概念最近在整理技术文档时,发现一个有趣的现象:传统的Skills.md文件正在经历一场静默的革命。这种原本用于记录开发者技能栈的Markdown文档,正在从静态的技能清单进化为动态的能力接口。这背后反映的是整个技术行业对"… · 2026/11/3 6:44:47

MAX1968/MAX1969 TEC驱动器恒流双向控温与限流设计
MAX1968/MAX1969 TEC驱动器恒流双向控温与限流设计

简介:《max1968/max1969中文资料》面向从事热电制冷、珀尔帖模块驱动与热管理硬件设计的工程师及电子爱好者,聚焦MAX1968/MAX1969功率驱动器的中文查阅与快速选型。压缩包内为1个doc文档,约36KB,内容围绕引脚功能、操作原理与应用… · 2026/11/3 6:44:47

网络安全工程师职业发展指南:从入门到进阶
网络安全工程师职业发展指南:从入门到进阶

1. 网络安全工程师职业全景解析网络安全工程师这个职业在数字化时代扮演着至关重要的角色。记得我2012年刚入行时,国内专业的安全团队屈指可数,如今各类安全岗位已遍布各行各业。不同于普通IT岗位,网络安全工程师更像数字世界的"特种兵&… · 2026/11/3 6:44:47

OpenCV安装避坑指南:pip包选择、报错排查与CUDA编译
OpenCV安装避坑指南:pip包选择、报错排查与CUDA编译

装 OpenCV 这件事,很多人第一次接触时都觉得“不就是一行 pip 命令吗”,结果半小时后还在跟ImportError: libGL.so.1或者DLL load failed大眼瞪小眼。我在不同机器、不同系统、不同 Python 版本上反复折腾过这件事,从纯 CPU 的轻量推理服务&a… · 2026/11/3 6:44:47

LLM底层技术原理入门指南:从MLP到Transformer与RLHF的跳读路径
LLM底层技术原理入门指南:从MLP到Transformer与RLHF的跳读路径

简介:《The Document is All You Need!》是一份面向零基础读者的 LLM 底层技术原理入门 PDF,尤其适合非科班出身、希望理解大模型技术脉络的投资人、创业者与 AI 爱好者。内容从 MLP、CNN、RNN 及 LSTM/GRU、强化学习、seq2seq 与自监督学习讲… · 2026/11/3 6:44:47

AI工程从零构建实战:五层解耦架构与生产级落地
AI工程从零构建实战:五层解耦架构与生产级落地

1. 这不是“搭积木”,而是亲手锻造AI系统的全流程实战“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:又要学Python、调PyTorch、跑个ResNet?不。这六个单词背后,是一整套被工业界反复验证、却极少… · 2026/11/3 6:43:47

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码