Skip to content

代码块 ​

代码块组件提供语言选择、语法高亮(highlight.js 按需动态加载,本地 chunk 无外网请求)、行内复制与编辑态切换。可通过 performance.syntaxHighlight 关闭高亮以减小包体积感知。

语言选为 Mermaid 图表 时,代码块升级为图表块:默认直接渲染图表(与 Vditor 行为一致),点「编辑源码」可切回源码编辑。渲染器(mermaid,打包进产物、不请求外网)是 import() 懒 chunk,只在首次渲染时按需加载。

图表块使用独立外观(白底卡片),不与深色代码框共用样式;工具栏提供独立的「图表」按钮,下拉可选流程图 / 时序图 / 甘特图 / 饼图 / 状态图 / 类图直接插入。

配置示例 ​

ts
new LarkDoc({
  element: '#editor',
  features: { codeBlocks: true, diagram: true },
  performance: { syntaxHighlight: true },  // false 时纯文本渲染
  toolbarKeys: ['insert'],                 // 图表入口在插入分组(斜杠命令 / 加号菜单搜「图表」)
  content: '<pre><code class="language-js">console.log("hi")</code></pre>',
})

配置与用法 ​

配置项类型默认值说明
features.codeBlocksbooleantrue关闭后代码块入口与命令不可用。
features.diagrambooleantrue关闭后语言下拉不再提供 Mermaid 图表,预览按钮与渲染器加载一并禁用;已有 mermaid 代码块退化为纯源码展示。
performance.diagramScriptUrlstring | nullnull逃生舱:显式给出一个自托管 mermaid UMD 地址时,改为运行时注入 <script data-lark-doc-diagram="mermaid"> 加载(DOM 里出现该标签即说明走了这条路)。默认 null 走 import() 懒 chunk,地址由打包器 / 脚本自身 URL 解析,内网无需配置。
performance.syntaxHighlightbooleantrue关闭后不做语法高亮。
blockMenu.disabled: ['codeBlock']string[][]禁用块菜单「转为代码块」。

数据契约 ​

代码块支持块级缩进,落库字段是 attrs.indent:

json
{ "type": "codeBlock", "attrs": { "language": "javascript", "indent": 2, "blockId": "b7f3k2m1" } }

导出 HTML 时写成 data-indent="2",消费方按 margin-left: 2 × 25px 还原即可;导入时读同一个属性。

缩进上限由前一个块决定,不是固定的绝对层级:飞书的块缩进本质是「成为上一个块的子块」,所以第一个块一级都缩不了,前一个块 2 级时后一个块最多到 3 级。到顶后所有入口都会停住——

入口到顶后的行为
工具栏「增加缩进」/ 气泡菜单按钮禁用,title 提示「当前内容块已达最大缩进层级」,再点不写事务
块句柄菜单「增加缩进」菜单项禁用,带「已达到最大缩进」提示
⌘] / Tab(列表)键盘事件被吞掉,层级不变
导入的 JSON / HTML挂载与 setContent 时一次性压回硬上限 5 级,不进撤销栈

减少缩进不受此限:只受 0 下限约束,可以一路减回文档开头。

limits.maxIndent 只能把上限调低(例如宿主只允许 3 级),设成 99 也还是 5。

使用方式 ​

入口操作
斜杠命令 / 插入菜单新建代码块;输入「图表」或 mermaid 可直接插入带示例源码的图表块。
工具栏「图表」按钮下拉选择图表类型(流程图 / 时序图 / 甘特图 / 饼图 / 状态图 / 类图),插入对应示例源码的图表块。
块句柄菜单「转为代码块」,正文与代码块互转。
语言选择代码块右上角切换语言,高亮随之更新;选 Mermaid 立即进入图表渲染。
块缩进块句柄菜单「增加缩进 / 减少缩进」或 ⌘] / ⌘[ 让整个代码框右移(不是框内文本),每级 25px;能缩多深由前一个块决定,减少缩进可以一路回到 0——与飞书一致。Tab 在代码块内仍是插入两个空格。
Markdown 输入行首输入 ``` + 语言名回车转换。
图表预览mermaid 块默认渲染图表且为独立白底卡片外观;块工具栏「编辑源码 / 预览图表」随时切换,渲染失败时自动显示源码便于修正。

图表渲染 ​

  • 支持 mermaid 语法(流程图、时序图、甘特图、饼图等),本地渲染,不请求外部服务。
  • 编辑源码后 300ms 防抖重新渲染;渲染失败(语法错误)时自动展开源码区并显示提示,源码始终保留。
  • 渲染器不参与首屏:mermaid 是 import() 懒 chunk,首次渲染时才下载对应区块(约 3.3MB raw,浏览器有缓存后几乎零成本),首屏体积零增加。布局上它被拆成独立区块,源码打包的宿主会再按自己的规则二次分包。
  • window.mermaid 已存在时直接复用,不再加载自己的副本(宿主已有 mermaid 可省这 3.3MB)。
  • securityLevel: 'strict',标签文本中的 HTML 会被转义,不执行脚本。

部署资源

渲染器在 JS 产物体系内,不是需要单独拷贝的运行时资源:

  • 按 exports 消费(webpack5 / vite / rollup):宿主打包器接管懒 chunk,零附加文件、零配置;
  • 预构建 dist 直引(CDN / 内网 Nginx / <script>):把 dist/ 整目录同位部署即可——publicPath: 'auto' 会按脚本自身 URL 找 lark-doc-element.umd.min.mermaid.js 等按需区块,放在任意子目录都成立;
  • CJS 入口(require('lark-doc')):LimitChunkCountPlugin 把 mermaid 内联进单文件,不存在附加区块;
  • 只有你自己想接管加载(例如已有 mermaid CDN 镜像)才需要配 performance.diagramScriptUrl。加载失败时预览层显示「图表渲染失败」,源码不受影响。

数据契约 ​

html
<pre><code class="language-js">…</code></pre>
  • JSON:{ type: 'codeBlock', attrs: { language: 'js' }, content: […] }。
  • 图表与普通代码块共用同一契约(language: 'mermaid'),源码即正文;导出 Markdown 输出 ```mermaid 围栏块,其他工具(如 Vditor)可直接消费。
  • 关闭 features.diagram 不影响已存数据——只是不再渲染预览。