1. 从“univer”这个标题说起它到底是什么能解决什么问题第一次看到“univer”这个词很多人会以为是“universe”的缩写或者某个新出的前端框架。其实它是一套开源的通用文档与表格渲染引擎核心定位是“把电子表格、文档、幻灯片这类办公场景的交互能力做成可嵌入的 SDK”。你可以把它理解成一块“办公文档能力的积木”——只要把它接进自己的项目里就能在网页上跑出一个接近桌面级体验的表格编辑器支持公式、单元格样式、选区、复制粘贴、撤销重做这些常规操作。它为什么值得单独拿出来聊因为过去要在 Web 端做一套像样的表格编辑能力要么用现成的商业组件要么自己从零写 Canvas 渲染和交互逻辑前者贵、后者坑多。univer 走的是另一条路底层用 Canvas 做绘制引擎上层用插件架构把功能拆开再通过 SDK 的形式暴露给 Node.js 或浏览器环境。热搜词里同时出现了 univer、SDK、Node.js、Canvas、插件架构这几个词说明关注它的人大多是在做前端工程化、在线协作办公、低代码平台这类方向。这篇文章适合谁看如果你是前端工程师、Node.js 后端开发者或者正在做在线文档、报表系统、低代码搭建平台的产品技术负责人那 univer 这套东西值得你花时间研究。哪怕你只是听说过“Canvas 绘图引擎”但没真正上手过我也会从最基础的概念讲起把安装、初始化、插件挂载、常见报错这些环节拆开说清楚。下面所有内容都是基于我实际折腾这套 SDK 的经验整理参数和步骤会尽量给到可直接复现的程度。2. 整体设计思路拆解为什么是 Canvas 加插件架构2.1 为什么不用 DOM 而选 Canvas 做渲染底座要理解 univer 的设计先得回答一个根本问题表格渲染为什么不用传统的 HTML 表格或 DOM 节点而要用 Canvas答案藏在“规模”两个字里。一张稍微像样的业务报表动辄几千行、上百列如果每个单元格都是一个 DOM 节点浏览器要维护的节点数量轻松突破十万级。DOM 节点一多布局计算、样式重排、事件绑定的开销会呈指数级上升滚动起来直接卡成幻灯片。Canvas 的思路完全不同。它把整张表格当成一张画布所有单元格、边框、文字、选区高亮都通过绘制指令画上去。浏览器只需要维护一个 canvas 元素节点数量恒定滚动和缩放时只是重绘画面性能曲线平缓得多。这就是热搜里“canvas绘图引擎”“m3e canvas”这类词频繁出现的原因——大家关心的本质是“大规模数据下还能不能流畅”。不过 Canvas 也有代价。DOM 天然自带的可访问性、文本选择、输入法支持在 Canvas 上都得自己实现。univer 的做法是在需要输入的时候临时把一个真实的输入框浮在画布上方输入完成后再把内容画回 Canvas。这个“浮层输入”的模式是很多 Canvas 编辑器的通用套路理解这一点后面遇到“输入框位置偏移”“中文输入法候选框错位”这类问题时你就知道该往哪个方向排查了。2.2 插件架构解决了什么现实痛点如果 univer 只是一个大而全的 SDK把所有功能塞进一个包那它的适用面会非常窄。实际业务里有人只需要只读的报表展示有人需要完整的编辑能力还有人要加自定义的公式函数或右键菜单。插件架构的价值就在这里核心层只负责最基础的渲染循环、数据模型和事件总线具体功能像公式计算、条件格式、协同编辑、导入导出全部以插件形式按需加载。这种设计带来的直接好处是包体积可控。你不需要为了用一个表格展示功能把整个公式引擎和协同模块都打进产物里。另一个好处是扩展性——当你想加一个“单元格右键插入批注”的功能时不用去改核心代码写一个插件注册进去就行。热搜词里“前端sdk”“插件架构”并列出现恰恰说明大家关注的是“怎么把这套东西接进自己已有的工程体系”而不是单纯看个 demo。从工程角度看插件架构还带来一个隐性收益职责边界清晰。核心层不关心业务插件层不关心渲染细节两者通过约定好的接口通信。这种分层在后期维护时特别省心出问题时能快速定位是渲染层还是某个插件的问题而不是在一坨几千行的代码里大海捞针。2.3 SDK 形态与 Node.js 的关系热搜里“SDK”“Node.js”“node.js安装教程”这些词扎堆说明不少人是想在 Node.js 环境里使用 univer。这里要澄清一个常见误解univer 的核心渲染依赖 Canvas而 Canvas 在浏览器里是原生能力在 Node.js 里则需要额外的图形库支持。所以“在 Node.js 里跑 univer”通常有两种场景一种是做服务端渲染或导出图片另一种是纯粹在构建工具链里引用它的类型定义和工具函数。如果你只是做前端项目Node.js 的作用主要是提供 npm 包管理环境和构建工具比如 Vite、Webpack。这时候你需要的只是一个稳定的 Node.js LTS 版本热搜里出现的“node.js 18.20.4 lts”“node.js 22.12”都是可选项。我的建议是优先选 18 或 20 的 LTS 版本因为生态兼容性最稳很多构建插件对最新版 Node.js 的支持往往滞后几个月。至于“node.js安装步骤”“node.js配置”这些搜索说明确实有新手卡在环境搭建这一步后面我会专门用一节讲清楚。3. 核心细节解析与实操要点从环境到第一个可运行实例3.1 环境准备Node.js 版本选择与安装避坑动手之前先把地基打牢。univer 的包通过 npm 分发所以你需要一个能正常工作的 Node.js 环境。版本选择上我实测下来 18.x 和 20.x 的 LTS 版本最省心。热搜里提到的“node.js 18.20.4 lts版本下载”就是一个很稳的选择它属于 18 系列的后期维护版本bug 少、兼容性好。如果你用的是 22.x大部分情况也没问题但偶尔会遇到某些构建工具还没跟上需要多折腾几下。安装过程本身不复杂去官网下载对应系统的安装包一路下一步即可。真正容易出问题的是安装后的配置环节。Windows 用户要注意安装时勾选“Add to PATH”否则命令行里敲node -v会提示找不到命令。macOS 用户如果用 Homebrew直接brew install node18更干净。安装完成后务必验证三件事node -v能输出版本号、npm -v能输出版本号、npm config get registry指向一个可访问的镜像源。提示如果你在公司内网环境npm 默认源可能访问不畅这时候需要配置内部镜像或代理源。配置命令是npm config set registry 你的镜像地址改完用npm config get registry确认生效。还有一个容易被忽略的点Node.js 版本切换。如果你机器上同时有多个项目依赖不同版本的 Node.js建议用 nvmmacOS/Linux或 nvm-windows 来管理。这样切项目时一条命令就能换版本不用反复卸载重装。热搜里“centos 7.9 node.js安装部署”这类需求在服务器上同样推荐用 nvm比手动编译省事得多。3.2 项目初始化与依赖安装环境就绪后新建一个空目录作为项目根目录执行npm init -y生成 package.json。接下来安装 univer 相关依赖。这里有个关键点univer 是拆成多个包发布的核心包、渲染包、各功能插件包是分开的。你不需要一次性全装按需引入即可。一个最小可运行的前端示例通常需要核心包加上表格 UI 插件包。安装命令大致是这样npm install univerjs/core univerjs/design univerjs/engine-render univerjs/sheets univerjs/sheets-ui装完之后建议先跑一个官方提供的最小示例确认环境没问题再往里面加自己的业务逻辑。很多人一上来就想着集成到现有项目里结果环境问题、版本冲突、构建配置混在一起排查起来非常痛苦。先用干净目录跑通最小闭环是省时间的做法。注意univer 各包之间有版本对应关系混用不同大版本的包很容易出现“某个 API 不存在”或“类型不匹配”的报错。安装时尽量让所有 univerjs 开头的包保持同一版本号可以在 package.json 里统一指定。3.3 初始化一个表格实例的核心步骤跑通依赖之后就到了最关键的一步在页面上创建 univer 实例。整个过程可以拆成四步。第一步是准备一个容器元素通常是一个带固定宽高的 divuniver 会把画布挂载到这个容器里。第二步是创建 univer 实例传入容器和配置项。第三步是注册需要的插件比如表格插件、UI 插件、公式插件。第四步是创建或加载一份工作簿数据让表格真正显示出来。这四步的顺序不能乱尤其是插件注册必须在创建实例之后、加载数据之前完成。我见过有人把插件注册写在数据加载之后结果表格是出来了但工具栏、右键菜单全都没有就是因为插件没赶上初始化时机。另外容器的宽高必须明确如果容器高度是 0画布就画不出来页面上一片空白这个坑新手特别容易踩。创建实例时有一个配置项值得单独说locale。univer 支持多语言默认可能是英文。如果你需要中文界面要在配置里指定中文语言包并且把对应的语言资源注册进去。热搜里虽然没直接提多语言但实际做国内业务时这是绕不开的一步提前配好能省掉后面改文案的麻烦。3.4 插件挂载的时机与依赖顺序插件架构是 univer 的精髓但也是新手最容易出错的地方。每个插件都有自己的依赖比如表格 UI 插件依赖表格核心插件公式插件又可能依赖特定的计算引擎。如果你挂载顺序不对轻则功能不生效重则直接抛异常。我的经验是先挂核心能力插件数据模型、渲染引擎再挂业务功能插件表格、公式、条件格式最后挂 UI 层插件工具栏、右键菜单、状态栏。这个顺序符合“先有数据、再有功能、最后有界面”的逻辑。另外有些插件支持配置项比如是否开启协同、是否只读这些配置要在挂载时一次性传进去运行中途再改会比较麻烦。提示如果某个插件挂载后功能没生效先检查它依赖的插件是否已经挂载。univer 的插件系统在依赖缺失时有的会静默失败有的会报错表现不一致。养成“按依赖顺序挂载”的习惯能避免大量莫名其妙的调试时间。4. 实操过程与核心环节实现把表格真正跑起来4.1 最小可运行示例的完整搭建流程光说步骤不够直观我把一个最小示例的搭建过程完整走一遍。假设你已经有了 Node.js 环境和一个空项目目录。首先用 Vite 创建一个前端项目因为 Vite 启动快、配置简单适合做这类验证。执行npm create vitelatest univer-demo -- --template vanilla进入目录后安装依赖。接着安装 univer 相关包命令前面已经给过。然后修改入口文件引入 univer 的核心模块和样式文件。样式文件很容易被漏掉漏了之后表格能显示但样式全乱边框、字体、颜色都不对。引入样式通常是这样一行import univerjs/design/lib/index.css具体路径以你安装的版本为准。创建实例的代码结构大致如下import { Univer, LocaleType, merge } from univerjs/core; import { UniverSheetsPlugin } from univerjs/sheets; import { UniverSheetsUIPlugin } from univerjs/sheets-ui; import DesignZhCN from univerjs/design/locale/zh-CN; import SheetsZhCN from univerjs/sheets/locale/zh-CN; const univer new Univer({ locale: LocaleType.ZH_CN, locales: { [LocaleType.ZH_CN]: merge({}, DesignZhCN, SheetsZhCN), }, }); univer.registerPlugin(UniverSheetsPlugin); univer.registerPlugin(UniverSheetsUIPlugin); univer.createUniverSheet({ id: demo-sheet, sheetName: 示例表格, });这段代码跑起来后页面上就会出现一个可编辑的表格。你可以输入内容、选中单元格、拖动选区。如果这一步成功了说明环境、依赖、插件挂载都没问题接下来就可以往里面加自己的功能了。4.2 数据加载与工作簿结构解析表格能显示之后下一步就是往里灌数据。univer 的工作簿数据结构是分层的最外层是工作簿Workbook里面可以有多个工作表Worksheet每个工作表里有单元格数据、行高列宽、合并单元格、样式等信息。理解这个层级结构对后面做数据导入导出、协同编辑都很关键。加载数据有两种常见方式。一种是创建实例时直接传入初始数据适合数据量不大、一次性加载的场景。另一种是先创建空表格再通过 API 动态设置单元格值适合从后端接口拉数据后填充的场景。动态设置时要注意频繁调用单个单元格的设置接口性能很差正确做法是批量构造数据快照一次性应用。单元格数据的键名通常是行列索引比如{ 0: { 0: { v: 内容 } } }表示第一行第一列的值。这个结构初看有点绕但习惯了之后会发现它很紧凑适合传输和存储。如果你从后端拿到的数据是二维数组需要自己写一个转换函数把数组映射成这种行列对象结构。这个转换逻辑不复杂但要注意空值和类型的处理否则容易出现“数字变成字符串”这类问题。4.3 公式与计算能力的接入表格如果没有公式那和静态展示没区别。univer 的公式能力是通过独立插件提供的需要单独安装和挂载。挂载之后你在单元格里输入SUM(A1:A10)这样的表达式它就能自动计算。公式引擎支持常见的数学、统计、文本、日期函数具体支持列表可以查官方文档。这里有个实操细节公式计算是异步的尤其是数据量大、依赖链长的时候。如果你在设置完数据后立刻去读某个公式单元格的值可能拿到的是旧值或空值。正确做法是监听计算完成的事件或者在读取前确保计算队列已经清空。这个坑我在做报表导出时踩过导出的文件里公式结果全是空的排查半天才发现是读取时机太早。注意自定义公式函数需要注册到公式引擎里注册时要提供函数名、参数定义和计算逻辑。函数名不要和内置函数冲突否则会覆盖内置行为导致其他表格计算出错。4.4 样式、选区与交互功能的落地一个能用的表格光有数据和公式还不够样式和交互才是体验的关键。univer 支持单元格级别的字体、颜色、背景、边框、对齐方式设置也支持整行整列的样式。设置样式时同样建议批量操作逐个单元格设置样式在数据量大时会有明显卡顿。选区功能是交互的核心。用户点击、拖拽、按住 Shift 扩展选区这些行为 univer 都内置支持。如果你要做自定义的选区行为比如“只允许选中某一列”可以通过监听选区变化事件在事件回调里修正选区范围。这个模式在权限控制场景里很有用比如某些单元格只读就可以在选区变化时把只读区域排除掉。复制粘贴也值得单独提一句。univer 支持从 Excel 复制数据粘贴进来也支持把表格内容复制出去。但跨应用粘贴时剪贴板里的数据格式可能是 HTML、纯文本或自定义格式解析逻辑需要兼容多种情况。我实测下来从 Excel 复制一大块数据粘贴进 univer大部分情况没问题但遇到合并单元格或特殊格式时偶尔会有偏差需要自己做一层清洗。5. 常见问题与排查技巧实录5.1 环境与安装类问题速查环境问题是最劝退新手的我把高频问题整理成一张表方便对照排查。问题现象可能原因解决思路命令行提示 node 不是内部命令安装时未加入 PATH重新安装并勾选加入 PATH或手动配置环境变量npm install 卡住不动默认源访问慢切换镜像源后重试安装报错 peer dependency 冲突包版本不匹配统一 univerjs 包版本或用 --legacy-peer-deps页面空白无表格容器高度为 0给容器设置明确宽高表格有数据但无样式样式文件未引入检查 CSS 引入路径是否正确这张表里的每一条我都实际遇到过。尤其是“容器高度为 0”这一条因为 div 默认高度是内容撑开的而 Canvas 不占内容高度所以父容器高度塌陷画布自然画不出来。解决办法很简单给容器设一个固定高度比如 600px或者用 flex 布局让它撑满。5.2 渲染与性能类问题排查Canvas 渲染虽然性能好但也不是没有瓶颈。当单元格数量超过一定规模或者频繁触发重绘时还是会出现卡顿。常见的性能问题有几个来源一是数据量太大一次性加载几万行二是样式太复杂每个单元格都有独立样式三是频繁调用 API 触发重绘比如在循环里逐个设置单元格值。排查性能问题的第一步是打开浏览器开发者工具的性能面板录制一段操作看时间花在哪里。如果大量时间在 Canvas 绘制上说明渲染压力大可以考虑开启虚拟滚动只渲染可视区域。如果时间花在 JavaScript 计算上可能是数据处理逻辑太重需要做批量优化。univer 本身对大数据量有一定优化但前提是你用对了 API别用最笨的方式逐个操作。提示做大数据量测试时建议用真实业务数据而不是随机生成的规整数据。真实数据往往有空值、超长文本、特殊字符这些才是性能问题的真正来源。5.3 插件与功能异常排查插件相关的问题往往比较隐蔽因为表现可能是“功能没反应”而不是“报错”。遇到这种情况我通常按这个顺序排查先确认插件是否已注册再确认注册时机是否在创建实例之后然后确认依赖插件是否齐全最后看控制台有没有被忽略的警告信息。还有一个常见问题是插件之间的冲突。比如两个插件都想接管右键菜单结果菜单项重复或互相覆盖。这时候需要看插件的优先级配置或者只保留一个菜单插件。univer 的插件系统允许配置优先级但文档里不一定写得很清楚需要看源码或社区讨论。5.4 跨端与兼容性注意事项热搜里出现了“ios safari 使用 uniapp canvas 队列时导出白图”这类词说明跨端兼容是真实存在的痛点。univer 基于 Canvas而不同平台对 Canvas 的支持程度有差异。iOS Safari 在某些情况下对 Canvas 的尺寸和内存有限制超大画布可能渲染失败或导出空白。移动端浏览器对触摸事件的处理也和桌面端不同需要额外适配。如果你要做移动端适配建议先在小范围设备上测试重点验证触摸选区、滚动、输入法弹出这几个场景。输入法在移动端 Canvas 上的表现尤其容易出问题候选框位置可能和光标对不上。这类问题的通用解法是在输入时把真实输入框定位到光标附近并监听视口变化及时调整位置。6. 我在实际项目里踩过的坑和总结的经验折腾 univer 这套东西有一段时间了有几个体会特别深。第一个是“先跑通最小闭环再集成”。我一开始图省事直接往现有项目里塞结果构建配置、版本冲突、样式隔离全搅在一起光排查就花了两天。后来退回到干净目录半小时就跑通了再把跑通的配置一点点搬回去效率高得多。第二个是“版本统一比什么都重要”。univer 的包拆得细好处是按需加载坏处是版本管理麻烦。我建议在 package.json 里把所有 univerjs 包写成同一个版本号升级时一起升别单独升某一个。这样能避免大量“API 对不上”的诡异问题。第三个是“别忽视样式和容器”。很多看起来像功能 bug 的问题根源其实是 CSS。容器没高度、样式没引入、z-index 冲突这些都会让表格显示异常。遇到问题先看样式能省不少时间。最后分享一个实用技巧调试 univer 时善用它的数据快照功能。把当前工作簿的数据导出成 JSON能直观看到数据结构和状态比在控制台里一层层展开对象高效得多。这个快照既可以用来排查问题也可以用来做数据备份和迁移。后续如果要做协同编辑快照的 diff 对比也是一个可行的切入点。
企业数字化 ERP 产品动态
相关推荐
DSOAL:DirectSound3D到OpenAL的HRTF音效修复 1. 先把这层“翻译官”的定位说清楚DSOAL 这个名字,拆开看其实已经把答案写在脸上了——DirectSound 到 OpenAL 的一条转译通道。它做的事非常具体:把老游戏里那些DirectSound3D的 3D 声源调用、EAX的环境音效参数,全部截下来,翻译… · 2026/11/4 15:17:08
hindsight:为Agent构建可插拔长期记忆系统的架构设计与Docker部署实践 1. 从“hindsight”说起:为什么我们需要给Agent装一个“后视镜” 第一次看到“hindsight”这个词,是在一个做Agent记忆系统的群里。有人丢了一张架构图,说“这玩意儿终于把Agent的长期记忆做成了可插拔的模块”。我当时的第一反应是ÿ… · 2026/11/4 15:17:08
带宽被谁吃光?终端用 bandwhich 快速定位指南 带宽被谁吃光?终端用 bandwhich 快速定位指南 【免费下载链接】bandwhich Terminal bandwidth utilization tool 项目地址: https://gitcode.com/gh_mirrors/ba/bandwhich
半夜,服务器出口带宽被顶满,你翻接口统计却查不到是谁干的。打… · 2026/11/4 15:57:52
Qwen3-VL-8B:如何用AI实现视觉推理与智能交互? Qwen3-VL-8B:如何用AI实现视觉推理与智能交互? 【免费下载链接】Qwen3-VL-8B-Thinking-unsloth-bnb-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/Qwen3-VL-8B-Thinking-unsloth-bnb-4bit
导语:Qwen3-VL-8B-Thinking模… · 2026/11/4 15:56:52
从零开始学AI22——集成学习 集成学习核心思想是“三个臭皮匠,顶个诸葛亮”,通过组合多个弱模型提升整体性能。三大流派:Bagging(如随机森林)并行训练、投票降方差,适合抗噪稳定场景;Boosting(如XGBoost… · 2026/11/4 15:55:51
Sill 音频管线深度剖析:AAC-ELD 128kbps 编码、10ms 分片与逐包漂移校正的精密同步机制 【免费下载链接】sill Any window from your Mac, live on your iPhone or iPad. Touch, Apple Pencil, trackpad and keys. Free, open source, no servers. 项目地址: https://gitcode.com/gh_mirrors/sill1/sill 点击查看 免费下载 Sill 是一款免费、开源的 Mac… · 2026/11/4 15:52:50
1.65 美元通关宝可梦:Awesome Decision Models 的 50 个决策模型游戏与 Demo 完整清单 【免费下载链接】awesome-decision-models A curated list of decision models (System One / typed decision models): hosted APIs, open-weight models, runtimes, SDKs, applications, benchmarks, and papers. 项目地址: https://gitcode.com/gh_mirrors/awes/… · 2026/11/4 15:51:50
Hermes Agent容器编排监控工具:Prometheus与Grafana配置 Hermes Agent容器编排监控工具:Prometheus与Grafana配置
Hermes Agent是一款功能强大的容器编排监控工具,能够帮助开发者和运维人员轻松实现对容器环境的全面监控。本文将详细介绍如何配置Prometheus与Grafana,以实现对Hermes Agent容器编排… · 2026/11/4 15:50:49
双极步进电机控制实战: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/4 3:16:49
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/4 6:59:29
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/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战: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/4 3:16:49
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/4 6:59:29
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/4 7:02:38